牛客(53)表示数值的字符串

//    题目描述
//    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
//    例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
//    但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
    public static boolean isNumeric(char[] str) {

        if (str == null) {
            return false;
        }
        //第一个不是数字 + 或者减好
        //多个小数点不是数字
        //含有e|E意外的字母不是数字
        //e|E后面跟小数不是数字
        //含有多个符号不是数字
        int dot = 0;
        int countE = 0;
        int countO = 0;
        int countN = 0;
        for (int i = 0; i < str.length; i++) {
            if (str[i] >= '0' && str[i] <= '9') {
                countN++;
            }else if (str[i] == 'e' || str[i] == 'E') {
                if (countN<=0){
                    return false;
                }
                //如果e前面不是数字
                if (str[i-1]<'0'&&str[i-1]>'9'){
                    return false;
                }
                //因为e后面不能出现dot 所有
                if (dot<1){
                    dot=1;
                }

                i++;
                //e的下一位可以使+|-
                if (i<str.length&&(str[i]=='+'||str[i]=='-')){
                    if ((i+1<str.length)){
                        if (!(str[i+1]<'9'&&str[i+1]>'0')){
                            return false;
                        }
                        countN++;
                    }else {
                        return false;
                    }
                    countO--;
                }else if (i<str.length&&(str[i]<'9'&&str[i]>'0')){
                    countN++;
                }else{
                    return false;
                }
                countE++;
            }else if (str[i] == '+' || str[i] == '-') {
                if (countN>0){
                    return false;
                }
                countO--;
            }else if (str[i]=='.'){
                dot++;
            }else{
                return false;
            }
        }
        if (countN<=0||dot>1||countE>1||countO>1){
            return false;
        }

        return true;
    }

 

posted @ 2018-05-28 14:24  楷兵  阅读(147)  评论(0编辑  收藏  举报