美文网首页程序猿阵线联盟-汇总各类技术干货程序员
实现一个函数判断字符串是否表示数值(包括整数和小数)

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

作者: 沧州宁少 | 来源:发表于2017-11-23 16:40 被阅读0次

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zwgzvxtx.html