2013-03-01 10 views
5

Ich habe eine Methode wie folgt aus:Ein Weg, um große Zahl Literale in C# zu schreiben

Prefix GetPrefix(decimal value) 
{ 
    if(value > 11000000000000000000) 
     return Prefix.CosmicBig; 
    if(value > 1000000000000000) 
     return Prefix.ReallyBig; 
    if(value > 3000000000000) 
     return Prefix.Big; 
    if(value > 50000000) 
     return Prefix.Okay; 
    if(value > 750000) 
     return Prefix.MostlyNormal; 
    if(value > 750000) 
     return Prefix.SoSo; 
    if(value > 750) 
     return Prefix.Small; 
    return Prefix.MiserablySmall; 
} 

Die genauen Werte sind nicht wichtig. Was zählt ist, dass sie manchmal geändert werden (die Präfixe werden zum Zeichnen verwendet und einige Textbereiche ändern ihre Größe in der Entwicklung). Ich suche nach einer Möglichkeit, diese Literale auf eine Weise zu schreiben, die leicht lesbar ist, wenn ein Mensch sie verändert, ohne alle Nullen zu zählen. Ein Trennzeichen wäre nett. Ich dachte daran, 11 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 zu schreiben, aber das ist nur kaum überschaubar. Mit Math.Pow() ist es ein wenig besser, aber ich bin nicht wohl mit solchen Berechnungen zu definieren, Konstanten.

+0

Die Lichtgeschwindigkeit in Metern pro Sekunde ist in Ordnung, aber Pi ist kläglich klein ... :-) –

Antwort

15

Sie können Erweiterungsmethoden für int vorstellen:

750.Thousand(); 
5.Million(); 
100.Billion(); 

Die Umsetzung dieser Methoden ist einfach:

public static int Thousand(this int value) 
{ 
    return value * 1000; 
} 

public static int Million(this int value) 
{ 
    return value.Thousand() * 1000; 
} 

// etc. 

Stellen Sie sicher, den entsprechenden Datentyp für Methoden für größere Zahlen zurückzukehren:

public static long Billion(this int value) 
{ 
    return value.Million() * 1000; 
} 

Leider werden Sie haben Schreiben Sie diese Methoden für jeden Integral- oder Gleitkommatyp, den Sie unterstützen möchten.

eine ganze Reihe solcher Erweiterungsmethoden Mit Ihnen erlauben würde, Ihre großen Zahlen in relativly natürlicher Art und Weise zum Ausdruck bringen, auch wenn es nicht nur alle Nullen am Ende:

100.Billion() + 30.Thousand() + 300 // == 100,000,030,300 

Wenn Sie Lust bekommen mögen, Sie könnten sogar darüber nachdenken, sie nisten:

100.Billion(30.Thousand(300)) 

Aber ich denke, dass einige Ausdruckskraft verlieren würde, weil die Leute würden sich fragen, was die Parameter bedeutet.

Dennoch würde die Umsetzung wie folgt aussehen:

public static long Billion(this int value, long add) 
{ 
    return value.Million() * 1000 + add; 
} 

Mit diesen Erweiterungsmethoden hat ein wenig Nachteil: Ihre Zahlen sind nicht mehr kompilieren-Zeitkonstanten. Sie werden zur Laufzeit berechnet. In den allermeisten Fällen sollte dies kein Problem darstellen.

+0

Diese Syntax würde in Javascript nicht funktionieren. Ist es in C#? –

+0

@ JanDvorak: Sicher. Das sind Erweiterungsmethoden. –

+1

Sehr cooler Weg dies zu tun. – evanmcdonnal

19

Anstelle von 11000000000000000000 können Sie 11e18 verwenden. Verwenden Sie m, um anzugeben, dass es sich um eine Dezimalzahl handelt, also 11e18m.

Verwandte Themen