String.Format具有无限精度和至少2个十进制数字

时间:2017-09-13 16:15:51

标签: c# .net formatting string-formatting

我正在为一些非常挑剔数字准确性的人开发一个应用程序(他们正在处理会计和非常准确的电信变量)。出于这个原因,我到处都使用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寻找数字字符串格式。我找到了这个有用的资源Standard Numeric Formats,但我的尝试都没有按预期工作(N,N2,F,F2,G,G2等等,我尝试了各种组合,即使我不相信它们^^ - 我甚至尝试一些F2#的乐趣。

我的结论是没有内置的格式来做我想要的。 从右吗

所以我查看了下一章Custom Numeric Formats。但我找不到适合我需要的组合。所以我去了SO并找到了很多关于它的问题(12,等等。)

这些问题让我担心唯一的解决方案就是这个问题:#,##0.00#######有尽可能多的尾随#,因为我需要精确度。

我是对的吗?

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

3 个答案:

答案 0 :(得分:2)

这可能就是你要找的东西:

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

当你调用它时,在小数点上执行ToString(),并在需要时将结果转换回小数。

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

enter image description here

基于this SO answer

答案 1 :(得分:1)

我创建了一个小函数:它根据它的小数位数来格式化数字:

    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

答案 2 :(得分:0)

如果您想要完全控制格式,可以为小数实现自己的IFormatProvider。在其中你可以使用StringBuilder并做任何你需要的事情,没有string.Format()。

的限制