NumberUtils:你的数字“老中医“——专治各种数字疑难杂症

各位码林高手们好!今天要介绍的是Apache Commons Lang3中的NumberUtils工具类。这个工具就像数字界的"老中医",专治各种数字处理中的头疼脑热、腰酸背痛,让你的代码告别"数字恐惧症"!

一、NumberUtils是何方神圣?

想象一下这些场景:

  • 用户输入"123abc"说是年龄?
  • 要从字符串"¥1,000"中提取金额?
  • 要比较两个数字却不知道它们可能是Integer、Long或Double?

这时候NumberUtils就会跳出来说:“放着我来!”

// 普通青年写法
try {
    int age = Integer.parseInt("42");
} catch (NumberFormatException e) {
    // 又双叒叕异常了!
}

// NumberUtils青年写法
int age = NumberUtils.toInt("42", 0); // 第二个参数是默认值

二、NumberUtils的"诊疗项目"

1. 数字转换"把脉术"

  • toInt()/toLong()/toDouble():安全转换,不怕异常
  • createNumber():自动识别数字类型(Integer/Long/Float/Double)
System.out.println(NumberUtils.toInt("42岁", 18));  // 输出:18(转换失败用默认值)
System.out.println(NumberUtils.toDouble("3.14%"));  // 输出:3.14(自动去除非数字字符)

Number num = NumberUtils.createNumber("123456789012345");
System.out.println(num.getClass().getSimpleName());  // 输出:Long(自动选择合适类型)

2. 数字验证"体检中心"

  • isDigits():是否全是数字
  • isParsable():是否能被解析为数字
  • isCreatable():更强大的数字格式判断(支持十六进制、科学计数法等)
System.out.println(NumberUtils.isDigits("123"));    // true
System.out.println(NumberUtils.isDigits("12.3"));   // false
System.out.println(NumberUtils.isCreatable("0x10")); // true(十六进制)
System.out.println(NumberUtils.isCreatable("1.23E-4")); // true(科学计数法)

3. 数字比较"会诊室"

  • compare():安全比较各种Number类型
  • max()/min():找最大最小值(支持多种类型和数组)
Integer a = 100;
Long b = 100L;
System.out.println(NumberUtils.compare(a, b));  // 输出:0(相等)

int[] nums = {1, 3, 5, 2, 4};
System.out.println(NumberUtils.max(nums));  // 输出:5

4. 数字运算"理疗科"

  • add()/substract():安全算术运算(自动处理null)
  • isInRange():检查数字是否在范围内
System.out.println(NumberUtils.add(1, null));  // 输出:1(null视为0)
System.out.println(NumberUtils.isInRange(5, 1, 10));  // true

三、特色"偏方"展示

1. 处理货币字符串

String price = "$1,234.56";
double value = NumberUtils.toDouble(price.replaceAll("[^0-9.]", ""));
System.out.println(value);  // 输出:1234.56

2. 智能百分比转换

String percent = "75%";
double ratio = NumberUtils.toDouble(percent.replace("%", "")) / 100;
System.out.println(ratio);  // 输出:0.75

3. 生成随机数范围

int randomNum = NumberUtils.nextRandomInt(10, 20);  // 10到19的随机数

四、NumberUtils的"养生之道"

  1. 防御性编程:永远不用担心NullPointerException
  2. 宽容处理:自动清理非数字字符
  3. 类型智能:自动选择最合适的数字类型
  4. 性能考虑:比手动try-catch更高效

五、"用药"注意事项

  1. 精度问题:浮点数运算仍有精度限制
  2. 范围检查:大数转换仍需注意溢出
  3. 特殊格式:非常规数字格式建议先预处理
  4. 替代方案:Java 8的Optional/Stream也能处理部分场景

六、现代"中西医结合"疗法

// Java 8+ 风格
Optional.ofNullable("123")
        .filter(NumberUtils::isDigits)
        .map(Integer::parseInt)
        .ifPresent(System.out::println);

// 与BigDecimal配合使用
String money = "$1,234.56";
BigDecimal amount = new BigDecimal(
    NumberUtils.toDouble(money.replaceAll("[^0-9.]", ""), 0)
);

七、总结

NumberUtils就像是:

  • 数字解析界的"老中医"👴
  • 类型转换的"变形金刚"🤖
  • 异常处理的"防弹衣"🦺
  • 数值比较的"公平秤"⚖️

记住代码界的金句:“数字处理不规范,debug两行泪”

最后附上数字类型处理对照表:

场景危险做法NumberUtils安全做法
字符串转数字Integer.parseInt()NumberUtils.toInt()
数字比较a.intValue() == bNumberUtils.compare(a,b)
最大值查找Math.max(a, b)NumberUtils.max(array)
数字验证正则表达式NumberUtils.isCreatable()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五行星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值