我没有思路。
方法0:用这个方法 @8.30.2014
http://blog.csdn.net/linhuanmars/article/details/23809661
public class Solution {
public boolean isNumber(String s) {
if(s == null) return false;
s = s.trim();
if(s.length() == 0) return false;
boolean dotFlag = false;
boolean eFlag = false;
for(int i = 0; i < s.length(); i++){
switch(s.charAt(i)){
case '.':
if(dotFlag || eFlag
|| ((i == 0 || !(s.charAt(i-1)>='0' && s.charAt(i-1)<='9'))
&&(i == s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9'))))
return false;
dotFlag = true;
break;
case 'e':
case 'E':
if(eFlag || i== 0 ||i == s.length()-1)
return false;
eFlag = true;
break;
case '+':
case '-':
if((i>0 && s.charAt(i-1)!='e' && s.charAt(i-1)!='E')
||(i == s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9' ||s.charAt(i+1)=='.')))
return false;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
return false;//why?
}
}
return true;
}
}
Test cases:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
".1" => true
"1." => true
+.8 => true
"1 " => true
这段代码说明,当dot 是第一位时,后一位必须是数字;当dot是最后一位时,前一位必须是数字。也即允许这种情况:"5." @8.30.2014
//Upate on 1.28.2016
当dot既不是第一位也不是最后一位时,只要前后两个不同时为非数字即可。
case '.':
if(dotFlag || eFlag
|| ((i == 0 || !(s.charAt(i-1)>='0' && s.charAt(i-1)<='9'))
&&(i == s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9'))))
return false;
方法I: 参考 http://rleetcode.blogspot.com/2014/01/valid-number-java.html
类似有限自动机的思想:
public class Solution {
//code after reading: http://rleetcode.blogspot.com/2014/01/valid-number-java.html
public boolean isNumber(String s) {
if(s == null) return false;
s = s.trim();
//don't forget this
if(s.length() == 0) return false;
boolean canSign = true;
boolean canE = false;
boolean hasE = false;
boolean hasNum = false;
boolean canDot = true;
int i = 0;
while(i < s.length()){
char c = s.charAt(i++);
if(c == ' ') return false;
if(c == '+' || c == '-'){
if(!canSign){
return false;
}
canSign = false;
continue;
}
if(c == '.'){
if(!canDot){
return false;
}
canDot = false;
canSign = false;//don't forget. Cannot have +/- after .
continue;
}
if(c == 'e' || c == 'E'){
if(!canE||hasE){
return false;
}
canE = false;
hasE = true;
hasNum = false;//must have this. means that a string cannot end with e
canDot = false;//cannot have . after e
canSign = true;//can have +/- after e
continue;
}
if(c >= '0' && c <= '9'){
hasNum = true;
if(!canE && !hasE){//if previous char is not e
canE = true;
}
canSign = false;
}
else{
return false;
}
//i++;
}
return hasNum;
}
}
方法II: Regex。不会写。
import java.util.regex.Pattern;
public class Solution {
Pattern p = Pattern.compile("^[\\+\\-]?((\\d+(\\.\\d*)?)|(\\.\\d+))(e[\\+\\-]?\\d+)?$");
public boolean isNumber(String s) {
String ss = s.trim();
return p.matcher(ss).matches();
}
}