StringUtils.isNumeric(str)

article/2025/11/10 19:16:00

 

在项目中遇到一处bug,调试的结果竟然是StringUtils.isNumeric(String str) 在捣鬼(采用的是org.apache.commons.lang.StringUtils),下面的代码是判断一个参数非空,且为整数:

if(StringUtils.isNumeric(str) && StringUtils.isNotBlank(str)){// do sth
}

在简单不过的代码,却隐藏着bug !

因为如果 str = "-1"; StringUtils.isNumeric(str) 返回的是 false! 真是肯爹不偿命啊。

下面是测试:

public static void main(String[] args)
{System.out.println(StringUtils.isNumeric("-1"));
}

运行结果:false

肯爹吧?用正则表达式实现不是很简单吗?怎么会这样,看了下源码:

复制代码
public static boolean isNumeric(String str) {if (str == null) { return false; } int sz = str.length(); for (int i = 0; i < sz; i++) { if (Character.isDigit(str.charAt(i)) == false) { return false; } } return true; }
复制代码

继续跳进去:

public static boolean isDigit(char ch) {return isDigit((int)ch); }

继续:

复制代码
public static boolean isDigit(int codePoint) {boolean bDigit = false; 
    <span style="color:#0000ff;">if (codePoint &gt;= MIN_CODE_POINT &amp;&amp; codePoint &lt;=<span style="color:#000000;"> FAST_PATH_MAX) {bDigit =<span style="color:#000000;"> CharacterDataLatin1.isDigit(codePoint);} <span style="color:#0000ff;">else<span style="color:#000000;"> {<span style="color:#0000ff;">int plane =<span style="color:#000000;"> getPlane(codePoint);<span style="color:#0000ff;">switch<span style="color:#000000;">(plane) {<span style="color:#0000ff;">case(0<span style="color:#000000;">):bDigit =<span style="color:#000000;"> CharacterData00.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">case(1<span style="color:#000000;">):bDigit =<span style="color:#000000;"> CharacterData01.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">case(2<span style="color:#000000;">):bDigit =<span style="color:#000000;"> CharacterData02.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">case(3): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(4): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(5): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(6): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(7): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(8): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(9): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(10): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(11): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(12): <span style="color:#008000;">//<span style="color:#008000;"> Undefined<span style="color:#0000ff;">case(13): <span style="color:#008000;">//<span style="color:#008000;"> UndefinedbDigit =<span style="color:#000000;"> CharacterDataUndefined.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">case(14<span style="color:#000000;">):bDigit =<span style="color:#000000;"> CharacterData0E.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">case(15): <span style="color:#008000;">//<span style="color:#008000;"> Private Use<span style="color:#0000ff;">case(16): <span style="color:#008000;">//<span style="color:#008000;"> Private UsebDigit =<span style="color:#000000;"> CharacterDataPrivateUse.isDigit(codePoint);<span style="color:#0000ff;">break<span style="color:#000000;">;<span style="color:#0000ff;">default<span style="color:#000000;">:<span style="color:#008000;">//<span style="color:#008000;"> the argument's plane is invalid, and thus is an invalid codepoint<span style="color:#008000;">//<span style="color:#008000;"> bDigit remains false;<span style="color:#0000ff;">break<span style="color:#000000;">;                          }}<span style="color:#0000ff;">return<span style="color:#000000;"> bDigit;
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
复制代码

在下面一步失败:

 static boolean isDigit(int ch) {int type = getType(ch); return (type == Character.DECIMAL_DIGIT_NUMBER); }

也就是说他的实现完全没有考虑到 - + 前缀的问题,这不是傻叉吗?

下面的结果都是 false:

public static void main(String[] args)
{System.out.println(StringUtils.isNumeric("-1"));System.out.println(StringUtils.isNumeric("+1")); }

这是他的方法注释:

复制代码
Checks if the String contains only unicode digits. A decimal point is not a unicode digit and returns false.

null will return false. An empty String ("") will return true.

StringUtils.isNumeric(null) = false
StringUtils.isNumeric("") = true
StringUtils.isNumeric(" ") = false
StringUtils.isNumeric(“123”) = true
StringUtils.isNumeric(“12 3”) = false
StringUtils.isNumeric(“ab2c”) = false
StringUtils.isNumeric(“12-3”) = false
StringUtils.isNumeric(“12.3”) = false

Parameters:
str the String to check, may be null
Returns:
true if only contains digits, and is non-null

复制代码

只能包含 unicode 的数字, +, -, . 三者都不能算作是unicode 数字。

 

 

http://www.cnblogs.com/digdeep/p/4207097.html


http://chatgpt.dhexx.cn/article/ns3BODvf.shtml

相关文章

第六十七章 SQL函数 ISNUMERIC

文章目录 第六十七章 SQL函数 ISNUMERIC大纲参数描述示例 第六十七章 SQL函数 ISNUMERIC 测试有效数字的数值函数。 大纲 ISNUMERIC(check-expression)参数 check-expression - 要计算的表达式。 ISNUMERIC返回SMALLINT数据类型。 描述 ISNUMERIC计算check-expression并…

isnumeric( )函数用法

isnumeric( )还是一个很实用的函数&#xff0c;在算法题目里面应该会有比较大的作用。 检测字符串是否只由数字组成&#xff0c;如果字符串中只包括数字&#xff0c;就返回Ture&#xff0c;否则返回False。 华为的一道算法题&#xff1a; 读入一个字符串str&#xff0c;输出字…

MAE:视觉自监督2021(原理+代码)

文章目录 前言一、MAE原理遮住95%的像素后&#xff0c;仍能还原出物体的轮廓&#xff0c;效果如图&#xff1a; 二、MAE测试代码1.models_mae.py1.1 self.forward_encoder1.2 self.forward_decoder1.3 loss self.forward_loss(imgs, pred, mask) 2.run_one_image 三、MAE升级版…

​一文看尽MAE最新进展!恺明的MAE已经提出大半年,目前发展如何?

©PaperWeekly 原创 作者 | Jason研究方向 | 计算机视觉 写在前面 自去年 11 月份恺明大神提出 MAE 来&#xff0c;大家都被 MAE 简单的实现、极高的效率和惊艳的性能所吸引。近几个月&#xff0c;大家也纷纷 follow 恺明的工作&#xff0c;在 MAE 进行改进&#xff08;如…

一文解读Masked Autoencoder(MAE)

前言 论文链接&#xff1a;https://arxiv.org/pdf/2111.06377.pdf   跟李沐学AI&#xff1a;https://www.bilibili.com/video/BV1sq4y1q77t?spm_id_from333.999.0.0   如果说Vision Transformer是Transformer在CV领域的拓展&#xff0c;那么Masked Autoencoder就是BERT在C…

matlab mse mae,回归评价指标MSE、RMSE、MAE、R-Squared

前言 分类问题的评价指标是准确率,那么回归算法的评价指标就是MSE,RMSE,MAE、R-Squared。下面一一介绍 均方误差(MSE) MSE (Mean Squared Error)叫做均方误差。看公式 image.png 这里的y是测试集上的。 用 真实值-预测值 然后平方之后求和平均。 猛着看一下这个公式是不是觉…

何凯明最新一作MAE(mask掉图片的部分信息也能重建识别)

导读 凯明出品&#xff0c;必属精品。没有花里胡哨的修饰&#xff0c;MAE就是那么简单的强大&#xff0c;即结构简单但可扩展性能强大。MAE通过设计一个非对称的编码解码器&#xff0c;在预训练阶段&#xff0c;通过高比例的掩码原图&#xff0c;将可见部分输入到编码器中&…

李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》

论文&#xff1a;Masked Autoencoders Are Scalable Vision Learners 别再无聊地吹捧了&#xff0c;一起来动手实现 MAE(Masked Autoencoders Are Scalable Vision Learners) 玩玩吧&#xff01; - 知乎 参考博文&#xff1a;MAE 论文逐段精读【论文精读】 - 哔哩哔哩 神洛华…

从Transformer到ViT再到MAE

从Transformer到VIT再到MAE 引言Transfomer提出的背景模型架构具体细节Add&NormAttention&#xff1a;Multi-Head Attention自注意力机制&#xff08;self attention&#xff09;Positional Encoding ViT提出的背景&#xff1a;模型架构&#xff1a;具体细节&#xff1a;维…

MAE简记

MAE简记 文章目录 MAE简记Mask 方法EncoderDecoderTarget & LOSS Mask 方法 将图片分割成不重复的正方形patch&#xff0c;遮挡其中一部分patch(75%) Encoder 采用ViT&#xff0c;但是只对可见的没有被masked的patch使用 Decoder 以encoder的输出masked的patch作为输入…

何凯明最新一作MAE解读系列1

导读 凯明出品&#xff0c;必属精品。没有花里胡哨的修饰&#xff0c;MAE就是那么简单的强大&#xff0c;即结构简单但可扩展性能强大。MAE通过设计一个非对称的编码解码器&#xff0c;在预训练阶段&#xff0c;通过高比例的掩码原图&#xff0c;将可见部分输入到编码器中&…

基于CIFAR数据集 进行 MAE实现及预训练可视化 (CIFAR for MAE,代码权重日志全部开源,自取)

基于CIFAR数据集 进行 MAE实现及预训练可视化 &#xff08;CIFAR for MAE&#xff0c;代码权重日志全部开源&#xff0c;自取&#xff09; 文章目录 基于CIFAR数据集 进行 MAE实现及预训练可视化 &#xff08;CIFAR for MAE&#xff0c;代码权重日志全部开源&#xff0c;自取&a…

PyTorch笔记 - MAE(Masked Autoencoders) PyTorch源码

欢迎关注我的CSDN&#xff1a;https://blog.csdn.net/caroline_wendy 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/128382935 Paper&#xff1a;MAE - Masked Autoencoders Are Scalable Vision Learners 掩码的自编码器是可扩展的视觉学习器 …

何凯明新作MAE 学习笔记

【MAE与之前AI和CV领域最新工作的关系】 学习MAE视频【李沐】 He, K., Chen, X., Xie, S., Li, Y., Dollr, P., & Girshick, R. (2021). Masked autoencoders are scalable vision learners. arXiv preprint arXiv:2111.06377. 【Transformer】 Transforme纯注意力&…

MAE 代码实战详解

MAE 代码实战详解 if__name__"__main__"model.forwardmodel.forward.encordermodel.forward.decordermodel.forward.loss大小排序索引-有点神奇torch.gather if__name__“main” MAE 模型选择 def mae_vit_base_patch16_dec512d8b(**kwargs):model MaskedAutoenco…

MAE(Masked Autoencoders) 详解

MAE详解 0. 引言1. 网络结构1.1 Mask 策略1.2 Encoder1.3 Decoder 2. 关键问题解答2.1 进行分类任务怎么来做&#xff1f;2.2 非对称的编码器和解码器机制的介绍2.3 损失函数是怎么计算的&#xff1f;2.4 bert把mask放在编码端&#xff0c;为什么MAE加在解码端&#xff1f; 3. …

MAE-DET学习笔记

MAE-DET学习笔记 MAE-DET: Revisiting Maximum Entropy Principle in Zero-Shot NAS for Efficient Object Detection Abstract 在对象检测中&#xff0c;检测主干消耗了整个推理成本的一半以上。最近的研究试图通过借助神经架构搜索&#xff08;NAS&#xff09;优化主干架构…

MAE论文解读

文章目录 创新点算法原理MaskingMAE encoderMAE decoder重构目标 实验Baseline: ViT-Large.消融实验Mask token自监督方法比较迁移至目标检测任务及语义分割任务 结论 论文: 《Masked Autoencoders Are Scalable Vision Learners》 代码: https://github.com/facebookresearc…

MSE与MAE

均方误差 均方误差(MSE)是最常用的回归损失函数&#xff0c;计算方法是求预测值与真实值之间距离的平方和&#xff0c;公式如图。 下图是MSE函数的图像&#xff0c;其中目标值是100&#xff0c;预测值的范围从-10000到10000&#xff0c;Y轴代表的MSE取值范围是从0到正无穷&…

论文阅读|MAE

Masked Autoencoders Are Scalable Vision Learners 参考资料 Self-Supervised Learning 超详细解读 (六)&#xff1a;MAE&#xff1a;通向 CV 大模型 - 知乎 (zhihu.com) Self-Supervised Learning 超详细解读 (目录) - 知乎 (zhihu.com)、 1. 有监督&#xff08;Supervise…