65.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package main
  2. func isNumber(s string) bool {
  3. // Indices of number begin, dot, exp, number end (not included)
  4. begIdx, dotIdx, expIdx, endIdx := -1, -1, -1, -1
  5. // Has significant digit, has exp digit, previous one is digit
  6. sigDigit, expDigit, lDigit := false, true, false
  7. for i := range s {
  8. switch s[i] {
  9. case ' ':
  10. if begIdx != -1 {
  11. endIdx = i
  12. }
  13. lDigit = false
  14. case '+', '-':
  15. if begIdx == -1 {
  16. begIdx = i
  17. } else if i != expIdx+1 { // If not at begin and not after exp
  18. return false
  19. }
  20. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  21. if !lDigit { // Is the first digit
  22. if endIdx != -1 { // Appears after end
  23. return false
  24. }
  25. if begIdx == -1 {
  26. begIdx = i
  27. }
  28. lDigit = true
  29. if expIdx == -1 { // Update sig digit & exp digit
  30. sigDigit = true
  31. } else {
  32. expDigit = true
  33. }
  34. }
  35. case '.':
  36. // If: has two dots || appears after exp || appears after end
  37. if dotIdx != -1 || expIdx != -1 || (!lDigit && endIdx != -1) {
  38. return false
  39. }
  40. if begIdx == -1 {
  41. begIdx = i
  42. }
  43. dotIdx = i
  44. case 'e':
  45. // If: has two exp || no digit at left side || appears after end
  46. if expIdx != -1 || !lDigit || endIdx != -1 {
  47. return false
  48. }
  49. expIdx = i
  50. lDigit = false
  51. expDigit = false // Needs exp digit
  52. default:
  53. return false
  54. }
  55. }
  56. return sigDigit && expDigit
  57. }
  58. // func main() {
  59. // println(isNumber(" 23 "))
  60. // println(isNumber("6e-1"))
  61. // println(isNumber("-53.5e+93"))
  62. // println(isNumber(". 1"))
  63. // println(isNumber("0e-"))
  64. // println(isNumber("e-5"))
  65. // println(isNumber(""))
  66. // println(isNumber("1 a"))
  67. // println(isNumber("--1"))
  68. // println(isNumber("1. 31"))
  69. // println(isNumber(".e-4"))
  70. // println(isNumber("-."))
  71. // }