1

我已经看到了问题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 不应用该格式?

在此处输入图像描述

这是 Win7 Prof/VS2010+SP1Rel (10.0.40219.1)

4

1 回答 1

4

根据以下文档Convert.ToString(double, IFormatProvider)

此实现与 Double.ToString(IFormatProvider) 相同

...然后记录为:

ToString(IFormatProvider) 方法以指定区域性的默认(“G”或通用)格式格式化 Double 值。

当您调用 时ToString,您正在传递N- 如果您G改为传递,您将获得与 相同的结果Convert.ToString

G格式说明符文档指出:

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

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

culture.NumberFormat.NumberDecimalSeparator = "#"

例如,那影响Convert.ToString.

于 2014-04-10T12:58:05.947 回答