Replace isJsonNumber with version from gjson

This commit is contained in:
Jordan Armstrong 2019-10-28 22:35:44 -03:00
parent 41fb410e2e
commit e0eca0d55e

View File

@ -41,52 +41,80 @@ func jsonString(s string) string {
return string(b) return string(b)
} }
func isJsonNumber(s string) bool { func isJsonNumber(data string) bool {
// Returns true if the given string can be encoded as a JSON number value. // Returns true if the given string can be encoded as a JSON number value.
// See: // See:
// https://json.org // https://json.org
// http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
l := len(s) if data == "" {
if l == 0 {
return false return false
} }
i := 0 i := 0
if s[i] == '-' { // sign
if data[i] == '-' {
i++ i++
} }
switch { if i == len(data) {
case i == l:
return false return false
case s[i] == '0': // 0 must not be followed by any digits. }
// int
if data[i] == '0' {
i++ i++
break } else {
case s[i] >= '1' && s[0] <= '9': for ; i < len(data); i++ {
for i++; i < l && s[i] >= '0' && s[i] <= '9'; i++ { // scan over digits if data[i] >= '0' && data[i] <= '9' {
continue
}
break
} }
default:
return false
} }
if i == l { // frac
if i == len(data) {
return true return true
} }
if l-i > 1 && s[i] == '.' { if data[i] == '.' {
for i++; i < l && s[i] >= '0' && s[i] <= '9'; i++ { i++
if i == len(data) {
return false
}
if data[i] < '0' || data[i] > '9' {
return false
}
i++
for ; i < len(data); i++ {
if data[i] >= '0' && data[i] <= '9' {
continue
}
break
} }
} }
if l-i > 1 && (s[i] == 'e' || s[i] == 'E') { // exp
if i == len(data) {
return true
}
if data[i] == 'e' || data[i] == 'E' {
i++ i++
if s[i] == '-' || s[i] == '+' { if i == len(data) {
return false
}
if data[i] == '+' || data[i] == '-' {
i++ i++
} }
switch { if i == len(data) {
case i == l:
return false return false
case s[i] >= '0' && s[0] <= '9': }
for i++; i < l && s[i] >= '0' && s[i] <= '9'; i++ { if data[i] < '0' || data[i] > '9' {
return false
}
i++
for ; i < len(data); i++ {
if data[i] >= '0' && data[i] <= '9' {
continue
} }
break
} }
} }
return i == l return i == len(data)
} }
func appendJSONSimpleBounds(dst []byte, o geojson.Object) []byte { func appendJSONSimpleBounds(dst []byte, o geojson.Object) []byte {