瀏覽代碼

fix float convert

Xargin 8 年之前
父節點
當前提交
4e65952c09
共有 2 個文件被更改,包括 37 次插入9 次删除
  1. 28 3
      feature_any_string.go
  2. 9 6
      jsoniter_any_float_test.go

+ 28 - 3
feature_any_string.go

@@ -119,12 +119,37 @@ func (any *stringAny) ToUint64() uint64 {
 }
 
 func (any *stringAny) ToFloat32() float32 {
-	parsed, _ := strconv.ParseFloat(any.val, 32)
-	return float32(parsed)
+	return float32(any.ToFloat64())
 }
 
 func (any *stringAny) ToFloat64() float64 {
-	parsed, _ := strconv.ParseFloat(any.val, 64)
+	if len(any.val) == 0 {
+		return 0
+	}
+
+	// first char invalid
+	if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') {
+		return 0
+	}
+
+	// extract valid num expression from string
+	// 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' {
+			endPos = i + 1
+			continue
+		}
+
+		// end position is the first char which is not digit
+		if any.val[i] >= '0' && any.val[i] <= '9' {
+			endPos = i + 1
+		} else {
+			endPos = i
+			break
+		}
+	}
+	parsed, _ := strconv.ParseFloat(any.val[:endPos], 64)
 	return parsed
 }
 

+ 9 - 6
jsoniter_any_float_test.go

@@ -15,12 +15,15 @@ var floatConvertMap = map[string]float64{
 	`"false"`: 0,
 
 	"123":       123,
-	`"123true"`: 0,
-
-	`"-123true"`: 0,
-	"0":          0,
-	`"0"`:        0,
-	"-1":         -1,
+	`"123true"`: 123,
+	`"+"`:       0,
+	`"-"`:       0,
+
+	`"-123true"`:  -123,
+	`"-99.9true"`: -99.9,
+	"0":           0,
+	`"0"`:         0,
+	"-1":          -1,
 
 	"1.1":       1.1,
 	"0.0":       0,