数字解析怪异
这行代码:
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.Parse
和Int32.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);
在这种情况下,逗号被解释为本地化的组分隔符号,并被忽略。 请参阅https://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 ,同样的事情:
上述就是C#学习教程:数字解析怪异分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
?Convert.ToDouble("23,23", System.Globalization.CultureInfo.InvariantCulture); 2323.0
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1035040.html