Forráskód Böngészése

Merge pull request #125 from liggitt/exponents

Fix exponent parsing
Tao Wen 8 éve
szülő
commit
b27718d16b
4 módosított fájl, 34 hozzáadás és 3 törlés
  1. 1 1
      feature_any_string.go
  2. 1 1
      feature_iter_float.go
  3. 28 0
      jsoniter_any_float_test.go
  4. 4 1
      jsoniter_float_test.go

+ 1 - 1
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
 		}

+ 1 - 1
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:

+ 28 - 0
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,

+ 4 - 1
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) {