Java 怎么判断字符串是不是纯数字?附 3 种方法

编程狮(w3cschool.cn) 2026-08-20 15:10:39 浏览数 (26)
反馈

Java 怎么判断字符串是不是纯数字?

你在做用户注册、表单提交或者读配置文件时,一定碰到过这种情况:用户输入了一串字符,你得先确认它到底是不是数字,才能拿去做年龄校验、金额计算或者编号拼接。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 做整串匹配。输出分别是 truefalsefalse

💡 小提示:如果你也要接受前导正号(如 "+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。这种方法语义是「能不能当数字」,比「纯数字」更宽,适合做通用的输入校验。

方法 是否接受小数 是否接受符号 依赖 适用场景
正则表达式 否(除非改规则) 否(除非改规则) 正则 严格整数编号校验
逐字符判断 不想用正则、逻辑透明
异常捕获 通用数字输入校验

表:三种判断方法横向对比。严格整数编号用正则或逐字符,需要同时支持小数和符号时用异常捕获。

Java 判断纯数字的三种方法怎么选?

五、踩坑清单

把读者最容易卡住的三个点列出来:

  • 空指针风险:直接对 null 调用 matchescharAt 会抛 NullPointerException。务必先判空。
  • 空串误判"" 没有字符,正则 [0-9]+ 要求至少一个数字,所以返回 false,但逐字符写法若忘判空会返回 true,两法不一致,记得统一处理空串。
  • 全角数字陷阱Character.isDigit('1') 可能返回 true,造成「看起来不是数字却判通过了」。严格要求 ASCII 数字时用范围比较更稳妥。

总结

判断 Java 字符串是不是纯数字,最稳妥的是用 ^[0-9]+$ 正则一次性匹配;想要逻辑透明可以逐字符判断;需要同时支持小数和符号时,用「尝试转换 + 捕获异常」最省事。

要点带走:

  • 严格整数编号用正则或逐字符,别用 parseInt 兜底;
  • 任何方法都要先判空,避免 NullPointerException
  • 需要支持小数、符号时,改用「异常捕获」法。

下一步建议把 Java基础 打牢,再去了解 Java 里关于正则表达式的进阶用法,处理更复杂的格式校验会轻松很多。

延伸学习

想把 Java 字符串处理这块系统补齐,可以按这个顺序来:

  1. 想继续深入字符串操作,可以看 Java含子串,了解另一个高频判断场景;
  2. 想动手练,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}$ 正则可同时限制长度和字符集,比通用判断更精准。

0 人点赞