今天在判断接口收到的字符串信息是否是数字类型时使用的是org.apache.commons.lang3.StringUtils的isNumeric方法.
在对方传来浮点型数字的时候判断为非数字型查看了源码
通过查看每一个字符的char是否为为数字,也就是char的值是048-057,但是浮点型中有个一个".",它的char是046,所以会返回false
找到了另外一个类,net.logstash.logback.encoder.org.apache.commons.lang.math.NumberUtil的isNumber可以判断浮点型数字
public static boolean isNumber(String str) {
if (StringUtils.isEmpty(str)) {
return false;
} else {
char[] chars = str.toCharArray();
int sz = chars.length;
boolean hasExp = false;
boolean hasDecPoint = false;
boolean allowSigns = false;
boolean foundDigit = false;
int start = chars[0] == '-' ? 1 : 0;
int i;
if (sz > start + 1 && chars[start] == '0' && chars[start + 1] == 'x') {
i = start + 2;
if (i == sz) {
return false;
} else {
while(i < chars.length) {
if ((chars[i] < '0' || chars[i] > '9') && (chars[i] < 'a' || chars[i] > 'f') && (chars[i] < 'A' || chars[i] > 'F')) {
return false;
}
++i;
}
return true;
}
} else {
--sz;
for(i = start; i < sz || i < sz + 1 && allowSigns && !foundDigit; ++i) {
if (chars[i] >= '0' && chars[i] <= '9') {
foundDigit = true;
allowSigns = false;
} else if (chars[i] == '.') {
if (hasDecPoint || hasExp) {
return false;
}
hasDecPoint = true;
} else if (chars[i] != 'e' && chars[i] != 'E') {
if (chars[i] != '+' && chars[i] != '-') {
return false;
}
if (!allowSigns) {
return false;
}
allowSigns = false;
foundDigit = false;
} else {
if (hasExp) {
return false;
}
if (!foundDigit) {
return false;
}
hasExp = true;
allowSigns = true;
}
}
if (i < chars.length) {
if (chars[i] >= '0' && chars[i] <= '9') {
return true;
} else if (chars[i] != 'e' && chars[i] != 'E') {
if (chars[i] == '.') {
return !hasDecPoint && !hasExp ? foundDigit : false;
} else if (allowSigns || chars[i] != 'd' && chars[i] != 'D' && chars[i] != 'f' && chars[i] != 'F') {
if (chars[i] != 'l' && chars[i] != 'L') {
return false;
} else {
return foundDigit && !hasExp;
}
} else {
return foundDigit;
}
} else {
return false;
}
} else {
return !allowSigns && foundDigit;
}
}
}
}
内部判断了很多情况,但我其实觉得可以使用FloatingDecimal.parseDouble来转化字符串,抛出异常为非数字,成功为数字类型