我正在尝试实现一个数字转换器,它接受一个对象并将其转换为所需的类型。
我发现了一个问题:当我用“en-US”文化测试“1,5”时Convert.ToSingle和Convert.Double只返回“15”而不是抛出一个异常,它无法转换这个值,我实际上期望因为“1,5”无效。
有谁知道为什么?
答案 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 - 例如,您可以明确接受/拒绝组分隔符。