mio4 Java Web & Web Security

表示数值的字符串

2018-09-07
mio4

阅读:


表示数值的字符串

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

分析

  • 对于实例demo分析:典型的数值非法的情况有
    • +-号同时出现,不是第一次出现+-号并且不在E/e之后一个字符
    • 出现多个小数点,出现多个E/e
    • E/e不能是最后一个字符
    • 小数点在E/e之后出现
    • 出现非法字符
public class Solution {
	public static boolean isNumeric(char[] str) {
		boolean havesignal=false; //是否出现了+-号
		boolean haveE=false; //是否出现E/e
		boolean haveRadix=false; //是否出现小数点
		if(str == null || str.length == 0) //边界条件
			return false;

		for(int i=0; i < str.length; i++){
			if(str[i] == 'E' || str[i] == 'e'){
				if(haveE) //不能有多个E/e
					return false;
				if(i == str.length-1) //E/e不能是最后一个字符
					return false;
				haveE = true;
			} else if(str[i] == '+' || str[i] == '-'){
				if(havesignal  && (str[i-1] != 'E' && str[i-1] != 'e')) //如果已经出现了符号但是这个+-号不在E/e之后
					return false;
				if(!havesignal && i > 0 && str[i-1] != 'E' && str[i-1] != 'e')
					return false;
				havesignal = true;
			} else if(str[i] == '.'){
				if(haveRadix) //不能有多个小数点
					return false;
				if(haveE) //小数点不能在E/e之后
					return false;
				haveRadix = true;
			} else if(!(str[i] >= '0' && str[i] <= '9')){
				return false;
			}
		}

		return true;
	}


	public static void main(String[] args){
		String s1 = "+100";
		String s2 = "5e2";
		String s3 = "-123";
		String s4 = "3.14159";
		String s5 = "-1E-16";
		String s6 = "12e";
		String s7 = "1a3.14";
		String s8 = "1.2.3";
		String s9 = "+-5";
		String s10 = "12e+5.4";
		System.out.println("s1 " + isNumeric(s1.toCharArray())); //true
		System.out.println("s2 " + isNumeric(s2.toCharArray())); //true
		System.out.println("s3 " + isNumeric(s3.toCharArray())); //true
		System.out.println("s4 " + isNumeric(s4.toCharArray())); //true
		System.out.println("s5 " + isNumeric(s5.toCharArray())); //true
		System.out.println("s6 " + isNumeric(s6.toCharArray())); //false
		System.out.println("s7 " + isNumeric(s7.toCharArray())); //false
		System.out.println("s8 " + isNumeric(s8.toCharArray())); //false
		System.out.println("s9 " + isNumeric(s9.toCharArray())); //false
		System.out.println("s10 " + isNumeric(s10.toCharArray())); //true
		char[] cs = {'a','b'};
		System.out.println(String.valueOf(cs));
	}
}


Comments

Content