为什么是十进制.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成功解析了类似12,2,2,2的内容

默认情况下,TryParse()允许组分隔符,在您的国家/地区为,

要防止这种情况发生,请传递一个不包括NumberStyles.AllowThousandsNumberStyles

默认为:

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