如何让C#仅在字符串含点号/无分隔符时解析为decimal?
C# 限定Decimal解析仅允许点号作为分隔符的实现方法
问题说明
你需要实现的是:将字符串解析为decimal类型时,只有当字符串仅包含数字、可选的单个点号(无逗号等其他符号)时解析成功,否则抛出错误。但默认使用NumberDecimalSeparator = "."的decimal.Parse会把逗号识别为千位分隔符,导致像"1,0"这样的输入被错误解析为10,不符合预期。
解决方案
方法1:通过NumberFormatInfo和NumberStyles限制解析规则
不需要正则,直接调整解析的格式信息和样式,禁用千位分隔符的解析能力,这样输入中的逗号就会被判定为非法字符。
var formatInfo = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "" // 设为空字符串,让千位分隔符无效 }; // 移除允许千位分隔符的样式,只保留必要的解析规则 var validStyles = NumberStyles.Number & ~NumberStyles.AllowThousands; // 成功解析 var test1 = decimal.Parse("1.0", validStyles, formatInfo); // 抛出FormatException,符合预期 var test2 = decimal.Parse("1,0", validStyles, formatInfo);
原理:通过~NumberStyles.AllowThousands移除了允许千位分隔符的解析权限,同时把NumberGroupSeparator设为空,这样输入里的逗号无法被识别为合法分隔符,触发格式错误。
方法2:正则表达式预校验
如果需要更严格的格式控制(比如限制小数位数、不允许前导零等),可以先用正则提前验证输入格式:
正则表达式推荐:^-?\d+(\.\d+)?$,它的规则是:
- 允许可选的负号开头
- 必须包含至少一位整数
- 可选的小数部分由单个点号加至少一位数字组成
- 整个字符串不能有其他多余字符
代码示例:
using System.Text.RegularExpressions; string input = "1,0"; if (!Regex.IsMatch(input, @"^-?\d+(\.\d+)?$")) { throw new FormatException("输入格式错误,仅允许数字和点号作为小数分隔符"); } decimal result = decimal.Parse(input);
总结
不需要必须依赖正则表达式,通过调整NumberFormatInfo和NumberStyles就能满足基础需求;如果需要更精细的格式约束,正则是更灵活的选择。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

