GUI Display in game cash help

Ok so I can get the users money to be displayed in the screen, change the text when the user reaches a certain amount of money but where I am having trouble is converting the amount for the respective symbols like Thousands (K) Millions (M) Billions (B). Since the players will be working with a high amount of money throughout the game, I believe this method would work the best for reading how much money you have and since I cannot figure out how to display 10,000,000 without unity having it say 1E+07.

Lets say the player has $900M ($900 Million) then they gain $100M and now they have $1000M or $1B ($1 Billion). How would I go about displaying the number 1000 as 1 or 1789 as 1.789 but have it still acting like 1000 or 1789?

I’ll put my test code in here for a reference as to what I have so far. It works but I just can’t figure out the conversion part of it so I have nothing for that in there.

C# Code
using UnityEngine;
using System.Collections;

public class UpgradeWindow : MonoBehaviour {

	public GUIStyle myStyle;

	void OnGUI ()
	{
		if(GameControl.control.cash1 < 1000f)
		{

		    GUI.Label (new Rect (60, 60, 100, 30), "Cash: $ " + GameControl.control.cash1 + " M", myStyle);

		} 
		else if(GameControl.control.cash1 >= 1000f)
		{

			GUI.Label (new Rect (60, 60, 100, 30), "Cash: $ " + GameControl.control.cash1 + " B", myStyle);

		}

		if(GUI.Button(new Rect(100, 200, 200, 60), "Upgrade", myStyle))
		{

			GameControl.control.cash1 += 100.07f;

		}

		if(GUI.Button(new Rect(100, 300, 200, 60), "Degrade", myStyle))
		{

			GameControl.control.cash1 -= 100.06f;

		}

	}
}

EDIT

I ended up figuring it out but to me the code looks a bit messy.

I changed cash1 to 3 different variables and changed them to decimals instead of floats like this.

C# Code
GameControl Script

public decimal cashK1;
public decimal cashM1;
public decimal cashB1;

Then I made these changes to my code.

using UnityEngine;
using System.Collections;

public class UpgradeWindow : MonoBehaviour {

	public GUIStyle myStyle;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () 
	{
		if(GameControl.control.cashK1 < 0.00M)
		{
			GameControl.control.cashK1 = 0.00M;
			GameControl.control.cashM1 = 0.00M;
			GameControl.control.cashB1 = 0.00M;
             //the above code makes sure you cannot get a negative value
		}
	}

	void OnGUI ()
	{
		if(GameControl.control.cashK1 < 1000.00M)
		{

		    GUI.Label (new Rect (60, 60, 100, 30), "Cash: $ " + GameControl.control.cashK1 + " K", myStyle);

		} 
		if(GameControl.control.cashK1 >= 1000.00M && GameControl.control.cashK1 < 1000000.00M)
		{

			GUI.Label (new Rect (60, 60, 100, 30), "Cash: $ " + GameControl.control.cashM1 + " M", myStyle);

		}
		if(GameControl.control.cashK1 >= 1000000.00M)
		{
			
			GUI.Label (new Rect (60, 60, 100, 30), "Cash: $ " + GameControl.control.cashB1 + " B", myStyle);

		} 

		if(GUI.Button(new Rect(100, 200, 200, 60), "Upgrade", myStyle))
		{
                //Added all three decimal variables to always keep them equivalent to each other
			    GameControl.control.cashK1 += 50000.00M;

				GameControl.control.cashM1 += 50.00M;
				GameControl.control.cashB1 += 0.05M;

		}

		if(GUI.Button(new Rect(100, 300, 200, 60), "Degrade", myStyle))
		{

				GameControl.control.cashK1 -= 50000.00M;
				
				GameControl.control.cashM1 -= 50.00M;
				GameControl.control.cashB1 -= 0.05M;

		}

	}
}

If someone sees that I am using too much code and know how to shorten it, I would appreciate it.

Also sorry for asking a question then figuring out how to solve it before anyone can answer. It seems like the only time I can figure something I have been stuck on for a few days is to ask the question.

Maybe typing out my question helps me actually see what I am looking for?

Don’t store your amount of cash in three different variables - that’s just horrible! To display the amount of cash with the appropriate suffix, just create a new function like this:

static string FormatCash(long num)
{
if (num >= 100000000) {
    return (num / 1000000D).ToString("0.#M");
}
if (num >= 1000000) {
    return (num / 1000000D).ToString("0.##M");
}
if (num >= 100000) {
    return (num / 1000D).ToString("0.#k");
}
if (num >= 10000) {
    return (num / 1000D).ToString("0.##k");
}

return num.ToString("#,0");
}

(Note I’ve put your cash as a long - I doubt you want a decimal, and certainly not a float). Then, in all your OnGUI code, just call FormatCash(amountOfCash). This will return the following:

123        ->  123
1234       ->  1,234
12345      ->  12.35k
123456     ->  123.4k
1234567    ->  1.23M
12345678   ->  12.35M
123456789  ->  123.5M