|
@@ -1,9 +1,73 @@
|
|
|
package main
|
|
|
|
|
|
func isNumber(s string) bool {
|
|
|
- return false
|
|
|
+ // Indices of number begin, dot, exp, number end (not included)
|
|
|
+ begIdx, dotIdx, expIdx, endIdx := -1, -1, -1, -1
|
|
|
+ // Has significant digit, has exp digit, last one is digit
|
|
|
+ sigDigit, expDigit, lDigit := false, true, false
|
|
|
+ for i := range s {
|
|
|
+ switch s[i] {
|
|
|
+ case ' ':
|
|
|
+ if begIdx != -1 {
|
|
|
+ endIdx = i
|
|
|
+ }
|
|
|
+ lDigit = false
|
|
|
+ case '+', '-':
|
|
|
+ if begIdx == -1 {
|
|
|
+ begIdx = i
|
|
|
+ } else if i != expIdx+1 { // If not at begin and not after exp
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
|
|
|
+ if !lDigit { // Is the first digit
|
|
|
+ if endIdx != -1 { // Appears after end
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if begIdx == -1 {
|
|
|
+ begIdx = i
|
|
|
+ }
|
|
|
+ lDigit = true
|
|
|
+ if expIdx == -1 { // Update sig digit & exp digit
|
|
|
+ sigDigit = true
|
|
|
+ } else {
|
|
|
+ expDigit = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case '.':
|
|
|
+ // If: has two dots || appears after exp || appears after end
|
|
|
+ if dotIdx != -1 || expIdx != -1 || (!lDigit && endIdx != -1) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if begIdx == -1 {
|
|
|
+ begIdx = i
|
|
|
+ }
|
|
|
+ dotIdx = i
|
|
|
+ case 'e':
|
|
|
+ // If: has two exp || no digit at left side || appears after end
|
|
|
+ if expIdx != -1 || !lDigit || endIdx != -1 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ expIdx = i
|
|
|
+ lDigit = false
|
|
|
+ expDigit = false // Needs exp digit
|
|
|
+ default:
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sigDigit && expDigit
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
- println(isNumber(""))
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// println(isNumber(" 23 "))
|
|
|
+// println(isNumber("6e-1"))
|
|
|
+// println(isNumber("-53.5e+93"))
|
|
|
+// println(isNumber(". 1"))
|
|
|
+// println(isNumber("0e-"))
|
|
|
+// println(isNumber("e-5"))
|
|
|
+// println(isNumber(""))
|
|
|
+// println(isNumber("1 a"))
|
|
|
+// println(isNumber("--1"))
|
|
|
+// println(isNumber("1. 31"))
|
|
|
+// println(isNumber(".e-4"))
|
|
|
+// println(isNumber("-."))
|
|
|
+// }
|