题目描述

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

public class Q_53 {
    public boolean isNumeric(char[] str) {
        boolean haspoint = false;//是否出现点号
        boolean hasE = false;//是否有科学计数法E
        boolean hasPlusMinus = false;//是否有正负号
        boolean first = true;//当前是否是第一个字符或者是E后面的第一个字符
        boolean afterE = true;//E后面是否有数据

        for (char a : str
                ) {
            if (a == '-' || a == '+') {
                if (hasPlusMinus || !first) {//判断是否出现过正负号,并且在第一个位置出现
                    return false;
                }
                hasPlusMinus = true;
                continue;
            }
            if ('E' == a || 'e' == a) {
                if (hasE) {
                    return false;
                }
                hasE = true;
                hasPlusMinus = false;//E的后面允许第一位出现正负号
                first = true;
                afterE = false;//E的后面不允许没有数字,最后输出结果的时候判断
                continue;
            }
            if ('.' == a) {
                if (haspoint || hasE) {//点号只能有一个,并且不能再E后面
                    return false;
                }
                haspoint = true;
                continue;
            }
            if ((a < 48 || a > 57)) return false;//判断是否是数字
            first = false;
            afterE = true;
        }
        return true && afterE;
    }

    public static void main(String[] args) {
        System.out.println(new Q_53().isNumeric("123.45e+6".toCharArray()));
    }

}