跳至主要內容

表示数值的字符串

soulballad算法剑指Offer剑指Offer约 436 字大约 1 分钟

题目:

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

分析:

​ 表示数值的字符串遵循模式: A[.[B]][e|EC] 或者 .B[e|EC],其中 A 为数值的整数部分,B为小数部分,C为 e或者 E 的指数部分。

public class CheckNumeric {

    public static boolean isNumeric(char[] str) {
        if (null == str || str.length == 0) return false;
        //分别表示小数点,E/e,正负号是否出现过。
        boolean hasD = false, hasE = false, sign = false;
        int len = str.length;
        for (int i = 0; i < len; i++) {
            if (str[i] == 'e' || str[i] == 'E') {
                //如果e出现在字符串的最后一位的话,肯定不正确
                if (i == len - 1) return false;
                //如果E已经出现过一次,这里是第二次出现的话,肯定也不对
                if (hasE == true) return false;
                hasE = true;
            } else if (str[i] == '.') {
                //如果在小数点之前已经出现过E的话,肯定不对
                if (hasE == true) return false;
                //如果在小数点之前已经出现过小数点的话,肯定不对
                if (hasD == true) return false;
                hasD = true;
            } else if (str[i] == '+' || str[i] == '-') {
                if (i > 0 && (str[i - 1] != 'e') && (str[i - 1] != 'E'))
                    //如果+和-号出现的位置不在第一位,而是在中间,并且他们前面一位不是E的话,肯定错误,包含了+和-号出现在最后一位的情况
                    //12e+3是数值
                    return false;
                sign = true;
            } else if (str[i] < '0' || str[i] > '9') {
                //如果出现的字符小于0或者大于9的话,肯定也不对
                return false;
            }
        }
        return true;
    }
}
上次编辑于:
贡献者: soulballad