忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景
,开始使用 NumberUtils.isNumber() 提示错误
,没有解决问题(可能是因为依赖版本导致
),最后使用的是StringUtils.isNumeric()
,当时关于这个问题场景的Bolog也放到了草稿箱中,一直保留至今才抽时间补充起来…
其实问题早已解决,但是不影响我们再好好读一下 StringUtils、NumberUtils源码,以便在更多场景中活学活用
- 触发场景
- 基础了解
- StringUtils
- 判空 isEmpty(空)、isNotEmpty(非空)
- 判空 isBlank(空)、isNotBlank(非空)- 过滤空格
- 过滤、去除 strip、stripToEmpty、stripStart等
- 判断 是否为数字 isNumeric、isNumericSpace
- NumberUtils
- 俩数比较
- 获取 最大值、最小值
- 判断 字符串是否为数字、是否全为数字
- 创建 create基本类型
- 转换 to基本类型
触发场景
当时所处理场景( Java、Android工具整理 - 单位换算),需注意 当时调用的StringUtils是alipay封装的
基础了解
其实不论是StringUtils
,还是NumberUtils
都是 org.apache.commons.lang3 提供的工具类;依赖引用 implementation 'org.apache.commons:commons-lang3:3.9'
build.gradle
implementation 'org.apache.commons:commons-lang3:3.9'
org.apache.commons.lang3
StringUtils
StringUtils官方文档 (导入包:import org.apache.commons.lang3.StringUtils;
)
其实在学习源码中,你会发现可以很便捷的找到方法,同时这些方法的一些实际使用都有标明示例
判空 isEmpty(空)、isNotEmpty(非空)
开发中isEmpty
、isNotEmpty
使用非常频繁,正好看看源码(感觉看过后都没必要介绍了...
)
isEmpty :判断条件以 null 或 String长度为标准
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //内部空格默认 length()==1,故为false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false
isNotEmpty:内部实现直接是 !isEmpty,简而言之就是 只要不为null 或 String.length() >0 即为非空
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty("bob") = true
StringUtils.isNotEmpty(" bob ") = true
判空 isBlank(空)、isNotBlank(非空)- 过滤空格
这俩个API好像使用的频率稍微低一些,于上者的区别主要在于对 " " 场景的定义
对应Api调用时的示例都有,我们主要看一下isBlank内部实现,首先它具备了isEmpty的判断条件,同时也会判断是否存在空格,这里判断语句应该代表着如果不为空格就返回false,为空格的话也是返回true
;关于 isNotBlank
的实现直接调用的 !isBlank
~
过滤、去除 strip、stripToEmpty、stripStart等
在开发中有一个很常见的场景:经常需要去除字符串中的空格,或者某些数据~
StringUtils.strip
提供的一些方法
stripToNull、stripToEmpty
共同点:都调用了strip(str, null)
当数据为空或null
时,有一些不同点
stripToNull
判断字符串为空时,返回的值为null
stripToEmpty
判断字符串为空时,返回的值为 ""
找点不足:只能去除前后空格,字符串中的间的空格无法去除!
strip :当需要过滤特定数据或空串时可直接使用strip方法,第二个参数为需要过滤的数据
找些不足
无筛选条件下(及为null 或 ""),首尾空格都可以去除
有筛选条件下优先去除筛选数据,空格可能会残留
(如果有需要,可以二次调用特意除去空格)当过滤数据位于其余数据中,可能会出现无法筛选的情况
,类似以下场景
StringUtils.strip(" abcyx", "xyz") // 输出: abc
StringUtils.strip(" abycyx", "xyz") // 输出: abyc
从strip 方法可以看到stripStart、stripEnd ,,有兴趣的可以,稍微看一下
- 内部一个是
正序
过滤,一个是倒序
过滤 - 过滤场景也是一个注重头部,一个注重尾部
stripStart
stripEnd
判断 是否为数字 isNumeric、isNumericSpace
isNumeric
只有纯整数才会返回true,其余类型均为false,例如浮点型、正负数等
假设你需要判断是否为数字,及整数、小数的话,可以用 NumberUtils.isCreatable()
isNumericSpace
通过源码可以发现是在isNumeric的基础上,过滤了空串
,支持以下场景可以
StringUtils.isNumeric("10000").toString() //输出:true
StringUtils.isNumericSpace("10 000").toString() //输出:true
StringUtils.isNumericSpace("10 00 0 ").toString() //输出:true
NumberUtils
NumberUtils官方文档(导入包:import org.apache.commons.lang3.math.NumberUtils;
)
有兴趣的可以直接跳 NumberUtils
类,通过 Ctrl+F12
查看方法
俩数比较
compare
只能比较俩个数值(如果涉及多数值比较,可看看max、min满不满足需求
)
示例
NumberUtils.compare(1, 2); // -1 参数1比参数2大,返回1,否则返回-1
通过源码,可证明 参数1比参数2大,返回1,否则返回-1
获取 最大值、最小值
不论是最大值还是最小值,都有重载方法,可以传入一个数组,或者是3个数值
最小值
示例
NumberUtils.min(new int[]{3, 5, 9})); // 3
NumberUtils.min(3, 1, 4)); // 1
最大值
示例
NumberUtils.max(new int[]{3, 5, 9}); // 9
NumberUtils.max(3, 1, 4); // 4
判断 字符串是否为数字、是否全为数字
isCreatable
检查字符串是否为数字
- isCreatable 最新
- isNumber 过时方法
NumberUtils.isCreatable("3.4"); // true
NumberUtils.isNumber("123"); // true
·isDigits
判断字符串中是否全为数字
NumberUtils.isDigits("0000000000.596"); // false
NumberUtils.isDigits("0000000000596"); // true
创建 create基本类型
Api | 含义 |
---|---|
createInteger | 通过字符串创建Integer |
createLong | 通过字符串创建Long |
createFloat | 通过字符串创建Float |
createDouble | 通过字符串创建Double |
createNumber | 通过字符串创建Number |
createBigInteger | 通过字符串创建BigInteger |
createBigDecimal | 通过字符串创建BigDecimal类型,支持long、int、float、double、number等数值 |
As 智能提示
NumberUtils
NumberUtils.createInteger("11")
NumberUtils.createDouble("10")
等同于 Java
Integer.parseInt("11");
Double.parseDouble("10");
等同于 Kt(Kt自带类型推导,使用便捷
)
"11".toInt()
"10".toDouble()
Kt的to类型
,其内部源码也是封装了对应的扩展函数,实现也是用的Java的parse类型
实现方式
转换 to基本类型
以 toInt 为例
As 智能提示
如果传空串,返回1,否则字符串转换为Int值
NumberUtils.toInt("10",1);
通过toInt源码
可以发现 to类型方法都是通过Java的parse类型转换,只是针对空值可设置返回默认值