You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:25:05