C# 为什么decimal.TryParse成功地解析了类似12,2,2,2这样的东西
如果我这样做:C# 为什么decimal.TryParse成功地解析了类似12,2,2,2这样的东西,c#,parsing,decimal,C#,Parsing,Decimal,如果我这样做: string teststring = "12,2,2,2"; decimal testdecimal; decimal.TryParse(teststring, out testdecimal) 这是可行的,testdecimal最终为12222 这不应该在合理/逻辑上导致解析失败吗?我惊讶地看到它的工作原理,并好奇它背后的逻辑是什么,允许这样做。这是因为十进制解析使用了数千分隔符。如果不允许使用数千个分隔符,只需删除该标志,如下所示: Decimal.Parse("12,2
string teststring = "12,2,2,2";
decimal testdecimal;
decimal.TryParse(teststring, out testdecimal)
这是可行的,testdecimal最终为12222
这不应该在合理/逻辑上导致解析失败吗?我惊讶地看到它的工作原理,并好奇它背后的逻辑是什么,允许这样做。这是因为十进制解析使用了数千分隔符。如果不允许使用数千个分隔符,只需删除该标志,如下所示:
Decimal.Parse("12,2,2,2", NumberStyles.Number ^ NumberStyles.AllowThousands)
这将引发InvalidFormatException默认情况下,TryParse()
允许使用组分隔符,在您所在的国家/地区是,
要防止出现这种情况,请传递一个不包含NumberStyles.AllowThousands的NumberStyles
默认值为:
Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |
AllowDecimalPoint | AllowThousands,
这是因为数字组分隔符。在处理货币类型时,通常使用1000分隔符。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
只会忽略千位分隔符。您阅读了吗<代码>参数s使用NumberStyles.Number样式进行解释。这意味着允许使用空格和千位分隔符,但不允许使用货币符号。就在上面,它告诉您,是一个特定于区域性的千位分隔符符号。您希望“1234.56”
解析为1234.56
?当然如果逗号位于错误的位置,您是否仍希望它解析为1234.56
?嗯,也许。NET是这样编写的,尽管我在文档中找不到它。(相关:)那么为什么Int32.Parse(“12,2,2,2”)
不成功?@dotnet因为在解析整数时,数千个分隔符都是无效的。对,但我指的是你给出的逻辑:数千个分隔符纯粹是为了视觉提示,没有提供任何有关数字的重要信息。这个逻辑不也适用于Int32吗?@dotNET您可以应用这个逻辑。然而,您倾向于在货币中找到数千个分隔符,而不是在其他地方。这就是为什么它往往是用于接受数千个分隔符的货币的类型。至少我一直认为设计师们是这样推理的。