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("-.")) // }