有没有比这更好、更优雅(和/或可能更快)的方法
boolean isNumber = false;
try{
Double.valueOf(myNumber);
isNumber = true;
} catch (NumberFormatException e) {
}
...?
Edit:
由于我无法选择两个答案,所以我选择正则表达式,因为 a)它很优雅,b)说“Jon Skeet 解决了问题”是同义反复,因为 Jon Skeet 本人就是所有问题的解决方案。
我不相信 Java 中有任何内置的东西可以更快、更可靠地完成它,假设稍后您会想要使用 Double.valueOf (或类似的)实际解析它。
我会使用 Double.parseDouble 而不是 Double.valueOf 以避免不必要地创建 Double,and您还可以通过检查数字、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;
}
}
请注意,尽管尝试了几次,这still不涵盖“NaN”或十六进制值。您是否希望这些通过取决于上下文。
根据我的经验,正则表达式比上面的硬编码检查慢。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)