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