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