各位码林高手们好!今天要介绍的是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的"养生之道"
- 防御性编程:永远不用担心NullPointerException
- 宽容处理:自动清理非数字字符
- 类型智能:自动选择最合适的数字类型
- 性能考虑:比手动try-catch更高效
五、"用药"注意事项
- 精度问题:浮点数运算仍有精度限制
- 范围检查:大数转换仍需注意溢出
- 特殊格式:非常规数字格式建议先预处理
- 替代方案: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() == b | NumberUtils.compare(a,b) |
最大值查找 | Math.max(a, b) | NumberUtils.max(array) |
数字验证 | 正则表达式 | NumberUtils.isCreatable() |