2013-03-01 9 views
5

に大きな数字リテラルを書く方法:私はこのような方法で持っているのC#

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; 
} 

正確な値は重要ではありません。重要なのは、それらが時々変更されるということです(接頭辞は描画に使用され、一部のテキスト領域は開発時にサイズが変更されます)。私はすべてのゼロを数えることなく、人間がそれを変更することによって容易に読みやすい方法でこれらのリテラルを書く方法を探しています。区切り記号は素晴らしいでしょう。私は11 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000と書くことを考えましたが、それはほんの僅かしか管理できません。 Math.Pow()を使用すると少し上手くなりますが、このような計算を使用して定数を定義するのは快適ではありません。

+0

光の速度は毎秒メートルでいいですが、piはひどく小さいです:-) –

答えて

15

あなたはintのための拡張メソッドを導入することができます

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

これらのメソッドの実装は簡単です:

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

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

// etc. 

大きな数字のための方法のための適切なデータ型を返すようにしてください:

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

不幸にも、サポートしたい整数型または浮動小数点型ごとにこれらのメソッドを記述します。

な拡張メソッドの完全なセットを持つことは、それだけですべてゼロ終わりではない場合でも、あなたはrelativly自然な方法で多数を表現できるようになる:

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

あなたは空想を取得したい場合は、

100.Billion(30.Thousand(300)) 

しかし、人々はパラメータが何を意味するのか疑問に思うので、表現力が失われると思います。

それでも、実装は次のようになります。これらの拡張メソッドを使用して

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

は一つの小さな欠点を持っていない:あなたの数字は、もはやコンパイル時定数です。実行時に計算されます。大多数の場合、これは問題ではありません。

+0

この構文はJavascriptでは機能しません。それはC#でですか? –

+0

@JanDvorak:そうです。それは拡張メソッドです。 –

+1

これを行うための非常にクールな方法。 – evanmcdonnal

19

11000000000000000000の代わりに11e18を使用できます。 mを使用して、それが小数であることを示します。したがって、11e18m

関連する問題