2015-06-23 17 views
6

Ich benutze Unity, um ein "Incremental Game" auch als "Idle Game" bekannt zu machen, und ich versuche, große Zahlen zu formatieren. Zum Beispiel, wenn gold 1000 oder mehr zu sagen bekommt, wird es als Gold: 1k anstelle von Gold: 1000 angezeigt.Formatieren von großen Zahlen in C#

using UnityEngine; 
using System.Collections; 

public class Click : MonoBehaviour { 

    public UnityEngine.UI.Text GoldDisplay; 
    public UnityEngine.UI.Text GPC; 
    public double gold = 0.0; 
    public int gpc = 1; 

    void Update(){ 
     GoldDisplay.text = "Gold: " + gold.ToString ("#,#"); 
     //Following is attempt at changing 10,000,000 to 10.0M 
     if (gold >= 10000000) { 
     GoldDisplay.text = "Gold: " + gold.ToString ("#,#M"); 
     } 
     GPC.text = "GPC: " + gpc; 
    } 

    public void Clicked(){ 
      gold += gpc; 
    } 
} 

Ich habe andere Beispiele versucht, während der Suche online, das ist, wo gold.ToString ("#,#"); herkam, aber keiner von ihnen arbeitete.

+3

'gold.ToString' ein Ergebnis zu wissen gibt, nicht ändern es nicht' Gold'. Du musst etwas wie 'GoldDisplay.text = "Gold:" + gold.ToString ("#, #"); ' – Blorgbeard

+0

Wie groß wird diese Goldzahl? Sag Quadrillionen? – Zze

+2

Aber du wirst Probleme mit 'int' für ein leeres Spiel haben. Der Maximalwert beträgt 2 Milliarden. – Blorgbeard

Antwort

1

Ich verwende diese Methode in meinem Projekt, die Sie auch verwenden können. Vielleicht gibt es einen besseren Weg, ich weiß es nicht.

public void KMBMaker(Text txt, double num) 
    { 
     if(num < 1000) 
     { 
      double numStr = num; 
      txt.text = numStr.ToString() + ""; 
     } 
     else if(num < 1000000) 
     { 
      double numStr = num/1000; 
      txt.text = numStr.ToString() + "K"; 
     } 
     else if(num < 1000000000) 
     { 
      double numStr = num/1000000; 
      txt.text = numStr.ToString() + "M"; 
     } 
     else 
     { 
      double numStr = num/1000000000; 
      txt.text = numStr.ToString() + "B"; 
     } 
    } 

und verwenden Sie diese Methode in Ihrem Update wie folgt.

void Update() 
{ 
    KMBMaker(GoldDisplay.text, gold); 
} 
3

Ich glaube nicht, es ist ein Build-in-Verfahren für das so neu erfunden i nur vielleicht das Rad durch meine eigene Art und Weise zu schreiben, aber dies sollte sein, wie ich es vielleicht tun würde

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      for (double i = 500d; i < 5e23; i *= 100d) 
      { 
       Console.WriteLine(i.ToMyNumber()); 
      } 

      Console.Read(); 
     } 

    } 

    public static class helper 
    { 
     private static readonly List<string> myNum; 

     static helper() 
     { 
      myNum = new List<string>(); 
      myNum.Add(""); 
      myNum.Add("kilo"); 
      myNum.Add("mill"); 
      myNum.Add("bill"); 
      myNum.Add("tril"); 
      myNum.Add("quad"); 
      myNum.Add("quin"); 
      myNum.Add("sext"); 
      // .... 
     } 

     public static string ToMyNumber(this double value) 
     { 
      string initValue = value.ToString(); 
      int num = 0; 
      while (value >= 1000d) 
      { 
       num++; 
       value /= 1000d; 
      } 

      return string.Format("{0} {1} ({2})", value, myNum[num], initValue); 
     } 
    } 
} 

, die diese drucken

500 (500) 
50 kilo (50000) 
5 mill (5000000) 
500 mill (500000000) 
50 bill (50000000000) 
5 tril (5000000000000) 
500 tril (500000000000000) 
50 quad (5E+16) 
5 quin (5E+18) 
500 quin (5E+20) 
50 sext (5E+22) 
5

Leichte Refactoring:

public static string KMBMaker(double num) 
{ 
    double numStr; 
    string suffix; 
    if(num < 1000d) 
    { 
     numStr = num; 
     suffix = ""; 
    } 
    else if(num < 1000000d) 
    { 
     numStr = num/1000d; 
     suffix = "K"; 
    } 
    else if(num < 1000000000d) 
    { 
     numStr = num/1000000d; 
     suffix = "M"; 
    } 
    else 
    { 
     numStr = num/1000000000d; 
     suffix = "B"; 
    } 
    return numStr.ToString() + suffix; 
} 

Verwendung:

GoldDisplay.text = KMBMaker(gold); 

Änderungen:

  1. Explizit verwenden double Konstanten
  2. Remov e Vervielfältigung
  3. Separate betrifft - da für diese Methode keine Notwendigkeit, über Textfelder
+0

Danke Mann, das ist besser als meine Idee :) –

+0

Tipp für Leute, die hassen, 0 zu zählen, wie ich es tue und/oder in noch größere Suffixe gehen möchte. Die Werte können auch durch wissenschaftliche Notation ersetzt werden, aka 1000 = 1e3d 1000000 = 1e6d und so weiter –

Verwandte Themen