Skip to content

Commit 559a8d8

Browse files
authored
x.json2: fix decoding of float values in scientific notation (fix #26043) (fix #26062) (#26060)
1 parent 129ea22 commit 559a8d8

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

‎vlib/x/json2/encode.v‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,10 @@ fn (mut encoder Encoder) encode_boolean(val bool) {
217217
fn (mut encoder Encoder) encode_number[T](val T) {
218218
integer_val := val.str()
219219
$if T is $float {
220-
if integer_val[integer_val.len - 1] == `0` { // ends in .0
220+
if integer_val.len > 2 && integer_val[integer_val.len - 2] == `.`
221+
&& integer_val[integer_val.len - 1] == `0` { // ends in .0
222+
// `2.0` = > `2`
223+
// but skip float in scientific notation, `1e+10`
221224
unsafe {
222225
integer_val.len -= 2
223226
}

‎vlib/x/json2/tests/encoder_test.v‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,15 @@ fn test_encode_time() {
177177

178178
assert json.encode(time.Time{}) == '"0000-00-00T00:00:00.000Z"'
179179
}
180+
181+
fn test_encode_float() {
182+
// remove ending `.0`
183+
assert json.encode(1.0) == '1'
184+
185+
// TODO: better generate `1e10` instead of `1e+10`
186+
assert json.encode(1.0e+10) == '1e+10'
187+
assert json.encode(1.0e10) == '1e+10'
188+
assert json.encode(1.e10) == '1e+10'
189+
assert json.encode(1.0e-10) == '1e-10'
190+
assert json.encode(1.1e10) == '1.1e+10'
191+
}

0 commit comments

Comments
 (0)