剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
题解:
正确的规则:正负号只能出现在开头或者幂符号之后:小数点和幂符号最多出现一次,幂符号不能在开头或者结尾,字符串不能出现除'0' - '9'
、'e/E'
、'.'
、'+'
、'-'
之外的字符。
循环读取字符串中的字符,拿出字符和'0' - '9'
、'e/E'
、'.'
、'+'
、'-'
依次进行比较,看是否符合上述规则,如果不符合退出循环,返回 false
public static boolean isNumber(String s) {
String s1= s.trim();
//System.out.println(s1);
if(s1.length()==0)return false;
int l=s1.length();
boolean isnum=true;
int dot=0;
boolean isD=false,isN=false;;
int e=0;
boolean isE=false;
char[] string=s1.toCharArray();
for(int i=0;i<l;i++)
{
//判断 '+' '-'
if(string[i] == '+' || string[i] == '-'){
//正负号只能出现在开头或者e后面
if(i == 0){
}
else{
if(string[i-1] == 'e' || string[i-1] == 'E'){
if(i == l - 1){
isnum = false;
break;
}
}
else{
isnum = false;
break;
}
}
}
// 判断小数点
else if(string[i] == '.'){
dot ++;
isD=true;
// '.' 不能出现在开始或末尾则
if(i == 0 &&l>1){
if(string[1] >= '0' && string[1] <= '9') {
}
else {
isnum= false;
break;
}
}
else if(i == l - 1&&l-2>=0) {
if(string[l-2] >= '0' && string[l-2] <= '9') {
}
else {
isnum= false;
break;
}
}
// '.' 只能出现一次
if(dot > 1){
isnum= false;
break;
}
// 不能在 'e/E' 之后出现
if(isE){
isnum = false;
break;
}
}
// 判断 'e' 'E'
else if(string[i] == 'e' || string[i] == 'E'){
isE = true;
e ++;
// 'e/E' 只能出现一次
if(e > 1){
isnum = false;
break;
}
// 如果 'e/E' 出现在开始或末尾则出错
if(i == 0 || i == l - 1){
isnum = false;
break;
}
}
else{
// 如果字符不是 '0' - '9' 则报错
if(string[i] >= '0' && string[i] <= '9'){
isN=true;
}
else{
isnum = false;
break;
}
}
}
if(e==0&&isN==false&&dot==1)isnum=false;
if(l>2&&string[0]=='+'&&(string[1]=='e'||string[1]=='E'))isnum=false;
if(l>2&&string[0]=='-'&&(string[1]=='e'||string[1]=='E'))isnum=false;
return isnum;
}