首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 判斷字串是否為數字的五大方案完整比較:從 TryParse 到 Regex 的效能與適用性分析

     編輯:關於C語言

方案一:Try-Catch 捕獲 Parse 例外(不推薦常規使用)

private bool IsNumeric(string text) {
    try { int.Parse(text); return true; }
    catch { return false; }
}
  • 缺點:例外處理效能極差(微秒級開銷),僅適用極少數異常情境
  • 適用:舊版 .NET 無 TryParse 時的權宜之計

方案二:正則表達式(靈活但需精心設計)

完整版:支援正負號、小數、科學記號

public bool IsNumber(string str) {
    var notNumber = new Regex(@"[^0-9.-]");
    var twoDot = new Regex(@"[0-9]*\.[0-9]*\.[0-9]*");
    var twoMinus = new Regex(@"[0-9]*-[0-9]*-[0-9]*");
    var validReal = @"^([-]|[.]|[-.]|[0-9])[0-9]*\.?[0-9]+$";
    var validInt = @"^([-]|[0-9])[0-9]*$";
    var numberPattern = new Regex($"({validReal})|({validInt})");
    
    return !notNumber.IsMatch(str) 
        && !twoDot.IsMatch(str) 
        && !twoMinus.IsMatch(str) 
        && numberPattern.IsMatch(str);
}

簡化版:常見數值格式

public static bool IsNumeric(string v) => Regex.IsMatch(v, @"^[+-]?\d*\.?\d*$");
public static bool IsInt(string v) => Regex.IsMatch(v, @"^[+-]?\d*$");
public static bool IsUnsigned(string v) => Regex.IsMatch(v, @"^\d*\.?\d*$");
  • 優點:格式控制精確、可拒絕超長數字字串(避免 Parse 溢位成本)
  • 缺點:Regex 編譯/匹配有固定開銷、模式錯誤易漏判

方案三:字元逐一檢查(零分配、可控制細節)

僅數字字元

public bool IsNumeric(string s) {
    foreach (char c in s) if (c < '0' || c > '9') return false;
    return s.Length > 0;
}

支援正負號、單一小數點

public static bool IsNumeric(string s) {
    s = s.Trim();
    bool hasDigit = false, hasDot = false;
    for (int i = 0; i < s.Length; i++) {
        char c = s[i];
        if (char.IsDigit(c)) { hasDigit = true; continue; }
        if (c == '.' && !hasDot) { hasDot = true; continue; }
        if (i == 0 && (c == '+' || c == '-')) continue;
        return false;
    }
    return hasDigit;
}
  • 優點:無額外物件配置、可精確控制格式規則、效能穩定
  • 缺點:需自行處理邊界情況、科學記號支援複雜

方案四:移植 VB IsNumeric 邏輯(複雜、效能一般)

完整移植包含十六進位/八進位辨識、文化特性數值格式解析,程式碼量大,維護成本高,不建議直接複製。

方案五:引用 Microsoft.VisualBasic.dll(重量級依賴)

using Microsoft.VisualBasic;
bool isNum = Information.IsNumeric("123");
  • 缺點:引入額外組件、效能不如原生、部署複雜度增加

關鍵陷阱:格式通過 ≠ 數值可用

社區回饋指出關鍵問題:

「第二、三種方法未檢查數值範圍。用 999...999 (50 位數) 通過 IsInt,但 int.Parse 會拋例外;同理 double.Parse 也會失敗。」

結論:格式驗證與數值轉換應合併,直接使用 TryParse 同時完成兩者。

綜合建議決策樹

  1. 首選 int.TryParse / double.TryParse / decimal.TryParse —— 標準、高效、同時完成驗證與轉換
  2. 需嚴格格式控制(如禁止前導零、固定小數位) → Regex + TryParse 雙重檢查
  3. 極高效能熱路徑、極簡格式(如僅正整數) → 手寫字元迴圈
  4. 避免:Parse+try-catch、VB 移植、VisualBasic.dll 依賴

現代 C# 最佳實踐範本

public bool TryParseInput(string input, out double value) {
    // 1. 快速前置檢查:長度、空白、明顯非數字字元
    if (string.IsNullOrWhiteSpace(input) || input.Length > 50) {
        value = 0; return false;
    }
    // 2. 核心驗證+轉換
    return double.TryParse(input, NumberStyles.Float | NumberStyles.AllowThousands, 
                           CultureInfo.InvariantCulture, out value);
}

「字串是否為數字」看似簡單,實則涉及格式定義、文化特性、數值範圍、效能權衡。選對工具,才能寫出正確又快速的程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved