Apache的StringUtils.isNumeric()
方法规范说:
检查String是否仅包含unicode数字。小数点不是unicode数字并返回false
。
Null
将返回false
。空String ("")
将返回true
。
这在逻辑上是对的吗? 为什么他们将空字符串视为数字?
答案 0 :(得分:12)
3.0中的行为发生了变化。来自What's new in Commons Lang 3.0?:
StringUtils.isAlpha,isNumeric和isAlphanumeric现在在传递空String时都返回false。以前他们回来了。
保留下面的旧答案,供参考和3.0之前的用户使用。
这在逻辑上是正确的吗?
我们有
在这种情况下,1和2彼此一致;空字符串中的所有字符都是unicode数字。 (或者等效地,空字符串中没有字符是不是 unicode数字。)这就是逻辑学家称之为vacuously true并且有点反直觉。这就像说我公寓里的所有大象都是绿色的。这是真的,因为我公寓里没有大象。
然而,项目3(方法的名称)自然地被解释为如果给定的字符串表示数字则返回true的方法。
所以,无论是文档和实现错误,还是一个命名错误。对此没有正确或错误的答案。
提交了一个错误here。维护者认为这是预期的行为。
为什么他们会将空字符串视为数字?
虽然方法的名称可能会让您相信该方法只应对表示数字的字符串返回true,但规范实际上表示如果字符串仅包含unicode数字,则应返回true。
你说,
我很困惑,因为规范说:“检查String是否只包含unicode数字。”我没有看到“”包含数字....
请注意,空字符串不包含除unicode数字之外的任何内容。因此该方法返回true。
答案 1 :(得分:5)
java.lang.Integer.parseInt("")
将失败。
这不是逻辑问题。这也不是常识问题 - 没有任何数字代表没有符号。没有强有力的论据为什么空字符串应该代表0。
如果方法名称是containsOnlyNumeric()
,根据我们的数学教科书,很自然地为“”返回true。但是,方法名称为isNumeric()
,“”的处理方式并不自然。此外,没有明显的原因null
应该返回false。我会抛出null的异常。
但它是什么,它有详细记录,还有什么可以要求?
答案 2 :(得分:3)
不仅有我问过这个问题:) 人们在Apache的Jira中打开了这个缺陷: https://issues.apache.org/jira/browse/LANG-428
他们关闭而不修复它只是为了保持向后兼容性(遵循方法规范)。
但是大家都同意当前的方法行为是错误的。
答案 3 :(得分:3)
首先检查字符串是否为空()的条件。
if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) {
}
然后你的问题就会解决。
但还有一个问题是你传递负值,如
str = "-1";
StringUtils.isNumeric(str)
这将是假的。
你需要照顾这种情况。
答案 4 :(得分:0)
还有另一种解决方案。 NumberUtils.isNumber 这将检查它是否为Long,Double,Integer。
希望这个帮助
答案 5 :(得分:0)
从Commons Lang 3.5开始,NumberUtils.isCreatable是实现此目的的方法。有关详细说明,请参见this answer。