Skip to content

Commit

Permalink
encode: ensure floats have decimal point (#615)
Browse files Browse the repository at this point in the history
Fixes #571

Co-authored-by: Sterling Hanenkamp <sterling@ziprecruiter.com>
  • Loading branch information
zostay and Sterling Hanenkamp authored Oct 14, 2021
1 parent 86632bc commit 4984dcb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
13 changes: 11 additions & 2 deletions marshaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding"
"fmt"
"io"
"math"
"reflect"
"sort"
"strconv"
Expand Down Expand Up @@ -244,9 +245,17 @@ func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, e
case reflect.String:
b = enc.encodeString(b, v.String(), ctx.options)
case reflect.Float32:
b = strconv.AppendFloat(b, v.Float(), 'f', -1, 32)
if math.Trunc(v.Float()) == v.Float() {
b = strconv.AppendFloat(b, v.Float(), 'f', 1, 32)
} else {
b = strconv.AppendFloat(b, v.Float(), 'f', -1, 32)
}
case reflect.Float64:
b = strconv.AppendFloat(b, v.Float(), 'f', -1, 64)
if math.Trunc(v.Float()) == v.Float() {
b = strconv.AppendFloat(b, v.Float(), 'f', 1, 64)
} else {
b = strconv.AppendFloat(b, v.Float(), 'f', -1, 64)
}
case reflect.Bool:
if v.Bool() {
b = append(b, "true"...)
Expand Down
23 changes: 23 additions & 0 deletions marshaler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -822,3 +822,26 @@ func ExampleMarshal() {
// Name = 'go-toml'
// Tags = ['go', 'toml']
}

func TestIssue571(t *testing.T) {
type Foo struct {
Float32 float32
Float64 float64
}

const closeEnough = 1e-9

foo := Foo{
Float32: 42,
Float64: 43,
}
b, err := toml.Marshal(foo)
require.NoError(t, err)

var foo2 Foo
err = toml.Unmarshal(b, &foo2)
require.NoError(t, err)

assert.InDelta(t, 42, foo2.Float32, closeEnough)
assert.InDelta(t, 43, foo2.Float64, closeEnough)
}

0 comments on commit 4984dcb

Please sign in to comment.