Android进阶之路 - StringUtils、NumberUtils 场景源码
忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景
,开始使用 NumberUtils.isNumber() 提示错误
,没有解决问题(可能是因为依赖版本导致
),最后使用的是StringUtils.isNumeric()
,当时关于这个问题场景的Bolog也放到了草稿箱中,一直保留至今才抽时间补充起来…
其实问题早已解决,但是不影响我们再好好读一下 StringUtils、NumberUtils源码,以便在更多场景中活学活用
- 触发场景
- 基础了解
- StringUtils
- 判空 isEmpty(空)、isNotEmpty(非空)
- 判空 isBlank(空)、isNotBlank(非空)- 过滤空格
- 过滤、去除 strip、stripToEmpty、stripStart、stripToNull、stripToEmpty 等
- 去空 trim、trimToNull、trimToEmpty
- 判断 是否为数字 isNumeric、isNumericSpace
- NumberUtils
- 俩数比较
- 获取 最大值、最小值
- 判断 字符串是否为数字、是否全为数字
- 类型创建 createInteger、createDouble 、createLong等
- 类型转换 toInt、toDouble、toLong等
触发场景
当时所处理场景( 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) = trueStringUtils.isEmpty("") = trueStringUtils.isEmpty(" ") = false //内部空格默认 length()==1,故为falseStringUtils.isEmpty("bob") = falseStringUtils.isEmpty(" bob ") = false
isNotEmpty:内部实现直接是 !isEmpty,简而言之就是 只要不为null 或 String.length() >0 即为非空
StringUtils.isNotEmpty(null) = falseStringUtils.isNotEmpty("") = falseStringUtils.isNotEmpty(" ") = trueStringUtils.isNotEmpty("bob") = trueStringUtils.isNotEmpty(" bob ") = true
判空 isBlank(空)、isNotBlank(非空)- 过滤空格
这俩个API好像使用的频率稍微低一些,于上者的区别主要在于对 " " 场景的定义
对应Api调用时的示例都有,我们主要看一下isBlank内部实现,首先它具备了isEmpty的判断条件,同时也会判断是否存在空格,这里判断语句应该代表着如果不为空格就返回false,为空格的话也是返回true
;关于 isNotBlank
的实现直接调用的 !isBlank
~
过滤、去除 strip、stripToEmpty、stripStart、stripToNull、stripToEmpty 等
在开发中有一个很常见的场景:经常需要去除字符串中的空格,或者某些数据~
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、trimToNull、trimToEmpty
其实 trim
和 strip
有些地方还是挺相同的,都可以去除字符串中首位空格
;相比而言trim功能能独立一些,strip扩展性多一些
通过 StringUtils.trim
,查看相关API
trim:当数据为null、空字符串串、仅有空格字符串,根据传值返回 null、""、期望值
我自己试了一下" a b c ",果然是不支持去除中间空格的
StringUtils.trim("")) //输出:""StringUtils.trim(" ")) //输出:""StringUtils.trim(" abc ")) //输出:abcStringUtils.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、isNumericSpace
isNumeric
只有纯整数才会返回true,其余类型均为false,例如浮点型、正负数等
假设你需要判断是否为数字,及整数、小数的话,可以用 NumberUtils.isCreatable()
isNumericSpace
通过源码可以发现是在isNumeric的基础上,过滤了空串
,支持以下场景可以
StringUtils.isNumeric("10000").toString() //输出:trueStringUtils.isNumericSpace("10 000").toString() //输出:trueStringUtils.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})); // 3NumberUtils.min(3, 1, 4)); // 1
最大值
示例
NumberUtils.max(new int[]{3, 5, 9}); // 9NumberUtils.max(3, 1, 4); // 4
判断 字符串是否为数字、是否全为数字
isCreatable
检查字符串是否为数字
- isCreatable 最新
- isNumber 过时方法
NumberUtils.isCreatable("3.4"); // trueNumberUtils.isNumber("123"); // true
·isDigits
判断字符串中是否全为数字
NumberUtils.isDigits("0000000000.596"); // falseNumberUtils.isDigits("0000000000596"); // true
类型创建 createInteger、createDouble 、createLong等
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、toDouble、toLong等
以 toInt 为例
As 智能提示
如果传空串,返回1,否则字符串转换为Int值
NumberUtils.toInt("10",1);
通过toInt源码
可以发现 to类型方法都是通过Java的parse类型转换,只是针对空值可设置返回默认值
相关文章:

Android进阶之路 - StringUtils、NumberUtils 场景源码
忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景,开始使用 NumberUtils.isNumber() 提示错误 ,没有解决问题(可能是因为依赖版本导致),最后使用的是StringUtils.isNumeric(),当时关…...

装备制造业数字化转型CRM系统解决方案(信息图)
一、制造企业面临的机遇与挑战 2021年12月28日,工业和信息化部等八部门联合对外发布《“十四五”智能制造发展规划》,明确提到“推进智能制造,要立足制造本质,紧扣智能特征,以工艺、装备为核心,以数据为基…...

