C# 字符串。具有无限精度和至少2位小数的格式

C# 字符串。具有无限精度和至少2位小数的格式,c#,.net,formatting,string-formatting,C#,.net,Formatting,String Formatting,我正在为一些对数字准确性非常挑剔的家伙开发一个应用程序(他们正在处理会计和非常精确的电信变量)。因此,我在任何地方都使用decimal类型,因为float和double类型不合适(请毫不犹豫地将我重定向到现有的更好的数据类型) 当我需要格式化这些数字时,我的问题就来了。要求根据需要显示尽可能多的十进制数字,但至少要显示2位,并使用组分隔符表示千位 例如: Value Formatted 1 1.00 1000 1,000.00 1.5

我正在为一些对数字准确性非常挑剔的家伙开发一个应用程序(他们正在处理会计和非常精确的电信变量)。因此,我在任何地方都使用
decimal
类型,因为float和double类型不合适(请毫不犹豫地将我重定向到现有的更好的数据类型)

当我需要格式化这些数字时,我的问题就来了。要求根据需要显示尽可能多的十进制数字,但至少要显示2位,并使用组分隔符表示千位

例如:

Value       Formatted
1                1.00
1000         1,000.00
1.5              1.50
1000.355    1,000.355
0.000035     0.000035
所以我去了MSDN寻找数字字符串格式。我找到了这个有用的资源,但我的尝试都没有达到预期效果(N、N2、F、F2、G、G2等,我尝试了各种组合,即使我不相信它们^^-我甚至尝试了一些F2#来取乐)

我的结论是没有一个内置的格式来做我想做的事情对吗?

所以我看了下一章。但我找不到适合我需要的组合。所以我去了某地,发现了很多关于这个的问题(,等等)

这些问题让我担心,唯一的解决办法就是这个:
,#0.00#######
,根据我需要的精度设置尽可能多的尾随

我说得对吗?


我想用12#,我的人不会发现任何准确性问题,但我可能错过了我需要的神奇格式?

如果你想完全控制格式,你可以实现你自己的IFormatProvider,用于小数。在它里面,您可以使用StringBuilder,在不受string.Format()限制的情况下执行任何需要的操作。

这可能就是您想要的:

static string FormatNumber(string input)
{
    var dec = decimal.Parse(input);
    var bits = decimal.GetBits(dec);
    var prec = bits[3] >> 16 & 255;
    if (prec < 2)
        prec = 2;
    return dec.ToString("N" + prec);
}
静态字符串格式编号(字符串输入)
{
var dec=decimal.Parse(输入);
变量位=十进制。获取位(十进制);
var prec=位[3]>>16&255;
if(prec<2)
prec=2;
返回12月至字符串(“N”+prec);
}
调用它时,对小数执行
ToString()
,并根据需要将结果转换回小数

我尝试了你的示例数字,结果是:


基于。

我创建了一个小函数:它根据小数位数设置数字格式:

    public static void Main()
    {
        decimal theValue;
        theValue = 0.000035M;
        Console.WriteLine(theFormat(theValue));
        theValue = 1.5M;
        Console.WriteLine(theFormat(theValue));
        theValue = 1;
        Console.WriteLine(theFormat(theValue));                 
    }
    public static decimal theFormat(decimal theValue){
        int count = BitConverter.GetBytes(decimal.GetBits(theValue)[3])[2];
        return count > 1?theValue:Convert.ToDecimal(string.Format("{0:F2}", theValue));
    }
这将产生以下输出:

0.000035
1.50
1.00