org.apache.commons.lang.math.NumberUtils#isNumber 解释

源码

/*** <p>Checks whether the String a valid Java number.</p>** <p>Valid numbers include hexadecimal marked with the <code>0x</code>* qualifier, scientific notation and numbers marked with a type* qualifier (e.g. 123L).</p>** <p><code>Null</code> and empty String will return* <code>false</code>.</p>** @param str  the <code>String</code> to check* @return <code>true</code> if the string is a correctly formatted number*/public static boolean isNumber(String str) {if (StringUtils.isEmpty(str)) {return false;}char[] chars = str.toCharArray();int sz = chars.length;boolean hasExp = false;boolean hasDecPoint = false;boolean allowSigns = false;boolean foundDigit = false;// deal with any possible sign up frontint start = (chars[0] == '-') ? 1 : 0;if (sz > start + 1) {if (chars[start] == '0' && chars[start + 1] == 'x') {int i = start + 2;if (i == sz) {return false; // str == "0x"}// checking hex (it can't be anything else)for (; i < chars.length; i++) {if ((chars[i] < '0' || chars[i] > '9')&& (chars[i] < 'a' || chars[i] > 'f')&& (chars[i] < 'A' || chars[i] > 'F')) {return false;}}return true;}}sz--; // don't want to loop to the last char, check it afterwords// for type qualifiersint i = start;// loop to the next to last char or to the last char if we need another digit to// make a valid number (e.g. chars[0..5] = "1234E")while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {if (chars[i] >= '0' && chars[i] <= '9') {foundDigit = true;allowSigns = false;} else if (chars[i] == '.') {if (hasDecPoint || hasExp) {// two decimal points or dec in exponent   return false;}hasDecPoint = true;} else if (chars[i] == 'e' || chars[i] == 'E') {// we've already taken care of hex.if (hasExp) {// two E'sreturn false;}if (!foundDigit) {return false;}hasExp = true;allowSigns = true;} else if (chars[i] == '+' || chars[i] == '-') {if (!allowSigns) {return false;}allowSigns = false;foundDigit = false; // we need a digit after the E} else {return false;}i++;}if (i < chars.length) {if (chars[i] >= '0' && chars[i] <= '9') {// no type qualifier, OKreturn true;}if (chars[i] == 'e' || chars[i] == 'E') {// can't have an E at the last bytereturn false;}if (chars[i] == '.') {if (hasDecPoint || hasExp) {// two decimal points or dec in exponentreturn false;}// single trailing decimal point after non-exponent is okreturn foundDigit;}if (!allowSigns&& (chars[i] == 'd'|| chars[i] == 'D'|| chars[i] == 'f'|| chars[i] == 'F')) {return foundDigit;}if (chars[i] == 'l'|| chars[i] == 'L') {// not allowing L with an exponentreturn foundDigit && !hasExp;}// last character is illegalreturn false;}// allowSigns is true iff the val ends in 'E'// found digit it to make sure weird stuff like '.' and '1E-' doesn't passreturn !allowSigns && foundDigit;}

NumberUtils#isNumber 解释

org.apache.commons.lang.math.NumberUtils#isNumber 的作用是检查一个字符串是否可以被解析为一个有效的数字。这包括整数、浮点数、科学计数法表示的数以及十六进制数。下面是对代码的逐步解释:

  1. 初始检查:首先,使用 StringUtils.isEmpty(str) 检查输入字符串是否为空或为 null。如果是,方法返回 false

  2. 处理十六进制数:接下来,代码检查字符串是否以 “0x” 开头,这表明它可能是一个十六进制数。如果是,它将遍历字符串的其余部分,确保每个字符都是有效的十六进制数字(0-9, a-f, A-F)。如果所有字符都有效,方法返回 true

  3. 设置循环变量和条件:代码设置了几个变量来跟踪解析过程中的状态,包括是否发现了指数部分 (hasExp)、是否有小数点 (hasDecPoint)、是否允许符号 (allowSigns)、是否找到了数字 (foundDigit)。循环从字符串的开始(或跳过了负号后的第一个字符)开始,直到字符串的倒数第二个字符,或者在需要另一个数字来形成有效数字时直到最后一个字符。

  4. 循环解析字符:在循环中,代码根据当前字符的类型更新状态变量。如果字符是数字,foundDigit 设置为 trueallowSigns 设置为 false。如果字符是小数点,检查是否已经有小数点或指数部分,如果有,则返回 false。如果字符是 ‘e’ 或 ‘E’,检查是否已经有指数部分或之前没有找到数字,如果是,则返回 false;否则,设置 hasExptrue 并允许后续出现符号。如果字符是 ‘+’ 或 ‘-’,检查是否允许符号,如果不允许,则返回 false;否则,重置 allowSignsfoundDigit

  5. 检查最后一个字符:循环结束后,代码检查字符串的最后一个字符。如果是数字,返回 true。如果是 ‘e’ 或 ‘E’,返回 false,因为不能以指数符号结束。如果是小数点,检查是否已经有小数点或指数部分,如果没有且之前找到了数字,则返回 true。如果是类型限定符(‘d’, ‘D’, ‘f’, ‘F’, ‘l’, ‘L’),根据之前的状态返回相应的结果。

  6. 返回结果:最后,如果没有找到不合法的情况,检查 allowSignsfoundDigit 的状态,如果没有挂起的指数符号且至少找到了一个数字,则返回 true;否则,返回 false

总之,这段代码通过一系列的检查和状态跟踪,来判断一个字符串是否可以被解析为一个有效的数字。

NumberUtils.isNumber 示例

下面是一些使用 NumberUtils.isNumber(String str) 方法的示例,以及每个示例的预期返回结果。这些示例展示了不同类型的字符串输入和该方法如何判断它们是否可以被解析为有效的数字。

NumberUtils.isNumber("123"); // true - 正整数
NumberUtils.isNumber("-123"); // true - 负整数
NumberUtils.isNumber("123.45"); // true - 正浮点数
NumberUtils.isNumber("-123.45"); // true - 负浮点数
NumberUtils.isNumber("0.123"); // true - 小于1的浮点数
NumberUtils.isNumber("-0.123"); // true - 小于0的负浮点数
NumberUtils.isNumber("123E4"); // true - 科学计数法
NumberUtils.isNumber("-123E4"); // true - 负的科学计数法
NumberUtils.isNumber("123.45E-6"); // true - 带小数点的科学计数法
NumberUtils.isNumber("0x1A"); // true - 十六进制数
NumberUtils.isNumber("0x1G"); // false - 无效的十六进制数('G' 不是十六进制字符)
NumberUtils.isNumber("123L"); // true - 长整型
NumberUtils.isNumber("NaN"); // false - 不是有效的数字格式
NumberUtils.isNumber("INF"); // false - 不是有效的数字格式
NumberUtils.isNumber(""); // false - 空字符串
NumberUtils.isNumber(null); // false - null 值

请注意,这些示例假设 NumberUtils.isNumber(String str) 方法的实现与之前讨论的代码逻辑一致。实际的返回结果可能会根据具体实现的细节有所不同。

NumberUtils.isCreatable(str) 和 NumberUtils.isNumber(str) 区别

NumberUtils.isCreatable(String str)NumberUtils.isNumber(String str) 都是 Apache Commons Lang 库中的方法,用于判断一个字符串是否可以解析为一个数字。它们之间的主要区别在于它们对可解析数字的定义和容忍度。

  1. NumberUtils.isNumber(String str)(在Apache Commons Lang 3.4及之前的版本中使用):

    • 这个方法用于判断一个字符串是否可以解析为一个有效的Java数字,包括整数、浮点数、和科学计数法表示的数字。
    • 它不接受十六进制格式的数字字符串。
    • 它对于一些边界情况的处理可能不够严格,例如,对于以多个零开头的字符串可能会返回 true
  2. NumberUtils.isCreatable(String str)(在Apache Commons Lang 3.5及之后的版本中引入):

    • 这个方法提供了一个更全面和严格的方式来判断一个字符串是否可以解析为一个数字。
    • 它接受更广泛的数字格式,包括十六进制、八进制和科学计数法。
    • 它更严格地验证字符串格式,以确保解析的数字是有效的。例如,它会检查十六进制数是否只包含有效的十六进制字符。

简而言之,NumberUtils.isCreatable(String str)NumberUtils.isNumber(String str) 的一个改进和扩展版本,提供了更广泛的数字格式支持和更严格的验证。如果你的项目使用的是 Apache Commons Lang 3.5 或更高版本,建议使用 NumberUtils.isCreatable(String str) 来判断字符串是否可以解析为数字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题 1. 在全局环境下 在全局环境中&#xff08;在浏览器中是 window 对象&#xff0c;在Node.js中是 global 对象&#xff09;&#xff0c;this 指向全局对象。 console.log(this window); // 在浏览器中为 true console.log(this.document ! undefined); //…

如何练高音技巧

如何练高音技巧 高音的练习技巧有&#xff1a;练“a”(啊)音&#xff0c;让口腔打开&#xff0c;声带放松&#xff0c;反复几次&#xff1b;再练“u”(呜)音&#xff0c;这个音可以有按摩声带的功能&#xff0c;也使声带进一步放松&#xff1b;发“i”(衣)音&#xff0c;逐步加…

缓存失效问题-雪崩/击穿/穿透

1. 缓存雪崩 1.1. 定义 大量缓存同一时间失效&#xff0c;大量访问数据库。 1.2. 发生条件 大量key相同过期时间缓存服务器重启 1.3. 解决方案 设置随机的缓存过期时间缓存预热高可用缓存集群降级限流 2. 缓存击穿 2.1. 定义 一个热点数据在缓存里失效&#xff0c;很多…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的…

大模型本地化部署2-Docker部署MaxKB

大模型本地化部署2-Docker部署MaxKB 0、MaxKB简介1、安装docker2、在docker中拉取MaxKB镜像3、运行镜像4、访问MaxKB5、创建应用6、使用应用进行对话 0、MaxKB简介 MaxKB是一款基于LLM大预言模型的知识库问答系统。具有以下特点&#xff1a; 多模型支持&#xff1a;支持对接主…

开放式耳机怎么戴?佩戴舒适在线的几款开放式耳机分享

开放式耳机的佩戴方式与传统的入耳式耳机有所不同&#xff0c;它采用了一种挂耳式的设计&#xff0c;提供了一种新颖的佩戴体验&#xff0c;以下是开放式耳机的佩戴方式。 1. 开箱及外观&#xff1a;首先&#xff0c;从包装盒中取出耳机及其配件&#xff0c;包括耳机本体、充电…

什么是密码学?

什么是密码学&#xff1f; 密码学是一种通过使用编码算法、哈希和签名来保护信息的实践。此信息可以处于静态&#xff08;例如硬盘驱动器上的文件&#xff09;、传输中&#xff08;例如两方或多方之间交换的电子通信&#xff09;或使用中&#xff08;在对数据进行计算时&#…

软件造价之如何确定定开和成品软件的边界?

在软件项目中&#xff0c;我们常常面临选择&#xff1a;是直接购买并使用成品软件&#xff0c;还是根据特定需求定制开发&#xff1f;这一决策不仅关乎项目成本也关乎到我们成本测算方法的选择。因此&#xff0c;明确定开与成品软件的边界&#xff0c;是软件造价的首要任务。 …

设计模式-结构性模式-桥接模式

1.桥接模式定义 桥接模式就是将抽象部分与他的实现部分分离&#xff0c;使他们都可以独立的变化&#xff1b; 桥接模式用一种巧妙地方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c;将类之间的静态继承关系转变为动态的组合关系&#xff0c;…

vs属性表生效顺序

vs属性表生效顺序 在VS中打开一个项目&#xff0c;在属性管理器中可以看到很多属性表&#xff0c;如下&#xff1a; Application Unicode Support Core windows Libraries相信很多人会有和我一样的疑惑&#xff0c;这么多属性表&#xff0c;最终的属性以哪个表为准呢&#xf…

Leetcode JAVA刷刷站(99)恢复二叉搜索树

一、题目概述 二、思路方向 要解决这个问题&#xff0c;我们可以采用中序遍历二叉搜索树&#xff08;BST&#xff09;的方法&#xff0c;因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了&#xff0c;所以中序遍历的结果中将有两个位置上的元素是逆序的。…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 I…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

Html5—表单

第三章 表单 表单 第三章 表单3.1表单元素3.1.1表单格式3.1.2表格元素格式3.1.3元素属性3.1.4元素标注3.1.5 表单初级验证 3.1表单元素 3.1.1表单格式 <!-- action:表单向何处发送method:get/post, 表单提交方式get:比较快&#xff0c;当不安全post:安全&#xff0c;比较慢…

【STM32】FMC

FMC功能与FSMC类似&#xff0c;但比FSMC更强大&#xff0c;但仅在F4 / F7 / H7等高级一点的MCU上支持&#xff0c;F1不支持。虽然我的是F103&#xff0c;但顺便都看了。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框&#xff0c;多种方式的逻辑&#xff0c;多种场景 原先通过实战总结&#xff0c;基本的知识推荐阅读&#xff1a; 详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#x…

秋招复习笔记——嵌入式裸机开发

底层相关的内容&#xff0c;之前掌握的不扎实&#xff0c;现在重新把相关重点记录一下&#xff0c;做个笔记记诵。 相关基础知识 ST简单内容 用的F103ZET6&#xff0c;72MHz&#xff0c;FLASH是512KB&#xff0c;SRAM是64KB&#xff0c;144个引脚&#xff0c;2基本定时器&am…

MATLAB算法实战应用案例精讲-【采样路径规划算法】RRT算法(附MATLAB源码)

目录 前言 算法原理 算法流程 算法流程图 优缺点 伪代码 知识拓展 基于BINN算法的CCPP全路径覆盖算法 1、CCPP整体算法 2. 核心代码 代码 1.MATLAB 前言 RRT算法是适用于高维空间,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,较好的处理带有非…

密码学之广播加密

1.什么是广播加密 广播加密是一种支持在不安全的公开信道上实现多用户数据安全共享的加密技术&#xff0c;适用于一对多安全传输场景。 2.广播加密的工作原理 数据拥有者首先选取一组接收者&#xff0c;运行广播加密算法&#xff0c;将加密得到的密文发布到公开信道&#xf…

百度ERNIE-SDK使用示例

百度ERNIE-SDK使用示例 文档 https://github.com/PaddlePaddle/ERNIE-SDK/blob/develop/erniebot/README.md https://ernie-bot-agent.readthedocs.io 调用大模型示例 import erniebot from typing import List, Optionalimport requests import jsonimport asyncio import…