1

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

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

有谁知道为什么?

4

4 回答 4

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"现在会失败。

于 2012-10-19T12:07:20.783 回答
1

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

于 2012-10-19T12:07:01.180 回答
1

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

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

于 2012-10-19T12:07:44.177 回答
1

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

代替ToDouble()orToSingle()使用Double.TryParse()or Single.TryParse(),这些函数有一个附加style参数,可以更好地控制接受/拒绝哪些格式 - 请参见此处的列表- 例如,您可以明确接受/拒绝组分隔符。

于 2012-10-19T12:10:24.477 回答