应使用 TryParse 系列方法判断字符串是否为数字,因其不抛异常、返回 bool 并通过 out 输出结果;需按需求选择 int/double/decimal.TryParse,注意 NumberStyles、CultureInfo 及常见陷阱如未检查返回值、混淆文化格式、忽略不可见字符。

字符串是否为数字?别用 int.Parse 做判断
直接抛异常不是校验,是放任崩溃。用 int.Parse 或 double.Parse 判断字符串是否为数字,只要遇到空值、空格、带单位(如 "123px")、科学计数法(如 "1e5")或文化相关格式(如德语的 "1.234,56"),就会炸出 FormatException 或 ArgumentNullException。这不是“判断”,是赌运气。
真正安全的做法只有一条路:用 TryParse 系列方法。它不抛异常,返回 bool 表示成功与否,同时通过 out 参数输出转换结果。
-
int.TryParse("123", out int x)→ true,x = 123 -
int.TryParse(" 123 ", out int x)→ true(默认忽略首尾空白) -
int.TryParse("12.3", out int x)→ false(小数点不合法) -
int.TryParse("", out int x)→ false -
int.TryParse(null, out int x)→ false(不会 NRE)
不同数字类型该选哪个 TryParse?
不是所有“看起来像数字”的字符串都该用 int.TryParse。选错方法会导致误判或丢失精度:
- 要支持小数 → 用
double.TryParse或decimal.TryParse(金融场景必选decimal,避免浮点误差) - 要兼容千分位、货币符号、正负号 → 必须传入
NumberStyles和CultureInfo,例如:double.TryParse("¥1,234.56", NumberStyles.Currency, CultureInfo.GetCultureInfo("ja-JP"), out double v) - 要严格限制为纯整数(不允许小数点、e、+/-)→ 用
int.TryParse(s, NumberStyles.None, CultureInfo.InvariantCulture, out int v) - 不确定输入范围 → 优先用
long.TryParse或decimal.TryParse,避免int溢出时静默失败(int.TryParse("3000000000", ...)返回 false,但你不一定会意识到这是溢出而非格式错误)
TryParse 的三个常见坑
写对了方法名,不代表逻辑就稳了。这三个细节高频出错:
-
忽略
out变量初始化:C# 要求out参数在调用前无需赋值,但若TryParse返回false,out变量的值是未定义的(实际常为 0,但不可依赖)。务必只在返回true后使用该变量 - 混淆
CultureInfo.CurrentCulture和CultureInfo.InvariantCulture -
把
TryParse当“清洗函数”用:它不自动 Trim,也不处理 Unicode 空格(如\u2000)。若输入可能含全角空格或 BOM,需先手动清理:s?.Trim().Trim('\uFEFF', '\u200B')
需要更灵活校验?自己封装一个 IsNumericString
标准 TryParse 不提供“是否为有效数字字符串”的布尔接口(不关心具体值)。如果只是做前端输入校验、表单验证,不需要转换结果,可以封装一层:
public static bool IsNumericString(string s, NumberStyles style = NumberStyles.Integer)
{
if (string.IsNullOrWhiteSpace(s)) return false;
return double.TryParse(s, style, CultureInfo.InvariantCulture, out _);
}注意这里用 double.TryParse + out _ 是为了覆盖更多合法数字形式(如 "1e3", "-.5"),但代价是会把 "NaN"、"Infinity" 也判为 true。真要排除这些,得加额外判断:!double.IsNaN(v) && !double.IsInfinity(v)。
最麻烦的永远不是语法,而是你默认接受的“合理格式”——比如用户粘贴进来的 Excel 数字常带不可见字符,或者前端传来的 JSON 字段被意外转义成字符串。校验之前,先想清楚:你要拦住什么,又打算放过什么。


















