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.
/** * We start with trimming. * If we see [0-9] we reset the number flags. * We can only see . if we didn't see e or .. * We can only see e if we didn't see e but we did see a number. We reset numberAfterE flag. * We can only see + and - in the beginning and after an e * any other character break the validation. * At the end it is only valid if there was at least 1 number and if we did see an e then a number after it as well. * So basically the number should match this regular expression: * [-+]?(([0-9]+(.[0-9]*)?)|.[0-9]+)(e[-+]?[0-9]+)? * *翻译: *如果我们看到数字,就将numberFlag设为true *如果看到小数点,则判断是否已有小数点或是e,因为e后只能有整数 *e只能遇到一次,如果第一次遇到e但是没有遇到数字,则返回错误。遇到第一个e后,将numberAfterE flag标注为否以便判断后序是否有数字 *正负号的位置只能位于最开始和e紧邻着右边那个位置 */ publicbooleanisNumber3(String s){ s = s.trim(); booleanpointSeen=false; booleaneSeen=false; booleannumberSeen=false; booleannumberAfterE=true; for(int i=0; i<s.length(); i++) { //当前值为数字 if('0' <= s.charAt(i) && s.charAt(i) <= '9') { numberSeen = true; numberAfterE = true; //遇到小数点 } elseif(s.charAt(i) == '.') { //已经遇到小数点或是e,则出错 if(eSeen || pointSeen) { returnfalse; } pointSeen = true; //遇到e } elseif(s.charAt(i) == 'e') { //已经遇到e或是尚未遇到数字 if(eSeen || !numberSeen) { returnfalse; } numberAfterE = false; eSeen = true; //遇到正负号,只能在首位或是e后面 } elseif(s.charAt(i) == '-' || s.charAt(i) == '+') { if(i != 0 && s.charAt(i-1) != 'e') { returnfalse; } //遇到其它符号一定是错的 } else { returnfalse; } } //是否遇到小数点或是e均不重要 return numberSeen && numberAfterE; }