用Integer.parseInt()转数字再转字符串最稳妥,可自动跳过前导零、空格及正负号,但要求输入为合法整数格式,否则抛NumberFormatException;全零串如"000"会正确变为"0"。

用 Integer.parseInt() 去前导零最稳妥
字符串转数字再转回字符串,是去除前导零最不容易出错的方式。它天然跳过所有前导 0,还自动处理空格、正负号等边界情况。
但要注意:输入必须是合法整数格式,否则抛 NumberFormatException。
- 适用场景:
"00123"、"-0045"、" 0007 "(注意parseInt会忽略首尾空白) - 不适用:
"00a12"、"00.5"、""、"000"(最后这个会变成"0",不是空字符串) - 如果原始字符串可能为纯零(如
"000"),且你希望结果仍是"0"而非空,这种方式刚好符合预期
用正则 ^0+(?=d) 替换要小心贪婪匹配
正则能保留非数字字符、不转类型,适合混合内容场景,但默认的 ^0* 容易误杀。
关键在断言:用 ^0+(?=d) 确保只去掉开头连续的 0,且后面紧跟着一个数字(避免把 "000" 全干掉)。
立即学习“Java免费学习笔记(深入)”;
- 正确示例:
"000123".replaceAll("^0+(?=\d)", "")→"123" - 错误写法:
"000".replaceAll("^0*", "")→ 结果为空字符串,不符合多数业务对全零串的预期 - Java 中正则的
?和=必须转义反斜杠,所以实际写成"^0+(?=\d)" - 性能上,正则比
parseInt略慢,但差异通常可忽略;若批量处理百万级字符串,建议压测对比
别用 String.trim().replaceFirst("^0+", "") 直接砍
这是新手常写的“看起来能跑”的写法,但埋了三个坑:
-
replaceFirst("^0+", "")没有断言,"000"变成空,"00abc"变成"abc"(删掉了本不该动的前缀) - 没处理空字符串或只有空白的输入,
trim()后可能为"",再调replaceFirst没问题,但接着调parseInt就崩 - 没考虑负号:
"-0012"会被误处理成"-12"?不,这反而是对的;但"-000"会变"-",直接报错
当字符串可能超 int 范围时,改用 new BigInteger(s).toString()
Integer.parseInt() 最大只支持 2147483647,遇到 "001234567890123456789" 这种长数字就挂。
-
BigInteger不丢精度,构造时自动去前导零,toString()输出干净数字 - 代价是对象创建开销更大,GC 压力略高;日常用
long足够的场景,别无脑上BigInteger - 注意:
new BigInteger(" 00123 ")会失败,它不忽略空白,得先trim()
真正容易被忽略的是全零串和空输入的语义——业务到底要 "0"、空字符串,还是抛异常?正则和数值转换走的是不同逻辑分支,选哪种方式,得先想清楚这个。










