使用“en-US”文化作品将无效字符串“1,5”转换为Single

时间:2012-10-19 12:04:33

标签: c# converter

我正在尝试实现一个数字转换器,它接受一个对象并将其转换为所需的类型。

我发现了一个问题:当我用“en-US”文化测试“1,5”时Convert.ToSingle和Convert.Double只返回“15”而不是抛出一个异常,它无法转换这个值,我实际上期望因为“1,5”无效。

有谁知道为什么?

4 个答案:

答案 0 :(得分:3)

不,"1,5"完全有效。与"1,500"解析1500的方式类似。基本上,解析时会忽略组分隔符(en-US中的,)。

如果您不希望它这样做,请指定NumberStyles

int i = int.Parse("1,5", NumberStyles.Integer);

请注意,这是[Flags]枚举,重要的是我不包括AllowThousands。另一种方法可能是:

int i = int.Parse("1,5", NumberStyles.Any & ~ NumberStyles.AllowThousands);

允许组分隔符之外的所有内容。当然,"1,500"现在会失败。

答案 1 :(得分:1)

如果您指定例如,它将起作用俄罗斯文化 - ru-RU,但使用en-US你应该使用dot。

答案 2 :(得分:1)

这是因为逗号是一个有效的组分隔符(它用于表示数千个)。

因此,虽然“1,5”对说英语的人没有意义,但解析会忽略逗号,因此该值被视为“15”。

答案 3 :(得分:1)

逗号是en-US的千位分隔符,因此被接受。

而不是ToDouble()ToSingle()使用Double.TryParse()Single.TryParse(),这些函数有一个额外的style参数,可以更好地控制接受哪些格式/拒绝 - 请参阅列表here - 例如,您可以明确接受/拒绝组分隔符。