描述
给定一个字符串,验证其是否为数字。
样例
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
思路:按照.和e进行分割,判断分割后的字符串是否符合标准。.前面可以有数字也可以没有数字,如果e和.都存在,则他们中间必须有数字,e后面必须有数字,前面也必须有数字。各种情况都要考虑。
注意:有一些特殊情况需要注意:".123.","e12","12e","e.Ee.."," "这些都是无效数字。".12","123."是有效数字。还要考虑+,-。
实现:
public class IsNumber {
public boolean isNumber(String s) {
if(s==null || s.length()<1) return false;
int i=0;
int j=s.length()-1;
while(i<s.length() && s.charAt(i)==' ') i++;
if(i>j) return false;//只有空格的字符串
while(j>=0 && s.charAt(j)==' ') j--;
if(s.charAt(i)=='+' || s.charAt(i)=='-')
i++;
s=s.substring(i, j+1).toLowerCase();
//全是由e和.组成的字符串
if(s.replaceAll("\\.", "").replaceAll("e", "").length()==0)
return false;
if(s.charAt(0)=='.' && s.charAt(s.length()-1)=='.')
return false;
for(int k=0; k<s.length(); k++){
if(!((s.charAt(k)>='0' && s.charAt(k)<='9') || s.charAt(k)=='.' || s.charAt(k)=='e'))
return false;
}
String[] strs1=s.split("\\.");
boolean b=true;
if(strs1.length>2) return false;
if(strs1.length==1) b=false;
for(int k=0; b && k<strs1[0].length(); k++){
if(strs1[0].charAt(k)<'0' || strs1[0].charAt(k)>'9')
return false;
}
String[] strs2;
if(b){
if(strs1[1].charAt(0)=='e' || strs1[1].charAt(strs1[1].length()-1)=='e')
return false;
strs2=strs1[1].split("e");
}
else{
if(strs1[0].charAt(0)=='e' || strs1[0].charAt(strs1[0].length()-1)=='e')
return false;
strs2=strs1[0].split("e");
}
if(strs2.length>2) return false;
for(int k=0; k<strs2[0].length(); k++){
if(strs2[0].charAt(k)<'0' || strs2[0].charAt(k)>'9')
return false;
}
return true;
}
}