有没有比这更好,更优雅(和/或更快)的方式
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”或十六进制值。是否要通过这些取决于上下文。
以我的经验,正则表达式比上面的硬编码检查要慢。