53. 表示数值的字符串

题目描述

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

Solution

  1. 正则表达式
[]  : 字符集合
()  : 分组
?   : 重复 0 ~ 1+   : 重复 1 ~ n 次
*   : 重复 0 ~ n 次
.   : 任意字符
\\. : 转义后的 .
\\d : 数字
public class Solution {
        public boolean isNumeric(char[] str) {
            String pattern = "[\\+-]?\\d*(\\.\\d*)?([eE][\\+-]?\\d+)?";
            return String.valueOf(str).matches(pattern);       
        }
    }
public class Solution {
	    public boolean isNumeric(char[] str) {
	    	if (str == null || str.length < 1) {
	    		return false;
	    	}
	    	boolean sign = false, decimal = false, hasE = false;  //+-符号,小数点,e是否出现
	    	for (int i = 0; i < str.length; i++) {
	    		if (str[i] == 'e' || str[i] == 'E') {
	    			if (i == str.length-1) { //e不能是结尾
	    				return false;
	    			}
	    			if (hasE) {   //不能出现多个e
	    				return false;
	    			}
	    			hasE = true;
	    		} else if (str[i] == '.') {
	    			if (decimal || hasE) {  //不能出现多个小数点,小数点不能在e之后出现
	    				return false;
	    			}
	    			decimal = true;
	    		} else if (str[i] == '+' || str[i] == '-') {  
	    			if (!sign && i != 0 && str[i-1] != 'e' && str[i-1] != 'E') { //第一个sign要在开头或紧跟e
	    				return false;
	    			}
	    			if (sign && str[i-1] != 'e' && str[i-1] != 'E') { //第二个sign要紧跟e
	    				return false;
	    			} 
	    			sign = true;
	    		} else if (str[i] < '0' || str[i] > '9') { //非法字符
	    			return false;
	    		}
	    	}
	    	return true;
	    }
	}

你可能感兴趣的:(剑指)