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

//强大的正则表达式,已经把我下面的那种解法虐了
public class Solution {
    public static boolean isNumeric(char[] str) {
        String string = String.valueOf(str);
        return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
    }
}



public class Solution {
    /**分两种情况, * 1.第一种是第一个字符是数字,继续判断(****) 2.第二种第一个不是数字,那么分为以下两种 (1).第一个是'+'或者'-'; 继续判断(****),那从第二个字符开始的后面的字符串与1判断一样 (2).第一个不是的话,就不是数值 */ 
    public static boolean isNumeric(char[] str) {
        boolean flag = true;
        boolean flagEafter = false;//防止123.45e+6中e后面的+因为不是属于e或者E的非法字符***掉***
        int numdecimal = 0;
        if (isDigit(str[0])) {//1.第一个字符是数字
            for (int i = 1; i < str.length; i++) {
                if (numdecimal > 1) {//如果'.'数目大于1
                    flag = false;
                    break;
                }
                if (!isDigit(str[i])) {//如果不是数字
                    if (str[i]=='.') numdecimal++;
                    else if (str[i]=='e'||str[i]=='E') {//如果当前字符是e,E,那么后面的数字必须全是整数,否则就是false
                        if (i==str.length-1) {//如果是e或者E但是,e或者E作为最后一个字符
                            flag = false;
                            break;
                        }
                        else if (str[i+1]=='-'||str[i+1]=='+') {//如果出现了-或者+号,但是前面的字符不是e,或者E
                            if ((i+1) == str.length-1) {//比如"4e-"这种情况
                                flag = false;
                                break;
                            }
                            else {
                                int j = i+2;
                                for (j = i+2; j < str.length; j++) {
                                    if (!isDigit(str[j])) {
                                        flag = false;
                                        break;
                                    }
                                }
                                if (j==str.length) flagEafter = true;
                            }
                        } else {//排除4e3.12这种的
                            int j = i+1;
                            for (j = i+1; j < str.length; j++) {
                                if (!isDigit(str[j])) {
                                    flag = false;
                                    break;
                                }
                            }
                            if (j==str.length) flagEafter = true;
                        }  
                    } else {//如果在e,E之前有除了-,+的其他字符
                        flag = false;
                        break;
                    }
                }
            }
            if (flagEafter) flag = true;
        } else {//2.如果第一个不是数字
            if (str[0]=='-'||str[0]=='+') {
                for (int i = 1; i < str.length; i++) {
                    if (numdecimal > 1) {//如果'.'数目大于1
                        flag = false;
                        break;
                    }
                    if (!isDigit(str[i])) {
                        if (str[i]=='.') numdecimal++;
                        else if (str[i]=='e'||str[i]=='E') {
                            if (i==1||i==str.length-1) {//如果是e或者E但是,e或者E作为最后一个字符
                                flag = false;
                                break;
                            }
                            else if (str[i+1]=='-'||str[i+1]=='+') {//如果出现了-或者+号,但是前面的字符不是e,或者E
                                if ((i+1) == str.length-1) {//比如"4e-"这种情况
                                    flag = false;
                                    break;
                                }
                                else {//
                                    int j = i+2;
                                    for (j = i+2; j < str.length; j++) {
                                        if (!isDigit(str[j])) {
                                            flag = false;
                                            break;
                                        }
                                    }
                                    if (j == str.length) flagEafter = true;
                                }
                            } else {
                                int j = i+1;
                                for (j = i+1; j < str.length; j++) {
                                    if (!isDigit(str[j])) {
                                        flag = false;
                                        break;
                                    }
                                }
                                if (j == str.length) flagEafter = true;
                            }
                        } else {//如果在e,E之前有除了-,+的其他字符
                            flag = false;
                            break;
                        }
                    }
                }
                if (flagEafter) flag = true;
            } else {
                flag = false;
            }
        }
        return flag;
    }

    public static boolean isDigit(char ch) {
        if (ch>='0'&&ch<='9') return true;
        return false;
    }
}