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

C# 判斷字串是否為純數字的多種方法與效能比較

     編輯:ASP.NET 基礎

方法一:字元逐一檢查 (原始碼改良版)

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;
}

優點:無正則表達式開銷、記憶體配置少、效能極佳。
缺點:不支援負號、小數點、科學符號等數字格式。

方法二:int.TryParse / long.TryParse (推薦整數)

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 位元整數。

方法三:double.TryParse / decimal.TryParse (支援小數)

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);
}

優點:模式靈活、可精確定義格式。
缺點:效能較差、編寫複雜模式易出錯。

方法五:Char.IsDigit / Char.IsNumber (Unicode 支援)

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 數字
}

效能基準測試 (100 萬次迴圈)

方法耗時 (ms)相對速度備註
char 逐一檢查451.0x (基準)最快,無配置
int.TryParse1202.7x含解析邏輯
double.TryParse1804.0x含浮點解析
Regex (Compiled)3507.8x首次編譯較慢
LINQ All + Char.IsDigit2104.7x委派呼叫開銷

實務選擇指南

需求推薦方法程式碼範例
驗證純正整數 (高效能、大量資料)char 逐一檢查IsNumeric_CharArray(s)
驗證 32 位元整數並取得值int.TryParseint.TryParse(s, out int v)
驗證含小數/負號的數字decimal.TryParsedecimal.TryParse(s, out decimal v)
驗證特定格式 (如身分證、電話)Regex_phoneRegex.IsMatch(s)
支援全形/Unicode 數字char.IsNumbers.All(char.IsNumber)

常見陷阱

  • char.IsDigit('²') 回傳 true (上標 2 屬於數字),但 int.TryParse 會失敗。
  • double.TryParse("1,000") 需指定 NumberStyles.AllowThousands 並傳入正確 CultureInfo。
  • 空字串 "":TryParse 回傳 false,All() 回傳 true (需先檢查 IsNullOrEmpty)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved