題目描述
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
這題真是令人作嘔,各種情況都要考慮,很容易出錯,以下是我寫的代碼,判題系統居然說-.123是數字,沒有給ac。
public class Solution {
public boolean isNumeric(char[] str) {
if(str.length==0){
return false;
}
//第一個字符是+、-
if(str[0]=='+'||str[0]=='-'){
return isNumeric2(str,1);
}
return isNumeric2(str,0);
}
//沒有正負號的數字
public boolean isNumeric2(char[] str, int i){
if(str[i]>='1'&&str[i]<='9'){
//判斷是否科學計數法
if(isE(str,i+1)){
return isNumeric3(str, i+1);
}else{
int count = 0; //小數點的個數
for(int j=i+1; j<str.length; j++){
//最后一個字符是小數點
if(str[j]=='.'&&j==str.length-1){
return false;
}
if(str[j]=='.'){
count++;
continue;
}
if(str[j]<'0'||str[j]>'9'){
return false;
}
}
if(count>1){
return false;
}
return true;
}
}
return false;
}
//科學計數法的數字
public boolean isNumeric3(char[] str, int i){
//遍歷找到e或E的位置
int j=i;
for(; j<str.length; j++){
if(str[j]=='e'||str[j]=='E'){
break;
}
}
//凡是e或E左邊的必須是形如1.23這樣的數字
int count = 0; //小數點的個數
for(int k=i; k<j; k++){
//最后一個字符是小數點
if(str[j-1]=='.'){
return false;
}
if(str[k]=='.'){
count++;
continue;
}
if(str[k]<'0'||str[k]>'9'){
return false;
}
}
if(count>1){
return false;
}
//凡是右邊的必須是+5、-2、3這樣的整數
for(int k=j+1; k<str.length; k++){
if(k==j+1&&str[k]=='+'||str[k]=='-'){
//1e+這樣的不是數字
if(k+1==str.length){
return false;
}
continue;
}
if(str[k]<'0'||str[k]>'9'){
return false;
}
}
return true;
}
//是否科學計數法
public boolean isE(char[] str, int i){
for(int j=i; j<str.length; j++){
if(str[j]=='e'||str[j]=='E'){
return true;
}
}
return false;
}
}
如果允許用正則表達式或者庫函數就另當別論了,以下是ac的代碼。
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
}
public class Solution {
public boolean isNumeric(char[] str) {
try {
double re = Double.parseDouble(new String(str));
} catch (NumberFormatException e) {
return false;
}
return true;
}
}