网上查阅的很多资料也有涉及到用正则表达式来校验数值(包含小数与负数),但很多都是不全的,比如 "-"、"12."都是可以的,所以自己动手写了一个,虽然不是最优的,但最起码能达到自己想要的效果。
/**
* 校验字符串是否是数值(包含小数与负数)
* 示例:
* false : . 1. 1sr - 12. -12.
* true: -12 -12.0 -12.056 12 12.0 12.056
*
* @param str 需要校验的字符串
* @return false :不是数值 true:是数值
*/
public Boolean checkNumber(String str) {
String regex = "-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?";
if (str == null || !str.matches(regex)) {
return false;
}
return true;
}
正则表达式说明:
[0-9]:字符范围。匹配指定范围内的任意字符,例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。;
+:匹配前面的子表达式一次或多次(大于等于1次);
?:匹配前面的子表达式零次或一次;
|:匹配'|'前面的表达式或'|'后面的表达式,比如:x|y,匹配x或y;
因此,代码中的regex="-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?"可以以'|'分为以下两大部分,当输入的字符串只要符合以下两部分的任一部分都会返回true:
第一部分是'|'之前的,用于校验负数:
-[0-9]+:以减号'-'开头,0-9之间的数字出现一次或多次,这样可以允许负数,当出现负号时,后面必须有数字;
(.[0-9]+)?:以下情况出现0次或1次:以小数点开头,0-9之间的数字出现一次或多次,这样就避免了'12.'(注意小数点)也正确的结果;
第二部分是'|'之后的,用以校验非负数:
[0-9]+:0-9之间的数字出现一次或多次;
(.[0-9]+)?:与第一部分中的一样;