Replace isJsonNumber with version from gjson
This commit is contained in:
parent
41fb410e2e
commit
e0eca0d55e
@ -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++
|
||||||
|
} else {
|
||||||
|
for ; i < len(data); i++ {
|
||||||
|
if data[i] >= '0' && data[i] <= '9' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
break
|
break
|
||||||
case s[i] >= '1' && s[0] <= '9':
|
|
||||||
for i++; i < l && s[i] >= '0' && s[i] <= '9'; i++ { // scan over digits
|
|
||||||
}
|
}
|
||||||
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++ {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if l-i > 1 && (s[i] == 'e' || s[i] == 'E') {
|
|
||||||
i++
|
i++
|
||||||
if s[i] == '-' || s[i] == '+' {
|
if i == len(data) {
|
||||||
i++
|
|
||||||
}
|
|
||||||
switch {
|
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// exp
|
||||||
|
if i == len(data) {
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
return i == l
|
if data[i] == 'e' || data[i] == 'E' {
|
||||||
|
i++
|
||||||
|
if i == len(data) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if data[i] == '+' || data[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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i == len(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func appendJSONSimpleBounds(dst []byte, o geojson.Object) []byte {
|
func appendJSONSimpleBounds(dst []byte, o geojson.Object) []byte {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user