aLongBoat
aLongBoat

Reputation: 59

Unity formatting multiple numbers

So I'm a complete newb to unity and c# and I'm trying to make my first mobile incremental game. I know how to format a variable from (e.g.) 1000 >>> 1k however I have several variables that can go up to decillion+ so I imagine having to check every variable's value seperately up to decillion+ will be quite inefficient. Being a newb I'm not sure how to go about it, maybe a for loop or something?

EDIT: I'm checking if x is greater than a certain value. For example if it's greater than 1,000, display 1k. If it's greater than 1,000,000, display 1m...etc etc

This is my current code for checking if x is greater than 1000 however I don't think copy pasting this against other values would be very efficient;

if (totalCash > 1000)

    {
        totalCashk = totalCash / 1000;
        totalCashTxt.text = "$" + totalCashk.ToString("F1") + "k";
    }  

Upvotes: 2

Views: 1782

Answers (1)

R2RT
R2RT

Reputation: 2146

So, I agree that copying code is not efficient. That's why people invented functions! How about simply wrapping your formatting into function, eg. named prettyCurrency?

So you can simply write:

totalCashTxt.text = prettyCurrency(totalCashk);

Also, instead of writing ton of ifs you can handle this case with logarithm with base of 10 to determine number of digits. Example in pure C# below:

using System.IO;
using System;

class Program
{
    // Very simple example, gonna throw exception for numbers bigger than 10^12
    static readonly string[] suffixes = {"", "k", "M", "G"};
    static string prettyCurrency(long cash, string prefix="$")
    {
        int k;
        if(cash == 0)
            k = 0;    // log10 of 0 is not valid
        else
            k = (int)(Math.Log10(cash) / 3); // get number of digits and divide by 3
        var dividor = Math.Pow(10,k*3);  // actual number we print
        var text = prefix + (cash/dividor).ToString("F1") + suffixes[k];
        return text;
    }

    static void Main()
    {
        Console.WriteLine(prettyCurrency(0));
        Console.WriteLine(prettyCurrency(333));
        Console.WriteLine(prettyCurrency(3145));
        Console.WriteLine(prettyCurrency(314512455));
        Console.WriteLine(prettyCurrency(31451242545));
    }
}

OUTPUT:

$0.0
$333.0
$3.1k
$314.5M
$31.5G

Also, you might think about introducing a new type, which implements this function as its ToString() overload.

EDIT: I forgot about 0 in input, now it is fixed. And indeed, as @Draco18s said in his comment nor int nor long will handle really big numbers, so you can either use external library like BigInteger or switch to double which will lose his precision when numbers becomes bigger and bigger. (e.g. 1000000000000000.0 + 1 might be equal to 1000000000000000.0). If you choose the latter you should change my function to handle numbers in range (0.0,1.0), for which log10 is negative.

Upvotes: 2

Related Questions