請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。
- 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值。
- 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
使用正則表達(dá)式去匹配數(shù)字的模式:"[+-]?[0-9]([\.[0-9])?([Ee][+-]?[0-9]+)?"
代碼如下:
public static boolean isNumeric(char[] str) {
if (str == null || str.length == 0) {
return false;
}
String s = String.valueOf(str);
//? 匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請(qǐng)使用 \?。
//* 匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請(qǐng)使用 \*。
return s.matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
}
思路二:
基本規(guī)則,小數(shù)點(diǎn)和E,e只能出現(xiàn)一次,小數(shù)點(diǎn)后必須有數(shù)字,E,e后必須是+-,并且后面必須有數(shù)字,否則剩下的字符必須是數(shù)字。
如果只有一位數(shù)字,判斷是否是整數(shù),不是返回false;設(shè)置兩個(gè)標(biāo)志位判斷是否出現(xiàn)小數(shù)點(diǎn)或者E,e;然后遍歷字符串,如果首位是+-,則判斷是否是第一個(gè)字符,如果不是,并且前一個(gè)字符也不是E,e,則返回false;如果當(dāng)前字符是Ee,則不可能是最后一位,并且之前沒有出現(xiàn)過,不滿足返回false,滿足標(biāo)志位改為Ee出現(xiàn)了。如果是小數(shù)點(diǎn),只能出現(xiàn)一次,并且在E,e之前,滿足條件小數(shù)點(diǎn)標(biāo)志位改為出現(xiàn)。
最后的情況就是必須是數(shù)字。
一直沒有跳出來,說明都滿足,返回true。
代碼如下:
/**
* @param str
* @return
*/
public static boolean isNumeric1(char[] str) {
if (str == null || str.length == 0) {
return false;
}
//長(zhǎng)度只有1,必須在0-9之間
if (str.length == 1 && (str[0] < '0' || str[0] > '9')) {
return false;
}
boolean hasDot = false;
boolean hasE = false;
for (int i = 0; i < str.length; i++) {
//判斷+-號(hào)的特殊情況
if (str[i] == '+' || str[i] == '-') {
//第二次出現(xiàn)正負(fù)號(hào),前一個(gè)字符必須是E,e
if (i != 0 && str[i - 1] != 'E' && str[i - 1] != 'e') return false;
} else if (str[i] == 'E' || str[i] == 'e') {
//e:只有一個(gè)并且后面必須有數(shù)字==它不可能是最后一位
if (i == str.length - 1) return false;
if (hasE) return false;
hasE = true;
} else if (str[i] == '.') {
//只能出現(xiàn)一次,并且e和E以后不可能出現(xiàn)
if (hasDot || hasE) return false;
hasDot = true;
} else if (str[i] < '0' || str[i] > '9') {
//否則只能是數(shù)字
return false;
}
}
return true;
}
/**
* 劍指offer
分為A.B+C三部分去判斷是否滿足條件
*/
private int index = 0;
public boolean isNumeric3(char[] str) {
if (str.length < 1)
return false;
boolean flag = scanInteger(str);
if (index < str.length && str[index] == '.') {
index++;
flag = scanUnsignedInteger(str) || flag;
}
if (index < str.length && (str[index] == 'E' || str[index] == 'e')) {
index++;
flag = flag && scanInteger(str);
}
return flag && index == str.length;
}
private boolean scanInteger(char[] str) {
if (index < str.length && (str[index] == '+' || str[index] == '-') )
index++;
return scanUnsignedInteger(str);
}
private boolean scanUnsignedInteger(char[] str) {
int start = index;
while (index < str.length && str[index] >= '0' && str[index] <= '9')
index++;
return start < index; //是否存在整數(shù)
}