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.
這道題題意很簡(jiǎn)單睬罗,判斷一個(gè)字符串是否是一個(gè)合法的數(shù)字表示。但是坑非常多棘幸,因?yàn)轭}目沒有說明合法的條件范圍翼闽,比如.1、1.笙什、2.e5這幾種情況是被認(rèn)為合法的飘哨,自己主觀上認(rèn)為是不合法的。
需要注意的幾個(gè)地方:1琐凭、小數(shù)點(diǎn)和e的位置關(guān)系芽隆;2、正負(fù)號(hào)只能出現(xiàn)在第一位或者e后面统屈;3胚吁、小數(shù)點(diǎn)和e只能出現(xiàn)一次;4愁憔、e后面必須要跟數(shù)字囤采;5、處理字符串之前惩淳,先trim一下蕉毯,解決首尾空格的問題。
自己寫的代碼思犁,邏輯比較亂代虾。discuss中用各種狀態(tài)開關(guān)來驗(yàn)證相互之間的關(guān)系,邏輯十分清晰激蹲。直接帖上自己按照discuss思路寫的代碼:
public boolean isNumber(String s) {
if (s == null) {
return false;
}
s = s.trim();
if (s.length() == 0) {
return false;
}
boolean numSeen = false;
boolean numAfterE = false;
boolean eSeen = false;
boolean pointSeen = false;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
numSeen = true;
numAfterE = true;
} else if (s.charAt(i) == '.') {
if (pointSeen || eSeen) {
return false;
}
pointSeen = true;
} else if (s.charAt(i) == 'e') {
if (eSeen || !numSeen) {
return false;
}
eSeen = true;
numAfterE = false;
} else if (s.charAt(i) == '-' || s.charAt(i) == '+') {
if (i != 0 && s.charAt(i-1) != 'e') {
return false;
}
} else {
return false;
}
}
return numSeen && numAfterE;
}