使用Convert.ToInt32转换时出现未知FormatException异常问题排查
异常原因
FormatException抛出的核心原因是待转换的item字符串不符合32位十进制整数的解析规则,常见触发场景如下:
- 字符串包含非数字字符:比如首尾空格、字母、特殊符号、货币符号、未适配的千位分隔符等
- 字符串为null、空值,或仅包含空白字符
- 字符串为二进制、八进制、十六进制格式的数值表示,但转换时没有指定对应的解析基数,默认仅支持十进制格式解析
解决方法
- 增加安全校验逻辑,避免程序直接中断
优先使用int.TryParse替代Convert.ToInt32,既可以避免异常抛出,还可以对非法输入做额外处理(比如日志排查),示例代码如下:
if (model.TagSelection != null) { foreach (var item in model.TagSelection) { // 空值先过滤 if (string.IsNullOrWhiteSpace(item)) { continue; } // 尝试解析,适配固定区域性格式 if (int.TryParse(item.Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out int tagValue)) { job.Tags |= tagValue; } else { // 此处可添加日志输出item的实际值,快速定位非法输入 } } }
- 适配非十进制的数值格式
如果确认item是其他进制的数值,转换时需要指定对应基数:
- 十六进制:调用
Convert.ToInt32(item, 16),或在TryParse中指定NumberStyles.HexNumber - 八进制:调用
Convert.ToInt32(item, 8) - 二进制:调用
Convert.ToInt32(item, 2)
- 适配特殊格式的数值
如果字符串包含千位分隔符等合法的数值格式,可以调整NumberStyles参数适配,比如设置为NumberStyles.Integer | NumberStyles.AllowThousands即可解析带千位分隔符的整数。
内容的提问来源于stack exchange,提问作者Donald Jansen
相关产品推荐
相关产品推荐

