Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous.
You should gather all requirements up front before implementing one.
这道题作为leetcode的 H 难度题目我也反感,因为全是琐碎的corner cases。
但这道题也有可取之处,就是直接用一个for 或者while循环处理所有cases。
public boolean isNumber(String s){
//source: https://discuss.leetcode.com/topic/9490/clear-java-solution-with-ifs
/**1. empty string ->false
* 2. space before or after -->true
* 3. 科学计数法: "2e+10", "2e-10", "2e10", “2e0" all true
* 4. 小数点,一旦出现后面必须有数字,前面必须有数字。 “2.” true.
* */
s = s.trim();
boolean pointSeen = false;
boolean eSeen = false;
boolean numberSeen = false;
boolean numberAfterE = true;
for(int i=0; i<s.length(); i++) {
if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
numberSeen = true;
numberAfterE = true; //数字出现可能两处,第一是e前,第二是e后。
//一旦e出现,numberAfterE=false, 必须再进一次这个if, numAfterE才会设成true.
} else if(s.charAt(i) == '.') {
//e出现 或者 ‘.’已经存在,返回false
if(eSeen || pointSeen) {
return false;
}
pointSeen = true;
} else if(s.charAt(i) == 'e') {
//e已经出现过,或者在e之前没有数字,返回false
if(eSeen || !numberSeen) {
return false;
}
numberAfterE = false;
eSeen = true;
} else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
//在没有e的情况下,出现正负号必须是首位。
//如果正负号出现在其他位置,前面一个必须是e.
if(i != 0 && s.charAt(i-1) != 'e') {
return false;
}
//跟正负号有关的其他情况,不处理。
//这段命令不能反过来写成:
//如果正负号是第一位,或者正负号前面是e, 有数字出现,就能return true.
} else {
//除了上述情况之外,默认false. ""的情况涵盖了。
return false;
}
}
return numberSeen && numberAfterE;
}