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
相关产品推荐
相关产品推荐

