如何让Decimal.TryParse拒绝解析含非千位分隔逗号的'3,5'?
解决Decimal.TryParse误解析带逗号数字的问题
默认的Decimal.TryParse会将"3,5"这类字符串误解析为35(因为当前文化下逗号被识别为千位分隔符),但使用NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint参数的Decimal.Parse会直接解析失败。我们可以通过给TryParse指定明确的解析规则,让它拒绝这类不符合预期的输入,无需额外做字符串包含逗号的检查。
解决方案
给TryParse传入指定的NumberStyles和CultureInfo,明确禁用千位分隔符的解析逻辑:
- 解析样式使用
NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent,和你测试时Parse用的规则一致 - 配合
CultureInfo.InvariantCulture(或其他不将逗号视为千位分隔符的文化),确保只有点.会被识别为小数点
修正后的代码示例
using System.Globalization; string test = "3,5"; Decimal val; // 使用指定的样式和文化进行解析 if (!Decimal.TryParse(test, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out val)) { throw new Exception($"Error: {test} is not valid."); } // 此时解析会失败,进入异常分支,不会得到错误的35 Console.WriteLine(val);
关于备选检查的说明
直接用test.Contains(",")的方式不够严谨:如果输入是合法的带千位分隔符的数字(比如"1,000.5"),这种检查会误判为无效输入,因此不推荐使用。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

