From 0d6dae80e1bbe4d1f9cbda5515f2a741c55181ac Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 10 Jul 2017 02:06:37 -0400 Subject: [PATCH] Fix exponent parsing --- feature_any_string.go | 2 +- feature_iter_float.go | 2 +- jsoniter_any_float_test.go | 28 ++++++++++++++++++++++++++++ jsoniter_float_test.go | 5 ++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/feature_any_string.go b/feature_any_string.go index 5a0e8da..56afc22 100644 --- a/feature_any_string.go +++ b/feature_any_string.go @@ -136,7 +136,7 @@ func (any *stringAny) ToFloat64() float64 { // eg 123true => 123, -12.12xxa => -12.12 endPos := 1 for i := 1; i < len(any.val); i++ { - if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' { + if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { endPos = i + 1 continue } diff --git a/feature_iter_float.go b/feature_iter_float.go index 994f5ae..57693d6 100644 --- a/feature_iter_float.go +++ b/feature_iter_float.go @@ -133,7 +133,7 @@ load_loop: for i := iter.head; i < iter.tail; i++ { c := iter.buf[i] switch c { - case '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + case '+', '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': str = append(str, c) continue default: diff --git a/jsoniter_any_float_test.go b/jsoniter_any_float_test.go index 305a8e6..bf1524e 100644 --- a/jsoniter_any_float_test.go +++ b/jsoniter_any_float_test.go @@ -14,6 +14,34 @@ var floatConvertMap = map[string]float64{ `"true"`: 0, `"false"`: 0, + "1e1": 10, + "1e+1": 10, + "1e-1": .1, + "1E1": 10, + "1E+1": 10, + "1E-1": .1, + + "-1e1": -10, + "-1e+1": -10, + "-1e-1": -.1, + "-1E1": -10, + "-1E+1": -10, + "-1E-1": -.1, + + `"1e1"`: 10, + `"1e+1"`: 10, + `"1e-1"`: .1, + `"1E1"`: 10, + `"1E+1"`: 10, + `"1E-1"`: .1, + + `"-1e1"`: -10, + `"-1e+1"`: -10, + `"-1e-1"`: -.1, + `"-1E1"`: -10, + `"-1E+1"`: -10, + `"-1E-1"`: -.1, + "123": 123, `"123true"`: 123, `"+"`: 0, diff --git a/jsoniter_float_test.go b/jsoniter_float_test.go index 092be56..2f2c2d9 100644 --- a/jsoniter_float_test.go +++ b/jsoniter_float_test.go @@ -29,7 +29,10 @@ func Test_read_big_int(t *testing.T) { } func Test_read_float(t *testing.T) { - inputs := []string{`1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`} + inputs := []string{ + `1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`, + `1e1`, `1e+1`, `1e-1`, `1E1`, `1E+1`, `1E-1`, `-1e1`, `-1e+1`, `-1e-1`, + } for _, input := range inputs { // non-streaming t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {