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