为什么TypeConverter不遵守文化?

时间:2017-03-10 13:45:11

标签: c# parsing

我有一个CSV阅读器,所以我有一个通用的投射方法。它,我这样做:

try
{
    TypeConverter converter = TypeDescriptor.GetConverter(type);
    if (converter != null)
    {
        result = converter.ConvertFromString(null, culture, value);
        return true;
    }

    result = type.GetDefault();
    return true;
}
catch
{
    result = type.GetDefault();
    return false;
}

但是,如果我通过:

输入:int

值:"123.024"

文化:de-DE

转换器始终失败并返回0,而不是正确地将.视为千位分隔符。

任何人都知道如何让它发挥作用?

1 个答案:

答案 0 :(得分:2)

因为Int32Converter在内部调用Int32.Parse,而Int32.Parse不支持传递给它的字符串中的千位分隔符。

更具体地说,Int32.Parse格式如下所述:

  

s参数包含以下形式的数字:

     

[WS] [符号]数字[WS]

     

方括号([和])中的项目是可选的。下表   描述每个元素。元素描述

     

ws可选的空格。

     

签署可选标志

     

digits一个从0到0的数字序列   9。

     

使用NumberStyles.Integer样式解释s参数。除了十进制数字,只有前导和尾随空格   允许带有前导标志。明确定义   可以出现在s中的样式元素,使用   Int32.Parse(String,NumberStyles)或   Int32.Parse(String,NumberStyles,IFormatProvider)方法。

     

使用为当前系统架构初始化的NumberFormatInfo对象中的格式化信息解析s参数。   有关更多信息,请参阅CurrentInfo。使用。解析字符串   格式化其他一些文化的信息,使用   Int32.Parse(String,NumberStyles,IFormatProvider)方法。

如果直接调用Int32.Parse,则可以调用接受NumberStyles枚举的重载并使用所需的标志创建复合值。 E.g:

Int32.Parse(value, NumberStyles.Integer | NumberStyles.AllowThousands);

但是,GetConverter()Int32Converter都无法覆盖NumberStyles的默认Int32.Parse,因此您需要int的特殊情况或者您必须确保传递给此函数的字符串不包含数千个分隔符。