为什么decimal.TryParse成功解析类似12,2,2,2的东西

时间:2014-09-17 20:01:23

标签: c# parsing decimal

如果我执行以下操作:

string teststring = "12,2,2,2";
decimal testdecimal;
decimal.TryParse(teststring, out testdecimal)

这有效,而testdecimal最终为12222。

这种合理/逻辑无法解析吗?我很惊讶地看到它起作用并且很好奇它背后的逻辑是什么允许这个。

4 个答案:

答案 0 :(得分:6)

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

要防止这种情况发生,请传递不包含NumberStyles的{​​{1}}。

默认为:

NumberStyles.AllowThousands

Source

答案 1 :(得分:3)

这是因为数字组分隔符。在处理货币类型时,使用一千个分隔符是很常见的。 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

答案 2 :(得分:2)

您的文化设置有,作为千位分隔符。由于千位分隔符纯粹用于视觉提示,并且不提供有关数字的任何重要信息,decimal.TryParse只是忽略了数千个分隔符。

答案 3 :(得分:1)

这是因为Decimal解析的千位分隔符。如果你想禁止千位分隔符,你可以删除那个标志,如下所示:

Decimal.Parse("12,2,2,2", NumberStyles.Number ^ NumberStyles.AllowThousands)

这将抛出InvalidFormatException