表示数值的字符串

题目

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

解题

表示数值的字符串准守下面模式:
[sign]integraldigits[.[fractionaldigits]][e|E[sign]exponentialdigits]
其中
[] 之间的可有可以无
sign 符合: +
integraldigits 整数部分
fractionaldigits 小数部分
e|E 表示指数形式表示
exponentialdigits 指数部分
线性的判断,书上程序

public class Solution {
        public boolean isNumeric(char[] str) {
        if(str==null||str.length==0)
                return false;
        int i=0;
        if(str[i]=='+'||str[i]=='-')
            i++;
        boolean numeric=true;
        i=scanDigits(str, i);
        if(i!=str.length){
            if(str[i]=='.'){
                i++;
                i=scanDigits(str, i);
                if(i<str.length&&(str[i]=='e'||str[i]=='E')){
                    numeric=isExp(str, i);
                    if(numeric&&i!=str.length&&(str[i+1]=='+'||str[i+1]=='-'))
                        i=scanDigits(str, i+2);
                    else if (numeric&&i!=str.length) {
                        i=scanDigits(str, i+1);
                    }
                }
            }else if (str[i]=='e'||str[i]=='E') {
                   numeric=isExp(str, i);
                    if(numeric&&i!=str.length&&(str[i+1]=='+'||str[i+1]=='-'))
                        i=scanDigits(str, i+2);
                    else if (numeric&&i!=str.length) {
                        i=scanDigits(str, i+1);
                    }
             }else{
                    numeric=false;
                }
        }

       return numeric&&(i==str.length);
    }

    public  int scanDigits(char[] str,int i){
            while(i<str.length&&str[i]>='0'&&str[i]<='9')
                i++;
            return i;
        }
    public  boolean isExp(char[] str,int i){
            if(str[i]!='e'&&str[i]!='E')
                return false;
            i++;
            if(i>=str.length)
                return false;
            if(str[i]=='+'||str[i]=='-')
                i++;
            if(i>=str.length)
                return false;
            int j=scanDigits(str, i);
            return (j==str.length)?true:false;
        }

}

扫描数字的过程很复杂
可以正则把数字用一个特殊符号代替
可以直接正则表达式匹配是否是数字

public class Solution {
    public boolean isNumeric(char[] str) {
        String string = String.valueOf(str) ;
        String p = "[\\+\\-]?\\d*(\\.\\d*)?([eE][\\+\\-]?\\d+)?";
        return string.matches(p);
    }
}

你可能感兴趣的:(表示数值的字符串)