0 votes

Hi everyone,

with my number-pad I can put digits in my RichTextLabel as well as one single comma wherever I want it, and I can erase single positions for corrections.
The numbers are being put into another Label simultaneously as well, but not the comma, because I want to use the entered numbers as full integers for backend calculations. So the comma-button simply is not connected to that Label at all. That comma is basically just decoration, it could be any symbol really...

Naturally, with the comma not appearing in my "backend"-Label, erasing it in the RichTextLabel will erase the next digit. So what I'm trying to achieve is my backend-Label to do nothing when the comma is being erased in the RichTextLabel.

I connected my erase-button with the RichTextLabel

var linetext = get_node(rich_text_label).text
get_node(rich_text_label).text = linetext

and the backend-Label

var linetext2 = get_node(back_end_numbers).text
get_node(back_end_numbers).text = linetext2

and I can work with comma and no-comma like this:

var comma = linetext.find(",")
if comma >= 1:
if comma <= 0:

I was trying to have the backend-Label not react with all kinds of variables back and forth, but if I could at least make it not erase a number along with the comma, I couldn't make it continue erasing afterwards again, and I'm at a loss here.

What could be a good way to "pause when the comma is being erased"? I thought that a "thecommaisbeingerased"-signal from within the RichTextLabel could do the trick (--> if the signal fires: return, otherwise: do your erasing...).

How could I set up such a Signal? Or is there another simple way to achieve this?
Any help is much appreciated.

Just a thought: it would be neat if the entered numbers could be copied into the backend-label when confirming (there's a confirm button), just without the comma. Maybe that would be an easier way... how could that be done?

Godot version 3.2.3
in Engine by (313 points)
edited by

1 Answer

0 votes
Best answer

Yeah, I couldn't really get it until your Edit :). This is definitetly easier with string operators like erase, lstrip and rstrip.
it should go like this :

var formattedtext = linetext.rstrip(",")

Just check String in help documentation, there are more functions that allow to reshape strings like this. Especially if You want to recognize trails of characters inbetween commas.

However I don't really get it, why didn't You use your comma seeking module ( string.find) in if statement just above and use use one source text instead of two texts :

var linetext = getnode(richtextlabel).text
if linetext.find(",") == linetext.length()-1 :
node(backendnumbers).text = linetext
......getnode(richtextlabel).text = linetext
node(backendnumbers).text = linetext
......getnode(richtext_label).text = linetext

So backlabel would simply erase last character unless last character in mainlabel is a comma

by (1,110 points)
selected by

Hehe it is not so easy, good :)

So I have just learnt, that rstrip sucks since any characters from specified site ( left or right ) will block the stripping :)

So the new thing is replace() :P :

last line :
getnode(backendlabel).text = linetext.replace(",","")

syntax looks ridicolous :). First argument is character to be replaced, another is empty string :)

...aaaand we have a winner! Thanks a million!

Too bad rstrip sucks *; )* However, the string class seems to be full of little wonders. Especially that PoolStringArray split is interesting... if I may I might come back to you with a following question in this context of my versatile label.

So I'm proceeding on my way of distributing text.

I added two RichTextLabels: PreCommaDigits and PostCommaDigits (and I'd like the numbers before the comma to appear in the first one and those behind the comma in the other one). They're connected to my entry-Label via

export (NodePath) var pre_comma_digits
export (NodePath) var post_comma_digits

I thought that PoolStringArray split is what I'm looking for and indeed, this works:

var leftandrightofcomma = text.split(",", true, 1)

get_node(pre_comma_digits).text = leftandrightofcomma[0]
get_node(post_comma_digits).text = leftandrightofcomma[1]

Well, at least [0] does. [1] crashes on me with Invalid get index '1' (on base: 'PoolStringArray').. I thought that this is according to the example in the docs... do you have any idea what I'm missing here?

Well it seems it is another imperfect built-in function. Middle argument doesn't work, it doesn't allow empty strings and because of that, when your text ends with comma, resulting split array has only one string. So it has to be fixed with additional statement :

var leftandrightofcomma = text.split(",", true, 1)
get_node(pre_comma_digits).text = leftandrightofcomma[0]
if leftandrightofcomma.size() > 1:
        get_node(post_comma_digits).text = leftandrightofcomma[1]
        get_node(post_comma_digits).text = ""

I hope You are planning on having only one maximum comma in main label ? :P And that main text will never start with comma ? :P

I hope You are planning on having only one maximum comma in main
label ? :P And that main text will never start with comma ? :P

--> exactly this! I'm always impressed how pros like you just see such potential issues I'd only realize when things break down... ; )

I've been trying around with some if-clauses as well but couldn't come up with your idea - which works perfectly!

You're the hero of the week, thanks so much for your help!

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.