实现一个函数判断字符串是否表示数值(包括整数和小数),例如,字符串'+100','5e2','-123'都表示数值。但是"12e","+=4"。以及"12e+63"都不是
其中可以看出3部分
- A: A为数值的整数部分。可能以'+','-'开头,
- B: B表示小数部分
- C: C表示指数部分
判断一个字符是否满足上述模式时,尽量多的扫描0~9的数位(有可能有起始处有'+'或者'-'),也就是模式的A部分。如果遇到'.',也就是B部分。如果遇到'E'或者'e'也就是C部分。
下面的函数判断是否在0-9或者是"\0"部分。 如果是的话,指针往后移动。然后外层判断如果有移动说明是0~9或者'\0'则满足
//分为A.B,C三部分的话,我们先检查A部分
bool isUInteger(const char**numbers){
const char* before = *numbers;
while (**numbers != '\0'&&**numbers>='0'&&**numbers<='9') {
(*numbers) += 1;
}
return *numbers> before;
}
判断是否是A部分。
bool isInterget(const char**number){
if (**number == '+'||**number=='-') {
(*number) +=1;
}
return isUInteger(number);
}
下面是核心执行代码
bool isNumber(const char*numbers){
if(numbers == nullptr) return false;
bool bRet = isInterget(&numbers);
if (*numbers == '.') {
numbers += 1;
//标记A
bRet = isUInteger(&numbers)|| bRet;
}
if (*numbers == 'e'|| *numbers == 'E') {
numbers += 1;
//标记B
bRet = bRet && isInterget(&numbers);
}
// 标记C
return bRet&&*numbers == '\0';
}
标记A之所以用|| 因为存在.15->0.15 15.代表15.0所以对于小数而言。所以对于小数而言。.在前后均可。
标记B 因为e必须前后都有数字 .e1 12e
标记C判断有没有读到字符串末尾。
网友评论