忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景
,开始使用 NumberUtils.isNumber() 提示错误
,没有解决问题(可能是因为依赖版本导致
),最后使用的是StringUtils.isNumeric()
,当时关于这个问题场景的Bolog也放到了草稿箱中,一直保留至今才抽时间补充起来…
其实问题早已解决,但是不影响我们再好好读一下 StringUtils、NumberUtils源码,以便在更多场景中活学活用
当时所处理场景( 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官方文档 (导入包:import org.apache.commons.lang3.StringUtils;
)
其实在学习源码中,你会发现可以很便捷的找到方法,同时这些方法的一些实际使用都有标明示例
开发中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
这俩个API好像使用的频率稍微低一些,于上者的区别主要在于对 " " 场景的定义
对应Api调用时的示例都有,我们主要看一下isBlank内部实现,首先它具备了isEmpty的判断条件,同时也会判断是否存在空格,这里判断语句应该代表着如果不为空格就返回false,为空格的话也是返回true
;关于 isNotBlank
的实现直接调用的 !isBlank
~
在开发中有一个很常见的场景:经常需要去除字符串中的空格,或者某些数据~
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
其实 trim
和 strip
有些地方还是挺相同的,都可以去除字符串中首位空格
;相比而言trim功能能独立一些,strip扩展性多一些
通过 StringUtils.trim
,查看相关API
trim:当数据为null、空字符串串、仅有空格字符串,根据传值返回 null、""、期望值
我自己试了一下" a b c ",果然是不支持去除中间空格的
StringUtils.trim("")) //输出:""
StringUtils.trim(" ")) //输出:""
StringUtils.trim(" abc ")) //输出:abc
StringUtils.trim(" a b c ") //输出:a b c
稍微注意下 StringUtils.trim(null)
,正常开发中在它上一层应该是已经抛去null场景
了,假设遇到需要关注下以下问题
这种写法一般会导致程序奔溃,应该是空指针异常
var trim = StringUtils.trim(null)
Log.e("tag", trim.toString())
如果想在这种场景使用的话,可以写个方法默认返回"",如下
var trim = StringUtils.trim(null)
if (StringUtils.isEmpty(trim)) trim = ""
Log.e("tag", trim.toString())
trimToNull、trimToEmpty
:当数据为null、空字符串串、仅有空格字符串
时,返回值有所不同
trimToNull
:返回的值为null
trimToEmpty
:返回的值为 ""
trimToNull:当数据为null、空字符串串、仅有空格字符串,都会返回 null
trimToEmpty:当数据为null、空字符串串、仅有空格字符串,都会返回 ""
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官方文档(导入包: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
检查字符串是否为数字
NumberUtils.isCreatable("3.4"); // true
NumberUtils.isNumber("123"); // true
·isDigits
判断字符串中是否全为数字
NumberUtils.isDigits("0000000000.596"); // false
NumberUtils.isDigits("0000000000596"); // true
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类型
实现方式
以 toInt 为例
As 智能提示
如果传空串,返回1,否则字符串转换为Int值
NumberUtils.toInt("10",1);
通过toInt源码
可以发现 to类型方法都是通过Java的parse类型转换,只是针对空值可设置返回默认值