上一篇
小王最近在开发一个电商平台,用户在前端输入商品价格时,有人手滑输入了"99元"或者"一二三",后台直接炸出一堆NumberFormatException
!🤯 这时候就需要一套可靠的数字校验方案——不仅要识别"123"这样的标准数字,还得对付"3.14"、"1E5"甚至中文数字!
try-catch
public static boolean isNumericSimple(String str) { try { Double.parseDouble(str); return true; } catch (NumberFormatException e) { return false; } }
✅ 优点:
❌ 缺点:
💡 适用场景:对输入格式较信任的快速校验
str.matches("-?\\d+"); // 匹配"123", "-456"
str.matches("-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?"); // 匹配"3.14", "-2.5e10", "1E-5"
// 禁止前导零(如"0123")、必须含小数点等 str.matches("-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?");
✅ 优点:
❌ 缺点:
🛠️ 实战技巧:用
Pattern.compile()
预编译正则提升性能
NumberUtils.isCreatable("3.14"); // 支持多种格式 NumberUtils.isParsable("100"); // 仅基础数字
Doubles.tryParse("2.5"); // 返回非null即成功
✅ 优点:
❌ 缺点:
有时候我们还需要区分纯数字串(如电话号码"13800138000")和可计算数字:
// 判断是否为纯数字串(不含符号/小数点) boolean isDigitString = str.chars().allMatch(Character::isDigit); // 判断是否可转为有意义的数值 boolean isRealNumber = str.matches("..."); // 结合前述正则
场景 | 推荐方案 |
---|---|
快速验证用户输入 | try-catch + 正则混合使用 |
高性能批量校验 | 预编译正则表达式 |
企业级复杂系统 | Commons Lang + 自定义规则 |
需要精确类型控制 | 多正则组合 + 手动解析 |
NumberFormat
处理 trim()
再校验 Long.parseLong()
遇到超长数字会溢出 本文由 生亦玉 于2025-07-31发表在【云服务器提供商】,文中图片由(生亦玉)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/490337.html
发表评论