StringUtils.isNumeric(String str) 的一个坑(转)

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

 

在项目中遇到一处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; if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX) { bDigit = CharacterDataLatin1.isDigit(codePoint); } else { int plane = getPlane(codePoint); switch(plane) { case(0): bDigit = CharacterData00.isDigit(codePoint); break; case(1): bDigit = CharacterData01.isDigit(codePoint); break; case(2): bDigit = CharacterData02.isDigit(codePoint); break; case(3): // Undefined case(4): // Undefined case(5): // Undefined case(6): // Undefined case(7): // Undefined case(8): // Undefined case(9): // Undefined case(10): // Undefined case(11): // Undefined case(12): // Undefined case(13): // Undefined bDigit = CharacterDataUndefined.isDigit(codePoint); break; case(14): bDigit = CharacterData0E.isDigit(codePoint); break; case(15): // Private Use case(16): // Private Use bDigit = CharacterDataPrivateUse.isDigit(codePoint); break; default: // the argument's plane is invalid, and thus is an invalid codepoint // bDigit remains false; break; } } return bDigit; }
复制代码

在下面一步失败:

 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

相关文章
|
16天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
106 65
|
17天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
36 1
|
6月前
|
存储 Java 对象存储
String str="Hello" 与 String str=new String(“Hello”)一样吗?
String str="Hello" 与 String str=new String(“Hello”)一样吗?
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
|
C# 索引
C#基础⑨——字符串(string str = null 与string str = ““的区别)
字符串数组变字符串(字符串数组变新的字符串数组)
|
存储 算法 Java
从 KMP算法到 Java的 String.indexOf(String str)方法
从 KMP算法到 Java的 String.indexOf(String str)方法
290 0
Java 最常见的面试题:String str="i"与 String str=new String("i")一样吗?
Java 最常见的面试题:String str="i"与 String str=new String("i")一样吗?
「JDK」解析 String str=““与 new String()
一、基础概念 为了讲清楚他们的差异,这里先介绍几个概念。 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。
|
安全
string null和“”的区别 str == null; "".equals(str); str.length 0; str.isEmpty();的区别
string null和“”的区别 str == null; "".equals(str); str.length 0; str.isEmpty();的区别
113 0
String str=“i“与 String str=new String(“i”)一样吗?面试篇(第八天)
String str=“i“与 String str=new String(“i”)一样吗?本文带大家回答这个问题。
396 0
String str=“i“与 String str=new String(“i”)一样吗?面试篇(第八天)
下一篇
无影云桌面