題目描述:
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
表示數值的字符串遵循模式A[.[B]][e|E[C]]
最複雜的 “+123.123e+123”
- 先確定有無正負號,然後判斷是否是個整數,當非數字字符時候 再判斷是否是小數點 或者 是否是指數的e E
- 若是指數的e E 在再判斷是否是 有正負號 和整數。
代碼:
package offer01;
public class TestNo53 {
public static void main(String[] args) {
char[] a = {'1','2','3','.','1','2','3','e','+','1','2','3'};
System.out.println(new TestNo53().isNumeric(a));
}
public boolean isNumeric(char[] str) {
//判斷數據合理
if(str == null){
return false;
}
int index = 0;//記錄+-
int encount = 0;//記錄e
int point = 0;//記錄點
// + - 可以在第一個位置上或者在e之後
if(str[0] == '-' || str[0] == '+')
index++;
for(int i = index;i<str.length;i++){
if(str[i] == '-' ||str[i] == '+'){
if(str[i-1] == 'e' || str[i-1] == 'E')
continue;
else
return false;
}
//如果是e,那麼e不能出現在首末尾,並且e前面爲數字
if(str[i] == 'e' || str[i] == 'E'){
encount++;
if(encount >1)
return false;
if(i==0 || i==str.length-1)
return false;
if(str[i-1] > 57 || str[i-1] <48)
return false;
point++;
continue;
}
//. 點不能出現在末位,,而且只能出現一次。不能出席那指數之後,
if(str[i] == '.'){
if(i==str.length-1)
return false;
point++;
if(point >1)
return false;
continue;
}
//如果以上符號都不是,再判斷是不是其他的字符
if(str[i] >57 || str[i] <48)
return false;
}
return true;
}
}