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

Java 判斷字符串是否為數字的多種方法與性能對比

     編輯:Java 相關知識

方法一:Character.isDigit() 遍歷 (JDK 原生)

public static boolean isNumeric(String str) {
    if (str == null || str.isEmpty()) return false;
    for (int i = 0; i < str.length(); i++) {
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }
    return true;
}
  • 優點:無依賴、支持 Unicode 數字、代碼簡潔
  • 缺點:不支持負號、小數點、科學計數法

方法二:正則表達式

// 僅整數 (非負)
public static boolean isInteger(String str) {
    return str != null && str.matches("\\d+");
}

// 整數 (含正負號)
public static boolean isIntegerWithSign(String str) {
    return str != null && str.matches("[+-]?\\d+");
}

// 浮點數 (含科學計數法)
public static boolean isNumericRegex(String str) {
    return str != null && str.matches("[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?");
}
  • 優點:功能強大、可精確控制格式
  • 缺點:編譯 Pattern 有開銷、頻繁調用建議預編譯

方法三:ASCII 碼範圍判斷

public static boolean isNumericAscii(String str) {
    if (str == null || str.isEmpty()) return false;
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c < '0' || c > '9') return false; // '0'=48, '9'=57
    }
    return true;
}
  • 優點:極快、無方法調用開銷
  • 缺點:僅支持 ASCII 數字、不支持全角數字等 Unicode

方法四:Java 8+ Stream API (函數式)

public static boolean isNumericStream(String str) {
    return str != null && !str.isEmpty() && 
           str.chars().allMatch(Character::isDigit);
}

方法五:Apache Commons Lang / Guava 工具類 (生產推薦)


// Apache Commons Lang 3
StringUtils.isNumeric(str);        // 僅數字
StringUtils.isNumericSpace(str);   // 數字或空白
NumberUtils.isCreatable(str);      // 可解析為數字 (含負號、小數、科學計數法)

// Guava
CharMatcher.DIGIT.matchesAllOf(str);

方法六:嘗試解析捕獲異常 (不推薦常規使用)

public static boolean isNumericParse(String str) {
    if (str == null) return false;
    try {
        Long.parseLong(str); // 或 Double.parseDouble
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}
  • 缺點:異常機制開銷大、僅作為最後手段

性能基準測試 (JMH 參考數據)

方法吞吐量 (ops/ms)相對性能適用場景
ASCII 範圍~15,000基準 1.0x純 ASCII 數字、極高頻調用
Character.isDigit~12,0000.8x通用 Unicode 數字檢查
預編譯 Pattern~8,0000.5x複雜格式驗證 (小數、科學計數法)
String.matches~3,0000.2x低頻、臨時驗證
NumberUtils.isCreatable~2,5000.17x通用數字解析驗證
異常捕獲法~2000.01x極少數邊界情況

選型建議決策樹

需要驗證格式?
├─ 僅非負整數 → ASCII 範圍 或 Character.isDigit
├─ 整數(含符號) → 預編譯 Pattern: [+-]?\\d+
├─ 浮點數/科學計數法 → NumberUtils.isCreatable() 或預編譯完整正則
└─ 通用數字解析 → NumberUtils.isCreatable() (推薦生產環境)

完整工具類示例

public final class NumericUtils {
    private static final Pattern INTEGER_PATTERN = Pattern.compile("[+-]?\\d+");
    private static final Pattern DECIMAL_PATTERN = Pattern.compile("[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?");
    
    private NumericUtils() {}
    
    public static boolean isPositiveInteger(String str) {
        return str != null && !str.isEmpty() && 
               str.chars().allMatch(Character::isDigit);
    }
    
    public static boolean isInteger(String str) {
        return str != null && INTEGER_PATTERN.matcher(str).matches();
    }
    
    public static boolean isDecimal(String str) {
        return str != null && DECIMAL_PATTERN.matcher(str).matches();
    }
    
    public static boolean isParsableNumber(String str) {
        return NumberUtils.isCreatable(str); // 需 commons-lang3 依賴
    }
}

根據業務場景選擇合適方法:高頻簡單判斷用 ASCII/Character,複雜格式用預編譯正則,生產通用驗證首選成熟工具庫。

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