像站長這種小孬孬,還是決定先用 Regular Expression 試水溫。
不過就算是用 Regular Expression,還是費了好一番功夫。直到從 Regular Expression Cookbook 抄了一堆範例才成功,下方為 JavaScript 版源碼:
1 2 3 4 5 6 7 | /** * @param {string} s * @return {boolean} */ var isNumber = function (s) { return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][-+]?[0-9]+)?\s*$/.test(s); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #define IS_SIGN(ch) (ch == '+' || ch == '-') #define IS_EXP(ch) (tolower(ch) == 'e') bool isNumber( char * s) { int len; char *begin, *end; if (s == 0 || (len = strlen (s)) == 0) return false ; begin = s; end = s + len - 1; while ( isspace (*begin)) ++begin; while ( isspace (*end) && end > begin) --end; if (begin > end) return false ; ++end; if (IS_SIGN(*begin)) ++begin; if ( isdigit (*begin)){ ++begin; while ( isdigit (*begin)) ++begin; if (*begin == '.' ){ ++begin; while ( isdigit (*begin)) ++begin; } if (begin >= end){ return true ; } else if (IS_EXP(*begin)){ ++begin; } else { return false ; } if (begin >= end) return false ; if (IS_SIGN(*begin)) ++begin; if ( isdigit (*begin)) ++begin; else return false ; while ( isdigit (*begin)) ++begin; if (begin >= end) return true ; else return false ; } else if (*begin == '.' ){ ++begin; if ( isdigit (*begin)) ++begin; else return false ; while ( isdigit (*begin)) ++begin; if (begin >= end) return true ; else if (IS_EXP(*begin)) ++begin; else return false ; if (IS_SIGN(*begin)) ++begin; if ( isdigit (*begin)) ++begin; else return false ; while ( isdigit (*begin)) ++begin; if (begin >= end) return true ; else return false ; } else { return false ; } } |
由這份題解可以發現,http://weibo.com/luangong 用了有限狀態機,所以只需要走訪一次字串即可。還有人用 strtod,那就比 Regular Expression 更像作弊了wwww
沒有留言:
張貼留言