12

Apache 的StringUtils.isNumeric()方法规范说:
检查字符串是否只包含 unicode 数字。小数点不是 unicode 数字并返回falseNull将返回false。一个空的String ("")将返回true

这在逻辑上正确吗?为什么他们将空字符串视为数字?

4

6 回答 6

14

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

StringUtils.isAlpha、isNumeric 和 isAlphanumeric 现在在传递空字符串时都返回 false。以前他们返回真。

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


这在逻辑上正确吗?

我们有

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

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

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

所以,要么是文档和实现错误,要么是命名错误。对此没有正确或错误的答案。

在这里提交了一个错误。维护者认为这是预期的行为。

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

虽然方法的名称可能会让您相信该方法应该只对表示数字的字符串返回 true,但规范实际上说它应该在字符串仅包含 unicode 数字时返回 true。

你说,

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

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

于 2010-10-20T12:40:38.677 回答
7

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

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

但是每个人都同意方法的当前行为是错误的。

于 2010-10-20T16:15:18.160 回答
6

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

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

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

但它就是这样,它有据可查,你还能要求什么?

于 2010-10-20T15:50:23.960 回答
4

首先检查字符串是否为空()的条件。

if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) {

}

那么你的问题就会得到解决。

但还有一个问题是您传递负值,例如

str = "-1";

StringUtils.isNumeric(str)这将是错误的。

您需要注意这种情况。

于 2014-04-17T07:41:59.837 回答
0

从 Commons Lang 3.5 开始,NumberUtils.isCreatable是执行此操作的方法。有关更详细的说明,请参阅此答案。

于 2020-04-17T18:08:40.063 回答
0

还有另一种解决方案。NumberUtils.isNumber 这将检查它是否是 Long、Double、Integer 中的数字。

希望这有帮助

于 2015-07-28T08:02:48.013 回答