19.表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
注意:
- 小数可以没有整数部分,例如.123等于0.123;
- 小数点后面可以没有数字,例如233.等于233.0;
- 小数点前面和后面可以有数字,例如233.666;
- 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
- 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
数据范围:
输入字符串长度 [0,25]。
字符串中不含空格。
样例:
输入: "0"
输出: true
代码:
class Solution {
public boolean isNumber(String s) {
//处理空字符串情况
if(s == null || s.length() == 0)return false;
//去除首尾空格
s = s.trim();
//处理全是空格的情况
if(s.length() == 0)return false;
//是否出现过数字
boolean numSeen = false;
//是否出现过小数点
boolean dotSeen = false;
//是否出现过e/E
boolean eSeen = false;
//e/E后面是否跟着数字
//numAfterE 初始值为 true,因为可能没有e
boolean numAfterE = true;
//遍历字符串的每个字符
for(int i = 0;i<s.length();i++){
char c = s.charAt(i);
//处理数字字符
if(c>='0'&&c<='9'){
//标记数字已经出现
numSeen = true;
//如果之前有e。现在e后面有数字了
numAfterE = true;
}else if(c=='.'){
//小数点不能出现在e之后,也不能重复出现
if(eSeen||dotSeen)return false;
//标记小数点已出现
dotSeen = true;
}else if(c=='e'||c=='E'){
//e/E前面必须有数字,且不能重复出现
if(eSeen||!numSeen)return false;
//标记e已出现
eSeen = true;
//重置,需要检查e后面是否有数字
numAfterE = false;
}else if(c == '+'||c == '-'){
//+/-只能出现在第一位或e/E的后面
if(i!=0&&s.charAt(i-1)!='e'&&s.charAt(i-1)!='E')return false;
}else return false;//其余字符都是非法的
}
//必须有数字,且如果出现,则e后面必须有数字
return numSeen&&numAfterE;
}
}

浙公网安备 33010602011771号