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

本文关键字:数字 文字 方法 一种 | 更新日期: 2023-09-27 18:01:37

我有一个这样的方法:

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()稍微好一点,但是我不习惯使用这样的计算来定义常数。

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

可以用11e18代替11000000000000000000。使用m表示它是一个小数,所以11e18m .

您可以为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;
}

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

c# 7.0中引入的一个语言特性是在数字文字内部引入_作为数字分隔符,因此您可以用50_000_000代替50000000

https://devblogs.microsoft.com/dotnet/new-features-in-c-7-0/literal-improvements

对于非常大的数字,或者如果使用科学记数法处理数字,Sjoerd给出的解决方案可能是更好的选择。