-
Notifications
You must be signed in to change notification settings - Fork 623
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #295 | String Trim Trailing Zeros bool variable #296
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -52,6 +52,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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can simply call it There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I also wonder whether we should introduce another config var for specifying NewFromString behaviour. The current implementation does not trim zeroes during the initialization from string, but we saw in the past that some developers would like to see such an option. |
||
|
||
// ExpMaxIterations specifies the maximum number of iterations needed to calculate | ||
// precise natural exponent value using ExpHullAbrham method. | ||
var ExpMaxIterations = 1000 | ||
|
@@ -1022,7 +1030,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 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3339,3 +3339,48 @@ func ExampleNewFromFloat() { | |
//0.123123123123123 | ||
//-10000000000000 | ||
} | ||
|
||
func TestDecimal_String(t *testing.T) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could we separate test cases for |
||
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()) | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you think about it? A bit simplified and a bit more explicit version of your suggestion.