一种在C#中编写大数字文字的方法

时间:2013-03-01 09:23:01

标签: c# numbers decimal literals

我有这样的方法:

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()可以做得更好,但我不习惯使用这样的计算来定义常量。

2 个答案:

答案 0 :(得分:21)

您可以使用11000000000000000000代替11e18。使用m表示它是小数,因此11e18m

答案 1 :(得分: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;
}

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