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您可以应用这个逻辑。然而,您倾向于在货币中找到数千个分隔符,而不是在其他地方。这就是为什么它往往是用于接受数千个分隔符的货币的类型。至少我一直认为设计师们是这样推理的。