问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

你知道ApacheCommon包中isNumeric方法是坑吗?

发布网友 发布时间:2024-04-01 12:00

我来回答

1个回答

热心网友 时间:2024-04-01 15:58

使用的Apache-Common包的版本是commons-lang-2.6.jar
本文就来分享一个这个坑的情况,以免其它tx也掉坑中
费话不多说,来看代码: package chapter4; import org.apache.commons.lang.StringUtils; /** * Created by MyWorld on 2016/3/24. */ public class StringUtilsIsNumericChecker { public static void main(String[] args) { System.out.println(StringUtils.isNumeric("1")); System.out.println(StringUtils.isNumeric("-1")); } }

围观的tx,认为上面api的输出结果会是什么呢?两个true? 好吧,执行一行看看结果: true false

什么情况,-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; }

源码中判断是否数字的依据是JDK的API: java.lang.Character.isDigit(str.charAt(i)) 看看个API的源码: public static boolean isDigit(char ch) { return isDigit((int)ch); }

看看isDigit(int codePoint)的源码: 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; }

下面还有更深的调用,貌似还涉及到ASCII码了。 水太深,就不继续看了。 有一点是肯定的,这个API不是通过类似Regex expression的方式来判断是数字,而通过每个字符的ASCII的值类确定的 回到API的isNumeric(String str), 看看Doc是怎么说的: /** * pChecks if the String contains only unicode digits. * A decimal point is not a unicode digit and returns false./p * * pcodenull/code will return codefalse/code. * An empty String (length()=0) will return codetrue/code./p * * pre * 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 * /pre * * @param str the String to check, may be null * @return codetrue/code if only contains digits, and is non-null */

看完上面的Doc,感觉水好深。 这个API的方法名直接命名为isInt不就完了。方法名很容易误导人 这也是给开发的tx敲了一个警钟, api使用之前一定要确认清楚,至少看看Doc文档吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 这几天左手掌心总能闻到一股尿骚味,用香皂洗也洗不掉... ...杜甫的《三绝句》,秦韬玉的《燕子》的意思分别是什么? 吉斯沙发属于什么档次 吃艾司唑仑能喝糯米酒吗 怎么样用英语问人家的工作地点 ...一个脑筋急转弯:你赛跑,你超过了第一名,那你是第几名? 张翰感慨“错过了就是错过了”,那什么样的爱情才能长久? 殒身不恤的意思是什么殒身不恤的解释 民办学校大四会不会偷偷安排清考 好听又好记的 女性毛孔粗大,都有什么好办法解决? 雾海微岩精油皂如何辨别真假 脸上长了好多痘痘用海德福雾海微岩皂洗脸可以吗? 人间自有深情在作文开头 苏州大学纳米毕业待遇 ...是增生。但现在舌头在口腔里很不适,怎样才能修复好舌头黏膜昵。谢谢... 脸特别干,最近又长痘痘,怎么办 黑神话悟空什么时候封测 ...关于带异步复位电平触发器问题 到底是怎么看的 完全不懂啊 比如下... 吃了安眠药2颗,多少小时后可以开车 errmsg:conflg:paramisempty是什么意思 房产中介谈:买二手房会遇到哪些问题,六点教你买到合适的二手房 如何才能买到合适的二手房? 绕过二手房的12个坑 才能买到称心如意的房 买二手房地段好的会和没有优势的便宜该怎么办 北京到成都z49停运了吗? ...说要我等他他,他知道我喜欢他。有时我想他想的好辛苦! 我告诉我喜欢的男生说我等他他回复嗯嗯他啥意思? 判决书拍照照片可以用? 派出所开的判决通知书不让拍照片怎么办 男朋友在服刑得两年如果我等他他会感动么? 左眼白眼球有弹簧状血丝是怎么回事? 学校一般用什么牌子的净水器? 如何制作圆柱体 pl10是主动弹吗?为什么制导是半主动雷达制导?这是什么意思?还有j20装... 胡彦斌新专辑《红歌》分别有什么歌曲啊?先谢了! 云知道正品美妆小铺黛儿姿丹纯中药美白祛斑霜秘制套装美白淡斑正品... 异地办护照需要多少天 ...急的情况下都才能尿矿泉水瓶半瓶不到,这样正常吗? a bunch of grapes是限定词吗