方法定义

public static boolean isDigit(char ch)
public static boolean isDigit(int codePoint)
  • 所属类:java.lang.Character
  • 返回类型:boolean
  • 访问修饰符:public static
  • 参数:
    • ch:待检测的字符(char 类型)
    • codePoint:待检测的 Unicode 码点(int 类型,用于支持增补字符)
  • 功能:判断指定字符是否为数字字符。

✅ 该方法是静态方法,可直接通过类名调用。


功能说明

Character.isDigit() 用于判断一个字符是否属于“数字”类别。它不仅识别常见的 ASCII 数字 0-9,还支持 Unicode 标准中定义的其他语言或符号系统中的数字字符,例如:

  • 阿拉伯数字:٠١٢٣٤٥٦٧٨٩(U+0660 到 U+0669)
  • 泰文数字:๐๑๒๓๔๕๖๗๘๙
  • 罗马数字:Ⅰ, Ⅴ, Ⅹ 等(部分罗马数字字符被归类为数字)
  • 全角数字:0123456789

判断标准

该方法依据 Unicode 标准 中字符的 "Numeric Type" 属性进行判断。如果字符的类型是 DecimalDigit 或 Digit,则返回 true。

📌 与 Character.isWhitespace()、Character.isLetter() 等方法类似,它是 Java 提供的字符分类工具之一。


示例代码

1. 基本用法(ASCII 数字)

System.out.println(Character.isDigit('5')); // true
System.out.println(Character.isDigit('0')); // true
System.out.println(Character.isDigit('9')); // true
System.out.println(Character.isDigit('a')); // false
System.out.println(Character.isDigit(' ')); // false

2. 支持 Unicode 数字字符

// 阿拉伯-印度数字
System.out.println(Character.isDigit('\u0665')); // true (٥)

// 泰文数字
System.out.println(Character.isDigit('\u0E53')); // true (๓)

// 全角数字
System.out.println(Character.isDigit('5')); // true (U+FF15)

3. 使用码点(Code Point)检测增补字符

int codePoint = 0x1D7CF; // 数学字母数字符号: 𝟏 (MATHEMATICAL DOUBLE-STRUCK DIGIT ONE)
System.out.println(Character.isDigit(codePoint)); // true

4. 遍历字符串判断是否全为数字

String str = "123٤٥٦";
boolean isAllDigits = str.chars().allMatch(Character::isDigit);
System.out.println(isAllDigits); // true

5. 与 isLetterOrDigit() 对比

System.out.println(Character.isDigit('7'));        // true
System.out.println(Character.isLetter('7'));       // false
System.out.println(Character.isLetterOrDigit('7')); // true

使用技巧

✅ 1. 替代正则表达式进行数字判断

// 推荐:高效且语义清晰
if (Character.isDigit(ch)) { ... }

// 不推荐:正则性能较差
if (String.valueOf(ch).matches("\\d")) { ... }

✅ 2. 结合 String.chars() 进行流式处理

String input = "abc123def";
long digitCount = input.chars()
                       .filter(Character::isDigit)
                       .count();
System.out.println(digitCount); // 3

✅ 3. 用于输入验证

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

System.out.println(isNumericString("123"));   // true
System.out.println(isNumericString("12.3"));  // false(包含 '.')
System.out.println(isNumericString("abc"));   // false

常见错误

❌ 1. 误以为能识别浮点数或负数

System.out.println(Character.isDigit('-')); // false
System.out.println(Character.isDigit('.')); // false
System.out.println(Character.isDigit('1')); // true

isDigit() 只判断单个字符是否为数字,不解析数字字符串。

❌ 2. 混淆 isDigit() 与 isLetterOrDigit()

System.out.println(Character.isDigit('A'));           // false
System.out.println(Character.isLetterOrDigit('A'));   // true

❌ 3. 忽视 Unicode 数字的存在

开发者可能误以为 isDigit() 只识别 0-9,但实际上它支持多种 Unicode 数字,需注意国际化场景。


注意事项

项目 说明
🔤 Unicode 感知 支持多种语言的数字字符,不仅是 ASCII
🧩 增补字符支持 使用 int codePoint 版本可处理代理对
⚠️ 不识别符号 '.', '-', ',' 等不是数字
✅ 静态方法 无需实例化,直接调用
📏 性能高 内部基于查表或位运算,效率极高

最佳实践

场景 推荐做法
判断单个字符是否为数字 Character.isDigit(ch)
验证字符串是否全为数字 str.chars().allMatch(Character::isDigit)
需要支持 Unicode 数字 继续使用 isDigit()(已支持)
仅需 ASCII 数字 0-9 可用 ch >= '0' && ch <= '9'(更快)
输入校验 结合 null 和空字符串检查

仅检查 ASCII 数字(高性能场景)

public static boolean isASCIIDigit(char ch) {
    return ch >= '0' && ch <= '9';
}

性能优化

  • ✅ isDigit() 被 JVM 高度优化,通常内联执行。
  • ✅ 使用 char 参数版本比 int codePoint 略快(无需处理代理对)。
  • ⚠️ 在极高频循环中,若只处理 ASCII,可用 ch >= '0' && ch <= '9' 提升性能。

与其他方法对比

方法 用途 是否包含数字
Character.isDigit(ch) 是否为数字字符 ✅
Character.isLetter(ch) 是否为字母 ❌
Character.isLetterOrDigit(ch) 是否为字母或数字 ✅
Character.isWhitespace(ch) 是否为空白字符 ❌
Character.isISOControl(ch) 是否为控制字符 ❌

总结

要点 说明
核心功能 判断字符是否为 Unicode 定义的“数字”
支持范围 包括 ASCII 数字、阿拉伯数字、泰文数字等
使用场景 字符分类、输入验证、字符串处理
性能表现 高效,推荐替代正则
最佳实践 用于通用数字判断;ASCII 场景可用范围比较优化

✅ 一句话掌握:
Character.isDigit() 是 Java 中判断字符是否为“数字”的标准、高效、国际化友好的方法,支持 Unicode 多语言数字字符。在字符串验证、输入处理等场景中应优先使用,但在仅需 ASCII 数字且性能敏感时,可使用 ch >= '0' && ch <= '9' 进一步优化。