diff --git a/decimal.go b/decimal.go index e73b379..ff54c64 100644 --- a/decimal.go +++ b/decimal.go @@ -51,6 +51,14 @@ var DivisionPrecision = 16 // silently lose precision. var MarshalJSONWithoutQuotes = false +// StringTrimTrailingZeros should be set to false if you want the decimal stringify without zeros trailing. +// By default, when decimal is output as a string (for example, in JSON), zeros are truncated from it (2.00 -> 2, 3.11 -> 3.11, 13.000 -> 13). +// But this logic can be changed by this variable. +// For example, if you have numeric(10,2) values stored in your database, +// and you want your API response to always be given 2 decimal places (even 2.00, 3.00, 17.00 [not 2,3,17]), +// then this variable is a great way out. +var StringTrimTrailingZeros = true + // ExpMaxIterations specifies the maximum number of iterations needed to calculate // precise natural exponent value using ExpHullAbrham method. var ExpMaxIterations = 1000 @@ -1142,7 +1150,7 @@ func (d Decimal) InexactFloat64() float64 { // // -12.345 func (d Decimal) String() string { - return d.string(true) + return d.string(StringTrimTrailingZeros) } // StringFixed returns a rounded fixed-point string with places digits after diff --git a/decimal_test.go b/decimal_test.go index 17d4627..7ed01c9 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -3407,3 +3407,48 @@ func ExampleNewFromFloat() { //0.123123123123123 //-10000000000000 } + +func TestDecimal_String(t *testing.T) { + type testData struct { + input string + expected string + } + + tests := []testData{ + {"1.22", "1.22"}, + {"1.00", "1"}, + {"153.192", "153.192"}, + {"999.999", "999.999"}, + {"0.0000000001", "0.0000000001"}, + {"0.0000000000", "0"}, + } + + for _, test := range tests { + d, err := NewFromString(test.input); + if err != nil { + t.Fatal(err) + } else if d.String() != test.expected { + t.Errorf("expected %s, got %s", test.expected, d.String()) + } + } + + defer func() { + StringTrimTrailingZeros = true + }() + + StringTrimTrailingZeros = false + tests = []testData{ + {"1.00", "1.00"}, + {"0.00", "0.00"}, + {"129.123000", "129.123000"}, + } + + for _, test := range tests { + d, err := NewFromString(test.input); + if err != nil { + t.Fatal(err) + } else if d.String() != test.expected { + t.Errorf("expected %s, got %s", test.expected, d.String()) + } + } +}