网上的大部分都直接扔了个Double.parseDouble了,没有考虑到16进制、8进制和2进制的问题,所以我写了一个,能凑合着用,性能不大好,觉得可以再优化点
写的有点笨拙,望见谅。
public static boolean isNaN(String str) {
try {
if (str.toLowerCase().startsWith("0x")) { // 16-bit
str = str.substring(2).replaceFirst("\\.", "");
Integer.parseInt(str, 16);
return false;
} else if (str.toLowerCase().startsWith("0b")) { // 2-bit
str = str.substring(2).replaceFirst("\\.", "");
for (char c : str.toCharArray()) {
if (Integer.parseInt(String.valueOf(c)) >= 2) return true;
}
return false;
} else if (str.startsWith("0") && str.length() > 1) { // 8-bit
str = str.replaceFirst("\\.", "");
if (str.toLowerCase().startsWith("0o")) {
str = str.substring(2);
}
for (char c : str.toCharArray()) {
if (Integer.parseInt(String.valueOf(c)) >= 8) return true;
}
return false;
} else { // 10-bit
Double.parseDouble(str);
return false;
}
} catch (NumberFormatException e) {
return true;
}
}