CGAL 二维剖分
目录一、 2D Triangulations1、定义2 Representation2.1 The Set of Faces2.2 A Representation Based on Faces and Vertices3 Software Design4 Basic Triangulations4.1 Description遍历三角网顶点4.2 Implementation4.3 Geometric Traits4.4 Example of a Basic Triangulat…...

node.js+vue婚纱影楼摄影婚庆管理系统vscode项目
:减少管理婚庆工作人员的负担;管理人员可以随时浏览婚纱网站以便及时知道哪里需要修改和更进,同时还可以查看用户反馈给我们的信息,让管理员更加直观的了解客户的需求;该系统改变了以前手工记录的方式,使用…...
C语言 指针的新理解
16年写了很多 C 与 C 相关的文章,但是后面从事了 Android 开发,就全部删掉了,无意中发现了这篇由还存在草稿箱,索性就找回来吧,也是追忆当年学习的青葱岁月 1.指针就是一个存储了其他变量地址的变量。 指针存储的是整…...

【向每个应用View中增加子控件 Objective-C语言】
一、把刚才计算九宫格的思路再给大家过一遍 1.现在我们要计算九宫格坐标 1)先把每一个格子,每一个九宫格的大小,先确定了, 在这里先指定宽和高 CGFloat appW = 75; CGFloat appH = 90; 2)再去计算第一个格子的一些间距, 到上面的间距,marginTop = 30; 再计算出…...

【FPGA】Verilog:组合电路设计 | 三输入 | 多数表决器
前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载的示例:表决器(三人表决器)。 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部…...

【安全等保】安全等保二级和三级哪个高?哪个费用更高?
等保政策已经严格落地执行了,各大企业纷纷接到了过等保的通知,但有的估计是第一次听到等保,对于等保相关政策都是非常蒙圈的。这不不少企业相关负责人在问,安全等保二级和三级哪个高?哪个费用更高?这里我们…...
C++ STL学习记录(v1)
C STL学习记录一. 什么是STL1.1 STL的诞生1.2 STL基本概念1.3 STL的六大组件1.4 STL中的容器、算法、迭代器1.5 容器、算法、迭代器实践一. 什么是STL 1.1 STL的诞生 STL建立的目的就是为了解决软件界复用性的需求。C的面向对象和泛型编程思想,目的就是为了复用性的…...
开发中遇到的问题
1.当写一个导出功能时,因为编码写URL地址&参数的时候,用反转字符串的时候换行了,造成地址拼接不成,一直报错,后来发现是编码格式造成的,已解决。 解决方案:不换行或者用 “”拼接 2.当本地…...
Javascript笔记
数据类型 基本类型(primitive value) 简单的数据段,包括 Undefined, Null, Boolean, Number, String初始化只使用2原始字面量形式,如果使用new则会创建Object无法加入新的属性 引用类型(reference value) 可能由多个值构成的对象判断类型 typeofinstanc…...
Elasticsearch(ES)配置及优化
在Elasticsearch中,索引的大小和存储能力取决于多个因素,包括文档大小、索引的分片数、硬件规格、查询负载和其他因素。索引和分片配置:索引和分片的数量和配置会对查询并发性能产生影响。如果索引和分片的数量太少,可能会导致查询…...

一文看懂Java语言与Java生态圈
Java语言与Java生态圈 1、Oracle JDK与Open JDK之间的关系 Oracle JDK Java最早是由SUN公司发明,Oracle JDK之前叫SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购之后被名为Oracle JDK,实际上࿰…...
GitHub 上有什么嵌入式方面的项目?
原文直达,喜欢就点个赞吧! GitHub 上有什么嵌入式方面的项目? - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/27835930/answer/2871624679 前言 对于GitHub,可能做互联网开发的同学会更加熟悉,尤其是前端࿰…...

【C语言进阶】结构体、位段、枚举和联合
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...
markdown和latex常用部分参考@注脚@链接跳转@csdn
文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links🎈Reference LinksURLs文章内部跳转(Heading IDs)🎈My Great Heading注脚(Footnotes)…...

Java 在二叉树中增加一行
623. 在二叉树中增加一行中等给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。注意,根节点 root 位于深度 1 。加法规则如下:给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur…...

kubernetes(k8s) 知识总结(第2期)
1. “控制器”思想 kube-controller-manager 是一系列控制器的集合,这些控制器被放在 Kubernetes 项目的 pkg/controller 目录,这些控制器都以独有的方式负责某种编排功能。它们都遵循一个通用的编排模式——控制循环。 以 Deployment 为例介绍它对控…...

windows-Mysql的主从数据库同步设置
复制原有的mysql修改my.ini配置文件 修改端口号修改从数据的地址和从数据库的数据存放地址安装从数据库进入从数据库的bin目录,打开命令窗口输入命令:mysqld.exe install mysql-back --defaults-file "C:\ProgramData\MySQL\MySQL Server 5.7-back\…...

Docker逃逸
文章目录原理环境搭建Docker 环境判断Docker 容器逃逸特权模式逃逸如何判断是否为特权模式逃逸docker.sock挂载逃逸逃逸Remote API未授权访问未授权访问逃逸容器服务缺陷逃逸影响版本环境搭建逃逸脏牛漏洞逃逸参考原理 docker其实就是一个linux下的进程,它通过Name…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...