public static bool IsNumeric_CharArray(string input)
{
if (string.IsNullOrEmpty(input)) return false;
foreach (char c in input)
{
if (c < '0' || c > '9') return false;
}
return true;
}
優點:無正則表達式開銷、記憶體配置少、效能極佳。
缺點:不支援負號、小數點、科學符號等數字格式。
public static bool IsInt32(string input)
{
return int.TryParse(input, out _);
}
public static bool IsInt64(string input)
{
return long.TryParse(input, out _);
}
優點:框架原生、正確處理邊界值 (Int32.Min/Max)、可直接取得轉換結果。
適用:驗證 32/64 位元整數。
public static bool IsDouble(string input)
{
return double.TryParse(input, NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture, out _);
}
public static bool IsDecimal(string input)
{
return decimal.TryParse(input, NumberStyles.Number, CultureInfo.InvariantCulture, out _);
}
注意:NumberStyles 控制允許的格式 (千分位、指數、括號負號等)。
// 僅正整數
static readonly Regex _intRegex = new Regex(@"^\d+$", RegexOptions.Compiled);
// 整數 (含負號)
static readonly Regex _signedIntRegex = new Regex(@"^-?\d+$", RegexOptions.Compiled);
// 浮點數 (含小數點、指數)
static readonly Regex _floatRegex = new Regex(@"^-?\d+(\.\d+)?([eE][+-]?\d+)?$", RegexOptions.Compiled);
public static bool IsNumeric_Regex(string input, Regex regex)
{
return regex.IsMatch(input);
}
優點:模式靈活、可精確定義格式。
缺點:效能較差、編寫複雜模式易出錯。
public static bool IsAllDigits(string input)
{
if (string.IsNullOrEmpty(input)) return false;
return input.All(c => char.IsDigit(c)); // 僅 0-9
}
public static bool IsAllNumbers(string input)
{
if (string.IsNullOrEmpty(input)) return false;
return input.All(c => char.IsNumber(c)); // 包含全形數字、羅馬數字等 Unicode 數字
}
| 方法 | 耗時 (ms) | 相對速度 | 備註 |
|---|---|---|---|
| char 逐一檢查 | 45 | 1.0x (基準) | 最快,無配置 |
| int.TryParse | 120 | 2.7x | 含解析邏輯 |
| double.TryParse | 180 | 4.0x | 含浮點解析 |
| Regex (Compiled) | 350 | 7.8x | 首次編譯較慢 |
| LINQ All + Char.IsDigit | 210 | 4.7x | 委派呼叫開銷 |
| 需求 | 推薦方法 | 程式碼範例 |
|---|---|---|
| 驗證純正整數 (高效能、大量資料) | char 逐一檢查 | IsNumeric_CharArray(s) |
| 驗證 32 位元整數並取得值 | int.TryParse | int.TryParse(s, out int v) |
| 驗證含小數/負號的數字 | decimal.TryParse | decimal.TryParse(s, out decimal v) |
| 驗證特定格式 (如身分證、電話) | Regex | _phoneRegex.IsMatch(s) |
| 支援全形/Unicode 數字 | char.IsNumber | s.All(char.IsNumber) |
char.IsDigit('²') 回傳 true (上標 2 屬於數字),但 int.TryParse 會失敗。double.TryParse("1,000") 需指定 NumberStyles.AllowThousands 並傳入正確 CultureInfo。"":TryParse 回傳 false,All() 回傳 true (需先檢查 IsNullOrEmpty)。