是否有比
更好、更优雅(和/或可能更快)的方式boolean isNumber = false;
try{
Double.valueOf(myNumber);
isNumber = true;
} catch (NumberFormatException e) {
}
...?
编辑: 由于我无法选择两个答案,所以我选择正则表达式,因为 a) 它很优雅,b) 说“Jon Skeet 解决了问题”是同义反复,因为 Jon Skeet 本人就是所有问题的解决方案。
最佳答案
我认为 Java 中没有任何内置的东西可以更快且仍然可靠地完成它,假设稍后您会想要使用 Double.valueOf(或类似的)实际解析它。
我会使用 Double.parseDouble 而不是 Double.valueOf 来避免不必要地创建 Double,并且您还可以通过检查数字比异常更快地摆脱公然愚蠢的数字,e/E,- 和。预先。所以,像这样:
public boolean isDouble(String value)
{
boolean seenDot = false;
boolean seenExp = false;
boolean justSeenExp = false;
boolean seenDigit = false;
for (int i=0; i < value.length(); i++)
{
char c = value.charAt(i);
if (c >= '0' && c <= '9')
{
seenDigit = true;
continue;
}
if ((c == '-' || c=='+') && (i == 0 || justSeenExp))
{
continue;
}
if (c == '.' && !seenDot)
{
seenDot = true;
continue;
}
justSeenExp = false;
if ((c == 'e' || c == 'E') && !seenExp)
{
seenExp = true;
justSeenExp = true;
continue;
}
return false;
}
if (!seenDigit)
{
return false;
}
try
{
Double.parseDouble(value);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}
请注意,尽管进行了几次尝试,这个仍然不包含“NaN”或十六进制值。您是否希望它们通过取决于上下文。
根据我的经验,正则表达式比上面的硬编码检查要慢。
关于java - 检测字符串是否为数字的最优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359625/