我正在尝试实现一个数字转换器,它接受一个对象并将其转换为所需的类型。
但是我发现了一个问题:当我用“en-US”文化测试“1,5”时,Convert.ToSingle 和 Convert.Double 只是返回“15”而不是抛出一个它不能转换这个值的异常,我实际上会这样期望因为“1,5”无效。
有谁知道为什么?
不,"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"
现在会失败。
如果您指定例如俄罗斯文化 - ru-RU,它将起作用,但使用 en-US 您应该使用点。
这是因为逗号是有效的组分隔符(用于表示千位)。
因此,虽然“1,5”对讲英语的人来说没有意义,但逗号会被解析忽略,因此该值被视为“15”。
逗号是 en-US 的千位分隔符,因此可以接受。
代替ToDouble()
orToSingle()
使用Double.TryParse()
or Single.TryParse()
,这些函数有一个附加style
参数,可以更好地控制接受/拒绝哪些格式 - 请参见此处的列表- 例如,您可以明确接受/拒绝组分隔符。