为什么是十进制.TryParse成功解析了类似12,2,2,2的内容
本文关键字:十进制 TryParse 成功 为什么 | 更新日期: 2023-09-27 18:22:27
如果我执行以下操作:
string teststring = "12,2,2,2";
decimal testdecimal;
decimal.TryParse(teststring, out testdecimal)
这是有效的,testdecimal最终为12222。
这种解析不应该合理地/逻辑地失败吗?我惊讶地发现它起了作用,并好奇它背后的逻辑是什么。
默认情况下,TryParse()
允许组分隔符,在您的国家/地区为,
。
要防止这种情况发生,请传递一个不包括NumberStyles.AllowThousands
的NumberStyles
。
默认为:
Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |
AllowDecimalPoint | AllowThousands,
源
这是因为使用了数字组分隔符。在处理货币类型时,通常使用千分隔符。Decimal.TryParse将逗号视为千分隔符,并无论如何对其进行解析。但是,您必须注意,这种方法对文化敏感。例如,如果当前区域性设置为土耳其语,TryParse将不会成功,因为在土耳其文中,,
是小数点,而不是千位分隔符。
var d1 = Decimal.Parse("1,23,25"); //parse is successful
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr");
d1 = Decimal.Parse("1,23,45"); //throws exception
您的区域性设置将,
作为千位分隔符。由于千位分隔符纯粹用于视觉提示,并且不提供任何有关数字的重要信息,因此decimal.TryParse
只是忽略千位分隔符号。
这是因为Decimal解析使用了数千分隔符。如果你想禁止使用数千个分隔符,你可以删除这个标志,如下所示:
Decimal.Parse("12,2,2,2", NumberStyles.Number ^ NumberStyles.AllowThousands)
这将引发InvalidFormatException