Convert.ToString(Decimal,IFormatProvider)或String.Format

时间:2014-04-10 12:47:51

标签: c# cultureinfo iformatprovider

我已经看到问题Odd decimal type behavior for ToString(IFormatProvider)

这是我的测试代码

// Define an array of numbers to display.
double[] numbers = { -1.5345e16, -123.4321, 19092.123, 1.1734231911290e16 };
// Define the culture names used to display them.
string[] cultureNames = { "en-US", "fr-FR", "ja-JP", "ru-RU" };

foreach (double number in numbers)
{
    Console.WriteLine("{0}:", Convert.ToString(number,
                              System.Globalization.CultureInfo.InvariantCulture));
    foreach (string cultureName in cultureNames)
    {
        System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(cultureName);
        culture.NumberFormat.NumberGroupSizes = new int[] {2,2,3};
        culture.NumberFormat.NumberDecimalDigits = 5;
        Console.WriteLine(".ToString          {0}: {1,20}",
                          culture.Name, number.ToString("N", culture));
        Console.WriteLine("Convert.ToString   {0}: {1,20}", 
            culture.Name, Convert.ToString(number, culture));
    }
    Console.WriteLine();
}

,样本结果如下:

为什么Convert.ToString不应用格式?

enter image description here

这是使用Win7 Prof / VS2010 + SP1Rel(10.0.40219.1)

1 个答案:

答案 0 :(得分:4)

根据Convert.ToString(double, IFormatProvider)的文档:

  

此实现与Double.ToString(IFormatProvider)

相同

...然后documented为:

  

ToString(IFormatProvider)方法以指定文化的默认(“G”或一般)格式格式化Double值。

当您致电ToString时,您正在传递N - 如果您传入G,则会获得与Convert.ToString相同的结果。

G format specifier documentation州:

  

结果字符串受当前NumberFormatInfo对象的格式设置信息的影响。下表列出了控制结果字符串格式的NumberFormatInfo属性。

...并列出NegativeSignNumberDecimalSeparatorPositiveSign。您的代码没有设置任何这些属性,这就是为什么它没有什么区别。如果你写:

culture.NumberFormat.NumberDecimalSeparator = "#"
例如,

然后影响Convert.ToString的输出。