ASP.NET:移除GridView中的 解决数值转换格式错误
解决Unicode特殊空格导致的Int转换格式错误问题
我之前也碰到过一模一样的情况!肉眼看起来是正常空格,但Convert.ToInt32就是报错,查了半天发现是Unicode空白字符在搞鬼——比如非断行空格(\u00A0)、全角空格(\u3000)这类,它们和普通空格(\u0020)视觉上没区别,但转换时会被当成无效字符。
给你几个实用的解决思路:
1. 先清理字符串再转换
最直接的方式是把所有Unicode空白字符都清理掉,再尝试转成int,还能顺便处理空值:
string cellText = row.Cells[2].Text; // 先移除首尾的所有空白,再替换中间的Unicode空白字符 string cleanedText = System.Text.RegularExpressions.Regex.Replace(cellText.Trim(), @"\p{Zs}", ""); int updatecount; // 用TryParse更安全,避免直接抛异常 if (!int.TryParse(cleanedText, out updatecount)) { // 转换失败时设置默认值或者按业务逻辑处理空值 updatecount = 0; // 或者你可以用Nullable<int>类型存空值 }
这里的\p{Zs}是正则里专门匹配Unicode空格分隔符的规则,比普通的\s覆盖的特殊空格更多。
2. 只保留数字字符(更精准)
如果确定目标字符串里应该只有数字和负号,直接过滤出有效字符:
string cellText = row.Cells[2].Text; string onlyDigits = new string(cellText.Where(c => char.IsDigit(c) || c == '-').ToArray()); int? updatecount = string.IsNullOrEmpty(onlyDigits) ? null : int.Parse(onlyDigits);
这样不管是什么特殊字符,只要不是数字/负号都会被去掉,适合数据格式比较固定的场景。
3. 从数据源头解决问题
看你更新的前后端代码,DAYCOUNT是直接绑定数据库字段的,可能数据本身就带了特殊空格。可以在后端绑定Grid前先处理数据:
// 绑定前先清理DAYCOUNT字段的特殊空格 var basketList = cdbe.VwBaskets.Select(item => new { item.BASKET_ID, item.CONTRACT_POS_START, DAYCOUNT = item.DAYCOUNT?.ToString().Trim().Replace("\u00A0", "") }).ToList(); Basket_Grid.DataSource = basketList; Basket_Grid.DataBind();
这样前端显示的就是干净的数字,后续后端转换就不会踩坑了。
另外调试时可以用Encoding.UTF8.GetBytes(cellText)查看字符串的字节编码,比如普通空格是0x20,非断行空格是0xC2 0xA0,全角空格是0xE3 0x80 0x80,一眼就能确认是不是特殊字符的问题。
内容的提问来源于stack exchange,提问作者Xaphas
相关产品推荐
相关产品推荐

