表示数值的字符串

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

第一种解法

/*
以下对正则进行解释:
[\\+\\-]?            -> 正或负符号出现与否
\\d*                 -> 整数部分是否出现,如-.34 或 +3.34均符合
(\\.\\d+)?           -> 如果出现小数点,那么小数点后面必须有数字;
                        否则一起不出现
([eE][\\+\\-]?\\d+)? -> 如果存在指数部分,那么e或E肯定出现,+或-可以不出现,
                        紧接着必须跟着整数;或者整个部分都不出现
*/

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

第二种解法

public class Solution {
    public boolean isNumeric(char[] str) {
        // 过滤特殊情况
        if(str == null || str.length == 0)
            return false;

        // 这里注意几个细节
        // 1、特殊字符可以是+-.eE,其中+-.可以出现在开头
        // 2、.在数字中只能出现一次
        // 3、+-可以在eE后面再出现一次
        // 4、e只能在数字或.的后面出现
        // 5、e不能出现在末尾
        // 6、不能只出现+-或者.
        // 7、不能出现上述的几个特殊字符意外的字符
        int start = 0;
        boolean dot = false, sign = false, hasE = false;
        if(!Character.isDigit(str[0])){
            if(str[0] == '+' || str[0] =='-'){
                sign = true;
                start++;
            }else if(str[0] == '.'){
                dot = true;
                start++;
            }else
                return false;
        }

        if(start == str.length - 1)
            return false;

        for(int i = start; i < str.length; i++){
            if(Character.isDigit(str[i]))
                continue;
            else if(str[i] == '+' || str[i] == '-'){
                if(sign)
                    return false;
                else if(str[i - 1] == 'E' || str[i - 1] == 'e')
                    sign = true;
                else return false;
            }else if(str[i] == '.'){
                if(dot)
                    return false;
                dot = true;
            }else if(str[i] == 'e' || str[i] == 'E'){
                if(hasE || i == str.length - 1)
                    return false;
                else if(str[i - 1] == '.' || Character.isDigit(str[i - 1])){
                    hasE = true;
                    sign = false;
                    dot = true;
                }else return false;
            }else
                return false;
        }
        return true;
    }
}

第三种解法

public class Solution {
    boolean isNumeric(char[] s) {
        if(s.length==0) return false;
        if((s.length==1)&&(s[0]<'0'||s[0]>'9')) return false;
        if(s[0]=='+'||s[0]=='-'){
            if(s.length==2&&(s[1]=='.')) return false;
        }else if((s[0]<'0'||s[0]>'9')&&s[0]!='.') return false;//首位既不是符号也不是数字还不是小数点,当然是false
        int i = 1;
        while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
        if(i<s.length&&s[i]=='.'){
            i++;
            //if(i>=s.length) return false;
            while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
        }
        if(i<s.length&&(s[i]=='e'||s[i]=='E')){
            i++;
            if((i<s.length)&&(s[i]=='+'||s[i]=='-')){
                i++;
                if(i<s.length) while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
                else return false;
            }else if(i<s.length){
                while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
            }else return false;
        }
        if(i<s.length) return false;            
        return true;        
    }
}

第四种解法

public boolean solution(char[] str){
        //排除特殊情况
        if(str == null || str.length ==1 ) return false;
        char pre = ' ';
        int dotNum = 0;
        int eNum = 0;
        for(int i = 0; i<str.length; i++){
            char c = str[i];

            if(isNum(c)){ //如果是数字,数字前面可以是任何合法字符
                pre = c;
                continue;
            }

            if(isSign(c)){ //如果是加减符号,那么只能出出现在首位或者e后面
                if(pre == ' ' || isE(pre)){
                    pre = c;
                } else {
                    return  false;
                }
                continue;
            }

            if(isE(c)){ //如果是e 只能出现在数字后面,且最多有一个
                if(isNum(pre) && eNum <1){
                    pre = c;
                    eNum++;
                    dotNum++; //e后面就不能有'.'了
                } else  {
                    return  false;
                }

                continue;
            }

            if(isDot(c)){ //如果是 . 那么只能出现在数字后面,且最多只有一个
                if((isNum(pre) || isSign(pre)) && dotNum<1){
                    pre = c;
                    dotNum++;
                } else {
                    return false;
                }
                continue;
            }

            return  false; //其它都是非法字符
        }

        //验证最后一个元素
        if(isNum(str[str.length-1])){ //验证下最后一个是否为数字
            return true;
        }
        return false;
    }

    private boolean isNum(char c){
        return (c >= 48 && c<=57);
    }

    private boolean isSign(char c){
        return (c=='-' || c=='+');
    }

    private boolean isE(char c) {
        return (c == 'e' || c== 'E');
    }

    private boolean isDot(char c){
        return c=='.';
    }

猜你喜欢

转载自blog.csdn.net/u014651560/article/details/80357576