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

TextBox按退格后Regex.IsMatch正则匹配失效问题求助

问题根因

你遇到的问题是由千位分隔符的字符类型差异导致的:

  • 调用ToString("N")生成格式化数字时,系统默认使用的千位分隔符是不间断空格(Unicode编码U+00A0),不是你正则里允许的普通半角空格(Unicode编码U+0020)
  • 退格操作后残留的空格是之前格式化生成的不间断空格,不在你正则^[0-9 ,.]+$的允许范围内,因此Regex.IsMatch()返回false,逻辑直接返回原字符串
  • 手动输入/粘贴的空格是普通半角空格,符合正则规则,因此可以正常格式化

这两种空格视觉显示完全一致,常规调试时看不到编码差异,因此很难直接排查到。

解决方案

方案1:修改正则兼容不间断空格

直接在正则的允许字符集中加入不间断空格的转义符即可:

if (Regex.IsMatch(amountIn, @"^[0-9 ,.\u00A0]+$"))

方案2:预处理输入替换特殊空格

在执行正则判断前,先把所有不间断空格替换为普通空格,同时也可以兼容其他空白字符:

public static string ReformatAmount(string amountIn)
{
    // 先替换所有不间断空格为普通空格
    amountIn = amountIn.Replace('\u00A0', ' ');
    string amountOut;
    if (Regex.IsMatch(amountIn, @"^[0-9 ,.]+$"))
    {
        amountOut = Regex.Replace(amountIn, "[. ]", "");
        amountOut = Convert.ToDecimal(amountOut).ToString("N");
        return amountOut;
    }
    else
    {
        return amountIn;
    }
}

方案3:优化逻辑提升容错性(推荐)

可以简化逻辑,无需严格校验输入格式,先清理输入再尝试转换,同时避免转换异常:

public static string ReformatAmount(string amountIn)
{
    // 清理所有非数字、非逗号的字符,自动过滤各种空格、特殊符号
    string cleanedInput = Regex.Replace(amountIn, @"[^\d,]", "");
    // 用TryParse避免格式错误抛出异常
    if (decimal.TryParse(cleanedInput, out decimal amount))
    {
        return amount.ToString("N");
    }
    // 解析失败直接返回原内容
    return amountIn;
}

内容的提问来源于stack exchange,提问作者Filledille

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:00:03