C#:使用不同NumberStyles解析Decimal的异常结果咨询
解析Decimal时NumberStyles.AllowDecimalPoint单独使用失效的原因
嘿,这个问题我之前踩过一模一样的坑,对着MSDN文档愣了半天!让我给你拆解清楚到底是怎么回事:
首先咱们先还原你遇到的代码场景——我猜你的两段代码大概是这样的:
第一段(返回false):
bool parseResult1 = Decimal.TryParse("123.45", NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var decimalValue1);
第二段(返回true):
bool parseResult2 = Decimal.TryParse("123.45", NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingDigits | NumberStyles.AllowTrailingDigits, CultureInfo.InvariantCulture, out var decimalValue2); // 或者直接用默认的NumberStyles.Number也会返回true
核心原因:NumberStyles是标志位组合,单独AllowDecimalPoint根本不够用
MSDN说AllowDecimalPoint仅与分隔符相关,这句话没毛病,但它有个很容易被忽略的前提:你得先允许解析器处理数字本身!
NumberStyles.AllowDecimalPoint的作用只是告诉解析器「字符串里可以出现小数点这个符号」,但它完全没有授权解析器处理0-9这些数字字符。默认的NumberStyles.Number其实是多个标志位的组合:AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | AllowDecimalPoint | AllowThousands,其中隐含了允许数字的规则(毕竟默认场景就是要解析数字)。
当你只指定AllowDecimalPoint时,解析器会认为字符串里只能包含小数点相关的规则,但数字字符不在允许的范围内,自然无法解析123.45这种包含数字的字符串——甚至连单独的.都解析不了,因为它本身不是有效的Decimal值。
验证一下:单独AllowDecimalPoint能解析什么?
其实几乎什么都解析不了,比如:
// 这也会返回false,只有小数点没有数字,不符合Decimal的有效格式 bool invalidParse = Decimal.TryParse(".", NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d);
正确的做法
如果你要解析带小数点的十进制字符串,要么:
- 不指定NumberStyles,用默认的
NumberStyles.Number(这是最省心的选择); - 明确组合必要的标志位:至少要包含
AllowDecimalPoint+AllowLeadingDigits+AllowTrailingDigits,如果需要正负号或千分位,再加上对应的标志位。
内容的提问来源于stack exchange,提问作者Buda Gavril
相关产品推荐
相关产品推荐

