表示数值的字符串

表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

书上版本

class Solution {
public:
    bool scanUnsignedInteger(char** str) {
        char *before = *str;
        while (('\0' != **str) && (**str >= '0') && (**str <= '9'))
            (*str)++;
        // str中处在0~9之间的数字时, 返回true
        return *str > before;
    }
    
    
    bool scanInteger(char** str) {
        if (('-' == **str) || '+' == **str)
            (*str)++;
        return scanUnsignedInteger(str);
    }
    
    bool isNumeric(char* string)
    {
        if (nullptr == string)
            return false;
        
        // 扫描整数部分, 可能带有符号
        // 扫描后string停留在非数字部分
        bool numeric = scanInteger(&string);
        
        // 如果出现小数点, 处理小数部分
        if ('.' == *string) {
            string++;
            // 扫描小数点后的数字, 带有符号部分, 使用||原因如下
            // 1. 小数点可以没有整数部分, 如.123等于0.123
            // 2.小数点后面可以没有数字, 如233.等于233.0
            // 3 小数点前后都有数字,
            numeric = scanUnsignedInteger(&string) || numeric;
        }
        
        // 如果出现e或E, 处理指数部分
        if ('e' == *string || 'E' == *string) {
            string++;
            // 使用&&原因
            // 字母前没有数字时, 整个字符串不能表示数字, 如.e1, e1
            // 字母后没有整数时, 整个字符串不能表示数字, 如 12e, 12e+5.4
            numeric = scanInteger(&string) && numeric;
        }
        
        return numeric && ('\0' == *string);
    }

};
posted @ 2019-03-17 22:12  张飘扬  阅读(863)  评论(0编辑  收藏  举报