StringUtils.isNumeric()方法规范在逻辑上是否正确?

And*_*okh 10 java string apache-commons-lang

Apache的StringUtils.isNumeric()方法规范说:
检查String是否只包含unicode数字.小数点不是unicode数字并返回false. Null会回来的false.空的String ("")将返回true.

这在逻辑上是对的吗?为什么他们将空字符串视为数字?

aio*_*obe 13

行为在3.0中发生了变化.来自Commons Lang 3.0的新功能?:

StringUtils.isAlpha,isNumeric和isAlphanumeric现在在传递空String时都返回false.以前他们回来了.

保留下面的旧答案,供参考和3.0之前的用户使用.


这在逻辑上是对的吗?

我们有

  1. 方法的行为
  2. 方法的文档(通常被视为规范或合同)
  3. 方法的名称

在这种情况下,1和2彼此一致; 空字符串中的所有字符都是unicode数字.(或者等效地,空字符串中的字符不是 unicode数字.)这就是逻辑学家所谓的真实而且有点反直觉.这就像说我公寓里的所有大象都是绿色的.这是真的,因为我公寓里没有大象.

但是,项目3(方法的名称)自然地被解释为如果给定的字符串表示数字则返回true的方法.

所以,它是文档和实现错误,或者它是一个命名错误.对此没有正确或错误的答案.

这里提出一个错误.维护者认为它是预期的行为.

为什么他们将空字符串视为数字?

虽然方法的名称可能会让您相信该方法应仅对表示数字的字符串返回true,但规范实际上表示如果字符串仅包含unicode数字,则应返回true.

你说,

我很困惑,因为规范说:"检查String是否只包含unicode数字." 我没有看到""包含数字....

请注意,空字符串不包含除unicode数字之外的任何内容.因此该方法返回true.

  • 你也可以争辩说空字符串中的所有字符都不是unicode数字. (4认同)

And*_*okh 6

不仅仅是我问了这个问题:) 人们在 Apache 的 Jira 中打开了这个缺陷:https : //issues.apache.org/jira/browse/LANG-428

他们关闭而不修复它只是为了保持向后兼容性(遵循方法规范)。

但是大家一致认为目前方法的行为是错误的。


irr*_*ble 5

java.lang.Integer.parseInt("") 将失败.

这不是逻辑问题.这也不是常识问题 - 没有任何数字代表没有符号.没有强有力的论据为什么空字符串应该代表0.

如果方法名称是containsOnlyNumeric(),根据我们的数学教科书,很自然地为""返回true.但是,方法名称是isNumeric(),""的处理并不自然.此外,没有明显的理由为什么null应该返回false.我会抛出null的异常.

但事实就是如此,它有详细记录,还有什么可以要求的?