5

我有这样的方法:

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()它会更好一些,但我不喜欢使用这样的计算来定义常量。

4

2 回答 2

22

而不是11000000000000000000你可以使用11e18. 用来m表示它是一个小数,所以11e18m.

于 2013-03-01T09:25:38.443 回答
16

您可以为 引入扩展方法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;
}

不幸的是,您将不得不为您想要支持的每种整数或浮点类型编写这些方法。

拥有一整套这样的扩展方法可以让你以相对自然的方式表达你的大数,即使最后不只是全零:

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

使用这些扩展方法有一点缺点:您的数字不再是编译时常量。它们是在运行时计算的。在绝大多数情况下,这应该不是问题。

于 2013-03-01T09:26:43.593 回答