力扣,https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/description/
场景极其繁琐,有空再看。。。
class Solution {
public boolean validNumber(String s) {
if (s == null || s.length() == 0) {
return false;
}
s = s.trim(); //去掉首尾空格
boolean numFlag = false;
boolean dotFlag = false;
boolean eFlag = false;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { // 判定为数字,则标记numFlag
numFlag = true;
} else if (s.charAt(i) == '.' && !dotFlag && !eFlag) { // 判定为. 需要没出现过.并且没出现过e
dotFlag = true;
} else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E')
&& !eFlag && numFlag) { // 判定为e,需要没出现过e,并且出过数字了
eFlag = true;
numFlag = false; //为了避免123e这种请求,出现e之后就标志为false
} else if ((s.charAt(i) == '+' || s.charAt(i) == '-')
&& (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) { //判定为+-符号,只能出现在第一位或者紧接e后面
} else { // 其他情况,都是非法的
return false;
}
}
return numFlag;
}
}
参考网址:https://www.nowcoder.com/profile/9717187/codeBookDetail?submissionId=15761119
利用特殊字符把字符串分割为整数段这个思想值得借鉴!
class Solution {
public:
bool isNumeric(char* string)
{
if(string == NULL) //空指针返回false
return false;
if(*string == '+' || *string == '-')
string++;
if(*string == '\0') //若只有符号位则返回false
return false;
int dot = 0, num = 0, nume = 0;//分别用来标记小数点、整数部分和e指数是否存在
while(*string != '\0') { //利用特殊字符把字符串分割为整数段这个思想值得借鉴!
if(*string >= '0' && *string <= '9') //出现了数字,则指针往后移
{ //同时num = 1代表出现了整数部分
string++;
num=1;
}
else if(*string == '.'){
if(dot > 0 || nume > 0) //如果存在已经存在小数点或e指数则返回false。注:此题在书中规定中如"-.123"也被判定为数值
return false; //即有的小数没有整数位,也被判定为合法数值所以没有"num == 0 ||"这个条件
string++;//否则指针后移
dot=1; //并标记出现了小数点
}
else if(*string == 'e' || *string == 'E')
{
if(num == 0 || nume > 0) //如果没有整数部分或已经存在e指数
return false; //返回false
string++;//否则指针后移
nume++; //并标记已经出现了e指数
if(*string == '+' || *string == '-')
string++;//如果出现了正负号,指针后移
if(*string == '\0') //如果e指数后面字符串直接结束,返回false
return false; //如果e后面有符号位,然后符号位直接结束,返回false
}
else
return false;
}
return true;
}
};