我需要检查用户输入是字符串还是数字。
我为此目的使用以下语句,
Double.parseDouble(string);
它适用于大多数场景,但当用户输入的输入像 123F时会失败
这应该被视为一个字符串,但上述情况将其视为一个数字。我什至尝试使用
NumberUtils.isNumber(string);
但行为仍然相同。
我尝试了以下有效的正则表达式模式
"-?\\d+(\\.\\d+)?"
但是,是否有任何其他替代 api 相同。
我需要检查用户输入是字符串还是数字。
我为此目的使用以下语句,
Double.parseDouble(string);
它适用于大多数场景,但当用户输入的输入像 123F时会失败
这应该被视为一个字符串,但上述情况将其视为一个数字。我什至尝试使用
NumberUtils.isNumber(string);
但行为仍然相同。
我尝试了以下有效的正则表达式模式
"-?\\d+(\\.\\d+)?"
但是,是否有任何其他替代 api 相同。
查看Double.valueOf文档中列出的相当复杂的正则表达式。如果您需要对应用程序进行更多限制,则需要编写自己的正则表达式。正如其他人指出的那样,使用 Double.parseDouble 可以做很多事情,包括Infinity
.
如果我要支持带有 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,不。主要是因为格式没有真正意义。
从文档
有效数字包括用 0x 限定符标记的十六进制数、科学计数法和用类型限定符标记的数字(例如 123L)。
所以123F
似乎被检测为十六进制数字。
您可以改用NumberUtils.isDigits(String s)
方法
它检查字符串是否只包含数字字符。
所以你的工作代码可能看起来像
boolean b = NumberUtils.isDigits(string);
if(!b)
// then all are digits