
你在做用户注册、表单提交或者读配置文件时,一定碰到过这种情况:用户输入了一串字符,你得先确认它到底是不是数字,才能拿去做年龄校验、金额计算或者编号拼接。Java判断纯数字这件事,最省事的做法是用正则表达式一次性匹配,其次可以逐字符判断,也可以用「尝试转换 + 捕获异常」的方式兜底。
本文基于 Java 8 及以上版本验证,覆盖正则匹配、逐字符判断、异常捕获三种做法,并附上横向对比和踩坑清单。看完你不仅能写出能跑的代码,还能理解它们各自的适用边界,下次遇到 Java字符串校验 的疑问可以自己判断。今天这篇文章,编程狮就把这块讲透。
一、先搞清楚「纯数字」到底指什么
所谓「Java判断纯数字」,指的是判断一个字符串的每一个字符都是 0 到 9 的数字,中间不能夹带字母、空格、小数点或其他符号。例如 "12345" 是纯数字,"12a45"、"12.5"、" 123" 都不是。想系统学字符串,可以先过一遍 Java 教程 里数组与字符串的章节。
之所以要先定义清楚,是因为很多新手会把「能不能转成数字」和「是不是纯数字」混为一谈。比如 "12.5" 能被 Double.parseDouble 转成小数,但它含有小数点,并不是「纯数字串」。如果你的业务只接受整数编号,就必须用更严格的数字格式校验。
1.1 常见的几种输入场景
| 输入样例 | 是否纯数字 | 说明 |
|---|---|---|
"12345" |
是 | 连续整数 |
"007" |
是 | 前导零也是数字 |
"12.5" |
否 | 含小数点 |
" 123" |
否 | 含空格 |
"12a45" |
否 | 夹带字母 |
⚠️ 注意:如果数字可能带正负号(如
"-12")或小数点,下面的「纯数字」判断会把它判为非数字。需要支持这类格式时,请改用「尝试转换」法,见第四节。
1.2 一个容易踩的坑
不少初学者会先用 Integer.parseInt 转一下,转成功就当它是纯数字。但 parseInt 能解析 "007"、也能解析带符号的 "-12",语义比「纯数字」宽。如果你要严格只接受 0-9 连续字符,正则或字符判断更可靠。
二、方法一:正则表达式匹配(最推荐)
正则表达式是判断字符串格式最直观的工具。把「纯数字」写成一条规则:^ 表示开头,[0-9]+ 表示「一个或多个数字」,$ 表示结尾。合起来 ^[0-9]+$ 就表示「从头到尾全是数字」。
如果你还不熟悉正则的基本写法,可以先翻 Java 速查手册 查常用方法,或者系统学一遍 Java 里字符串与正则的章节。
public class CheckDigit {
public static boolean isPureNumber(String s) {
if (s == null || s.isEmpty()) {
return false;
}
return s.matches("[0-9]+");
}
public static void main(String[] args) {
System.out.println(isPureNumber("12345")); // true
System.out.println(isPureNumber("12a45")); // false
System.out.println(isPureNumber("")); // false
}
}
上面这段做的是:先排除空值和空串,再用 String.matches 做整串匹配。输出分别是 true、false、false。
💡 小提示:如果你也要接受前导正号(如
"+123"),可以把规则改成^[+]?[0-9]+$。语法细节记不住时,随时回看上面的正则写法即可。
三、方法二:逐字符判断(不依赖正则)
如果不想引入正则,也可以手动遍历字符串的每一个字符,用 Character.isDigit 判断它是不是数字。只要有一个字符不是数字,就立刻返回 false。
public class CheckDigit {
public static boolean isPureNumber(String s) {
if (s == null || s.isEmpty()) {
return false;
}
for (int i = 0; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
return false;
}
}
return true;
}
}
上面这段做的是:从第一个字符扫到最后一个,遇到非数字字符立刻退出。这种字符判断逻辑透明,方便你在判断时顺便做别的处理(比如顺带统计数字个数)。
⚠️ 注意:
Character.isDigit不只认 0-9,它还会把某些全角数字(如阿拉伯语、印度语数字字符)也判为 true。如果你的系统只在中文环境运行、输入又来自用户键盘,一般没问题;若要求严格只接受 ASCII 的 0-9,可以改成s.charAt(i) &= '0' && s.charAt(i) <= '9',这样最稳。
四、方法三:尝试转换 + 捕获异常(支持小数和符号)
前两种方法只认「连续整数」。如果你的输入可能是 "-12"、"3.14" 这类带符号或小数的数字,可以反过来想:试着把它转成数字,转成功就说明「能当数字用」。
和「判断是不是纯数字」相对,如果你要做的是把字符串解析成数字去计算,可以看这篇 Java 怎么把字符串转成数字,讲的就是反方向的操作。
public class CheckDigit {
public static boolean isNumberLike(String s) {
if (s == null || s.isEmpty()) {
return false;
}
try {
Double.parseDouble(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
上面这段做的是:用 Double.parseDouble 尝试解析,成功返回 true;抛 NumberFormatException 就说明不是合法数字,返回 false。这种方法语义是「能不能当数字」,比「纯数字」更宽,适合做通用的输入校验。
| 方法 | 是否接受小数 | 是否接受符号 | 依赖 | 适用场景 |
|---|---|---|---|---|
| 正则表达式 | 否(除非改规则) | 否(除非改规则) | 正则 | 严格整数编号校验 |
| 逐字符判断 | 否 | 否 | 无 | 不想用正则、逻辑透明 |
| 异常捕获 | 是 | 是 | 无 | 通用数字输入校验 |
表:三种判断方法横向对比。严格整数编号用正则或逐字符,需要同时支持小数和符号时用异常捕获。

五、踩坑清单
把读者最容易卡住的三个点列出来:
- 空指针风险:直接对
null调用matches或charAt会抛NullPointerException。务必先判空。 - 空串误判:
""没有字符,正则[0-9]+要求至少一个数字,所以返回false,但逐字符写法若忘判空会返回true,两法不一致,记得统一处理空串。 - 全角数字陷阱:
Character.isDigit('1')可能返回true,造成「看起来不是数字却判通过了」。严格要求 ASCII 数字时用范围比较更稳妥。
总结
判断 Java 字符串是不是纯数字,最稳妥的是用 ^[0-9]+$ 正则一次性匹配;想要逻辑透明可以逐字符判断;需要同时支持小数和符号时,用「尝试转换 + 捕获异常」最省事。
要点带走:
- 严格整数编号用正则或逐字符,别用
parseInt兜底; - 任何方法都要先判空,避免
NullPointerException; - 需要支持小数、符号时,改用「异常捕获」法。
下一步建议把 Java基础 打牢,再去了解 Java 里关于正则表达式的进阶用法,处理更复杂的格式校验会轻松很多。
延伸学习
想把 Java 字符串处理这块系统补齐,可以按这个顺序来:
常见问题
Q:为什么我用了 parseInt 没报错,但字符串里明明有字母?
A:因为 parseInt 只解析到不能解析的位置就停,比如 "12a45" 可能被截成 12 而不报错(取决于具体写法)。要严格判断,请用正则或逐字符法。
*Q:正则里的 + 和 `有什么区别?** A:+表示「至少一个」,表示「零个或多个」。用[0-9]会把空串也判为 true,判断纯数字要用[0-9]+`。
Q:要不要考虑全角数字「123」?
A:一般用户键盘输入是半角,不用管;若输入来源复杂,用 s.charAt(i) >= '0' && s.charAt(i) <= '9' 范围判断最严格,能排除所有全角字符。
Q:判断手机号该用哪种方法?
A:手机号是固定 11 位半角数字,用 ^[0-9]{11}$ 正则可同时限制长度和字符集,比通用判断更精准。

免费 AI IDE



