方法定义

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" 属性进行判断。如果字符的类型是 DecimalDigitDigit,则返回 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' 进一步优化。