c#如何String.Format十进制无限小数位?

时间:2011-10-17 14:23:43

标签: c#

我需要将十进制数转换为带有千组和无限(可变)十进制数的格式化字符串:


    1234 -> "1,234"
    1234.567 -> "1,234.567"
    1234.1234567890123456789 -> "1,234.1234567890123456789"

我尝试了 String.Format(“{0:#,#。#}”,十进制),但它将任意数字修剪为最多1位小数。

3 个答案:

答案 0 :(得分:17)

您可以多次使用#(请参阅Custom Numeric Format Strings):

string.Format("{0:#,#.#############################}", decimalValue)

或者,如果您只是直接格式化数字,也可以使用格式字符串decimal.ToString

但是,无法包含“无限十进制数”。如果没有支持任意精度浮点数的库(例如,使用BigFloat中的Extreme Numerics之类的东西),最终会遇到精度问题。即使decimal type也有其精度限制(28-29位有效数字)。除此之外,你还会遇到其他问题。

答案 1 :(得分:5)

正如我所说,十进制类型的精度为28-29位。

decimal mon = 1234.12345678901234567890123M;
var monStr = mon.ToString("#,0.##############################");
var monStr2 = String.Format("{0:#,0.##############################}", mon);

此处小数点分隔符后面有30x #: - )

我已使用#更改了一个0,因此0.15不会写为.15

答案 2 :(得分:1)

这应该可以解决问题

string DecimalToDecimalsString(decimal input_num)
        {            
            decimal d_integer = Math.Truncate(input_num); // = 1234,0000...
            decimal d_decimals = input_num-d_integer; // = 0,5678...

            while (Math.Truncate(d_decimals) != d_decimals)
                d_decimals *= 10; //remove decimals

            string s_integer = String.Format("{0:#,#}", d_integer);
            string s_decimals = String.Format("{0:#}", d_decimals);

            return s_integer + "." + s_decimals;
        }

用其他类型替换十进制也应该有用。