数字解析怪异

这行代码:

Console.WriteLine(Convert.ToInt32(“23,23”) + 1); 

抛出exception。 这行代码:

 Console.WriteLine(Convert.ToDouble(“23,23”) + 1); 

打印2324。

有人知道为什么会这样吗? 我不认为第二次转换会有什么好处。

从System.Double.Parse的MSDN文档 :

s参数可以包含以下forms的字符串:

[ws][sign][integral-digits[,]]integral-digits[.[fractional-digits]][e[sign]exponential-digits][ws]

这里,逗号( , )代表“[a]特定于文化的千位分隔符号”。

总结一下:如果当前文化的千位分隔符符号出现在字符串中的任何位置, Double.Parse会忽略它(由Convert.ToDouble内部调用)。


另一方面, Int32.Parse(string)不允许字符串中有数千个分隔符:

 [ws][sign]digits[ws] 

这就是你的第一个例子抛出exception的原因。 您可以通过使用允许您指定NumberStyles的重载来更改Double.ParseInt32.Parse的此行为,如其他答案所述。

第一个失败,因为int.Parse默认情况下不允许千位分隔符。 您可以使用NumberStyles更改它:

 int d = int.Parse("11,23", NumberStyles.AllowThousands, CultureInfo.InvariantCulture); 

现在它就像双版本一样 ,默认支持千位分隔符。 它们可能是成功的,因为“,”当被解析器视为千位分隔符时被完全忽略 – 即使逗号有时作为千位分隔符没有意义。

令人惊讶的是,即便如此:

 double d = double.Parse("1,,1,2,3", CultureInfo.InvariantCulture); 

在上面,d被设置为值1123.0。

 Console.WriteLine(Convert.ToDouble(“23,23”) + 1); 

在这种情况下,逗号被解释为本地化的组分隔符号,并被忽略。 请参阅http://msdn.microsoft.com/en-us/library/fd84bdyt.aspx 。

 Console.WriteLine(Convert.ToInt32(“23,23”) + 1); 

在这种情况下,您使用的是Int32.Parse ,默认情况下不支持组分隔符。

这背后的原因是整数转换器默认没有本地化支持,因为本地化增加了额外的开销,并且没有理由将它添加到不需要与任何符号交互的解析器。 但是,您可以使用一些额外的参数强制解析器支持本地化:

 int.Parse("11,23", NumberStyles.AllowThousands, CultureInfo.InvariantCulture); 

另一方面,浮点/双转换必须支持小数分隔符。 在某些文化中,这是"," ,在其他文化中,它可以是" ""." 。 由于该function必须支持本地化,因此默认情况下仅支持某些本地化function是没有意义的。 否则,实现会使那些期望由于小数分隔符支持本地化的人感到困惑,它也支持其他本地化方面。

在转换为double时忽略逗号。 如果您希望逗号生成错误,则可以使用Double.Parse(string,System.Globalization.NumberStyles)方法。

因为double假设逗号是千位分隔符,并忽略它。 Int32转换不会这样做。

 ?double.Parse("23,23", System.Globalization.CultureInfo.InstalledUICulture); 23.23 ?double.Parse("23,23", new System.Globalization.CultureInfo("en-US")); 2323.0 ?double.Parse("23,23", new System.Globalization.CultureInfo("fr-FR")); 23.23 ?double.Parse("23,23", System.Globalization.CultureInfo.InvariantCulture); 2323.0 

对于Convert.ToDouble ,同样的事情:

 ?Convert.ToDouble("23,23", System.Globalization.CultureInfo.InvariantCulture); 2323.0