| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | 
							- package main
 
- func isNumber(s string) bool {
 
- 	// Indices of number begin, dot, exp, number end (not included)
 
- 	begIdx, dotIdx, expIdx, endIdx := -1, -1, -1, -1
 
- 	// Has significant digit, has exp digit, previous 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("   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("-."))
 
- // }
 
 
  |