# [4.2 stable] How to shorten numbers using Technical fields

4.2 Stable

### Question

Hello Godot Forum. I started out Godot not long ago for a school project and I am having alot of fun. My game is sort of like a clicker game without a clicker. If you have ever played Earth Inc the mobile game i guess its sort of similar to that.

What I am trying to achieve is when you get an unbelievable ammount of coins I want to shorten it using Technical fields (According to google Gemini). Technical fields is the letter after the number in a big number. For example, 10,000 would equal to 10K. 104,000 would equal to 104K. Although when I get to the smaller number places. I want it to show a decimal. so for example, 1,045,400 would equal to 1.04M. I want this to be shortened to 2 decimal places no matter what.

I may be guessing the code could go into the _proccess function but idk

Any response would be greatly appreciated!

• sebashtioon

Good morning :). I thought a use of a snapped() would work here, but thinking about a logic feature I donâ€™t think so. Maybe a more manual job, something like:

``````extends Node

var number = 1_000_000
var formated_number = format_number(numero)

func format_number(n: int) -> String:
if n >= 1_000_000:
return str(float(n) / 1_000_000).replace(",", ".") + "kk"
elif n >= 1_000:
return str(float(n) / 1_000).replace(",", ".") + "k"
else:
return str(n)
``````

The Code was made by AI, but I donâ€™t think thereâ€™s anything wrong here, if there is you can tell me : )

1 Like

Where would I call format_number()? in process()?

Also, would n be the ammount of coins?

In your _process or whenever you update the currency value, without having an idea of how your script is doing itâ€™s hard to tell. And yes, N is the amount of coins (even this script only works up to 1kk so then youâ€™ll have to use logic and write up to which one you want)

One thing that I think is wrong with this is it only shortens trailing 0â€™s.
For example` 1000` gets shortened to` 1k` but` 1234` gets â€śshortenedâ€ť to `1.234k` (which is actually longer). One would prefer `1234` be `1.2k` and in the case of `1256` be `1.3k`.

The `snapped()` function seems to help us here:

`````` func format_number(n: int) -> String:
if n >= 1_000_000:
var i:float = snapped(float(n)/1000000, .01)
return str(i).replace(",", ".") + "kk"
elif n >= 1_000:
var i:float = snapped(float(n)/1000, .01)
return str(i).replace(",", ".") + "k"
else:
return str(n)
``````
1 Like

Hey this code looks like it worksâ€¦ although I am unsure of what â€śkkâ€ť is supposed to mean. Could you tell me how I would do this for Millions, Trillions, or just maybe suggest a system I could use (if you know what I mean)? Sorry im not exactly experienced at Godot could you explain it in simpler terms? Z â•ĄďąŹâ•Ą

1 Like

The â€śkkâ€ť case is how you would do this for millions (since 1 000 x 1 000 = 1 000 000). The logic is always the same, you only have to change two numbers to create a new case:

`````` func format_number(n: int) -> String:
if n >= 1_000_000_000_000:
# ran for every number <n> greater or equal to a trillion
var i:float = snapped(float(n)/1_000_000_000_000, .01)
return str(i).replace(",", ".") + "B"
elif n >= 1_000_000:
# ran for every number <n> smaller than 1 trillion BUT
# still greater or equal to 1 million
var i:float = snapped(float(n)/1_000_000, .01)
return str(i).replace(",", ".") + "M"
elif n >= 1_000:
# ran for every number <n> smaller than 1 million BUT
# still greater or equal to 1 thousand
var i:float = snapped(float(n)/1_000, .01)
return str(i).replace(",", ".") + "k"
else:
# ran otherwise
return str(n)
``````

(The underscores in the numbers are optional, they just make it easier to read)

3 Likes

Would I need to set n as my amount of coins? Because otherwise n woudnâ€™t have a value.

â€śn = coinsâ€ť just under function declaration?

How can I directly set this value to the coins variable in my script?

If your `coins` variable is a numeric variable then you canâ€™t directly have it carry the formatting. Numeric variables can only contain numbers.
Its only when you print out a variable that you can change its formatting.
`print(format_number(coins))`
If you want to set a label to show the number of coins:
`my_coin_label.text = format_number(coins)`

It seems though that you need to understand the basics of programming a little better.
Muddling through can only get you so far. I recommend reviewing a GDScript tutorial.

2 Likes

Thank you everyone

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.