4

我需要检查用户输入是字符串还是数字。

我为此目的使用以下语句,

Double.parseDouble(string);

它适用于大多数场景,但当用户输入的输入像 123F时会失败

这应该被视为一个字符串,但上述情况将其视为一个数字。我什至尝试使用

 NumberUtils.isNumber(string);

但行为仍然相同。

我尝试了以下有效的正则表达式模式

"-?\\d+(\\.\\d+)?"

但是,是否有任何其他替代 api 相同。

4

3 回答 3

1

查看Double.valueOf文档中列出的相当复杂的正则表达式。如果您需要对应用程序进行更多限制,则需要编写自己的正则表达式。正如其他人指出的那样,使用 Double.parseDouble 可以做很多事情,包括Infinity.

于 2013-07-03T12:21:12.647 回答
0

如果我要支持带有 F 后缀的浮点数,我会这样做:

if (str.endsWith("F") || str.endsWith("f")) {
   num = Double.parseDouble(str.substring(0, str.length() - 1));
} else {
   num = Double.parseDouble(str);
} 

但是,我建议您不要这样做。

“f”后缀不是标准的数学/科学形式。它仅在某些编程语言中具有明确定义的含义……作为程序源代码中的数字文字在这种情况下,它表示具有 IEE 单精度表示的浮点数。(而您正试图将其视为!)double

避免这种潜在混淆的最佳方法(对于不了解数字和数字文字之间差异的一小部分程序员)是简单地将其视为错误输入。


但是,是否有任何其他替代 api 相同。

AFAIK,不。主要是因为格式没有真正意义。

于 2013-07-03T12:35:51.440 回答
0

文档

有效数字包括用 0x 限定符标记的十六进制数、科学计数法和用类型限定符标记的数字(例如 123L)。

所以123F似乎被检测为十六进制数字。

您可以改用NumberUtils.isDigits(String s)方法

它检查字符串是否只包含数字字符。

所以你的工作代码可能看起来像

boolean b = NumberUtils.isDigits(string);
if(!b)
  // then all are digits
于 2013-07-03T12:17:28.520 回答