问题描述:
验证给定的字符串是否可以解释为十进制数字。
例如:
"0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true " -90e3 " => true " 1e" => false "e3" => false " 6e-1" => true " 99e2.5 " => false "53.5e93" => true " --6 " => false "-+3" => false "95a54e53" => false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
数字 0-9
指数 - "e"
正/负号 - "+"/"-"
小数点 - "."
当然,在输入中,这些字符的上下文也很重要。
思路:
判断一个字符串是否可以解释为十进制数字,可以使用一下规则来校验:
1、字符串中只能包含
数字 0-9
指数 - "e"
正/负号 - "+"/"-"
小数点 - "."
2、第一个字符只能为
数字 0-9
正/负号 - "+"/"-"
小数点 - "."
如果第一个字符为小数点,默认小数点前有一个'0'
3、正/负号 - "+"/"-" 只能出现在第一个字符或"e"后面
4、字符串中最多出现一个小数点 - ".",且"."不能出现在"e"后面
5、字符串中最多出现一个指数 - "e",且"e"之前之后必须有数字 0-9;如果"e"之后有正/负号 - "+"/"-",必须在"e"与数字之间
java代码:
public boolean isNumber(String s) { if(null == s){ return false; } s = s.trim(); if(s.length() == 0){ return false; } boolean hasNum = false; boolean hasDot = false; boolean hasE = false; boolean numAfterE = false; int start = 0; if(s.charAt(0) == '+'){ start ++; }else if(s.charAt(0) == '-'){ start ++; }else if(s.charAt(0) == '.'){ hasDot = true; start ++; }else if (!Character.isDigit(s.charAt(0))){ return false; } while(start < s.length()){ char c = s.charAt(start); if(!Character.isDigit(c)){ if(c == '+' || c == '-'){ if(start > 0 && s.charAt(start - 1) != 'e'){ return false; } } else if(s.charAt(start) == 'e'){ if(hasE || !hasNum){ return false; } hasE = true; numAfterE = false; }else if(s.charAt(start) == '.'){ if(hasDot || hasE){ return false; }else{ hasDot = true; } }else { return false; } }else{ hasNum = true; numAfterE = true; } start ++; } return hasNum && numAfterE; }