实现一个函数判断字符串是否表示数值(包括整数和小数)

实现一个函数判断字符串是否表示数值(包括整数和小数),例如,字符串'+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判断有没有读到字符串末尾。

你可能感兴趣的:(实现一个函数判断字符串是否表示数值(包括整数和小数))