如何使用TypeConverter将特定于文化的双精度数转换?

5
我有一个关于TypeConverter类的问题。它可以很好地处理CultureInvariant值,但无法转换特定文化,例如英语千位分隔符。以下是一个小测试程序,我无法使其正常工作。
这里是问题所在 :) - ConvertFromString抛出一个异常,消息为"2,999.95不是Double类型的有效值",内部异常为"输入字符串格式不正确"。
using System;
using System.Globalization;
using System.ComponentModel;

class Program
{
    static void Main()
    {
        try
        {
            var culture = new CultureInfo("en");
            var typeConverter = TypeDescriptor.GetConverter(typeof(double));
            double value = (double)typeConverter.ConvertFromString(
                null, 
                culture, 
                "2,999.95");

            Console.WriteLine("Value: " + value);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

编辑: 在Connect上的错误报告链接。


什么没有起作用?你遇到了什么错误? - Oded
ConvertFromString 抛出异常:"2,999.95 不是 Double 的有效值。" - Christian
1个回答

6
TypeDescriptor.GetConverter(typeof(double)) 获取的 DoubleConverter 最终会使用以下参数调用 Double.Parse:
Double.Parse(
    "2,999.95", 
    NumberStyles.Float, 
    (IFormatProvider)culture.GetFormat(typeof(NumberFormatInfo)));

问题在于NumberStyles.Float不允许使用千位分隔符,这就是为什么会出现问题的原因。您可以将此提交到Microsoft Connect或查看是否有其他人遇到了相同的问题。
如果同时使用NumberStyles.AllowThousands调用Double.Parse,则问题将不会发生。
Double.Parse(
    "2,999.95", 
    NumberStyles.Float | NumberStyles.AllowThousands, 
    (IFormatProvider)culture.GetFormat(typeof(NumberFormatInfo)));

但是这个例子更接近于使用没有任何NumberStyles的Double.Parse,在这种情况下,Double.Parse将起作用。已经将其提交为Connect上的一个错误。感谢您的反馈。 - Christian
@Christian,如果您不介意的话,能否更新您的问题并添加到 Connect 问题链接? - João Angelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接