这行代码:
Console.WriteLine(Convert.ToInt32(“23,23”) + 1);
Run Code Online (Sandbox Code Playgroud)
引发异常.这行代码:
Console.WriteLine(Convert.ToDouble(“23,23”) + 1);
Run Code Online (Sandbox Code Playgroud)
打印2324.
有人知道为什么会这样吗?我不认为第二次转换会带来任何好处.
Hei*_*nzi 14
s参数可以包含以下形式的字符串:
[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]
Run Code Online (Sandbox Code Playgroud)
这就是你的第一个例子抛出异常的原因.您可以更改这两种行为,Double.Parse并Int32.Parse使用允许您指定的重载NumberStyles,如其他答案所述.
第一个失败,因为int.Parse默认情况下不允许千位分隔符.您可以使用NumberStyles更改它:
int d = int.Parse("11,23",
NumberStyles.AllowThousands,
CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
现在它就像双版本一样,默认支持千位分隔符.它们可能成功,因为","被解析器视为千位分隔符时被完全忽略 - 即使逗号有时作为千位分隔符没有意义.
令人惊讶的是,即便如此:
double d = double.Parse("1,,1,2,3", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
在上面,d被设置为值1123.0.
Console.WriteLine(Convert.ToDouble(“23,23”) + 1);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,逗号被解释为本地化的组分隔符号,并被忽略.请参阅http://msdn.microsoft.com/en-us/library/fd84bdyt.aspx.
Console.WriteLine(Convert.ToInt32(“23,23”) + 1);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您正在使用Int32.Parse,默认情况下不支持组分隔符.
这背后的原因是整数转换器默认没有本地化支持,因为本地化增加了额外的开销,并且没有理由将它添加到不需要与任何符号交互的解析器.但是,您可以通过一些额外的参数强制解析器支持本地化:
int.Parse("11,23", NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
另一方面,浮点/双转换必须支持小数分隔符.在某些文化中",",在其他文化中,它可以是" "或".".由于该功能必须支持本地化,因此默认情况下仅支持某些本地化功能是没有意义的.否则,实现会混淆那些期望由于小数分隔符支持本地化的人,它也会支持其他本地化方面.