1
0
mirror of https://github.com/getsops/sops.git synced 2026-02-05 12:45:21 +01:00

Improve formatting of floats.

Signed-off-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
Felix Fontein
2025-08-30 17:07:39 +02:00
parent 2e2d7d998c
commit 816b797ccc
3 changed files with 16 additions and 7 deletions

View File

@@ -306,7 +306,7 @@ bar: baz
assert!(
data == "[the_section]
int = 123
float = 1.230000
float = 1.23
bool = true
date = 2025-01-02T00:00:00Z
timestamp = 2025-01-02T03:04:05Z

View File

@@ -82,7 +82,12 @@ func (store Store) stripCommentChar(comment string) string {
func (store Store) valToString(v interface{}) string {
switch v := v.(type) {
case float64:
return strconv.FormatFloat(v, 'f', 6, 64)
result := strconv.FormatFloat(v, 'G', -1, 64)
// If the result can be confused with an integer, make sure we have at least one decimal digit
if !strings.ContainsRune(result, '.') && !strings.ContainsRune(result, 'E') {
result = strconv.FormatFloat(v, 'f', 1, 64)
}
return result
case bool:
return strconv.FormatBool(v)
case time.Time:

View File

@@ -187,11 +187,15 @@ func TestUnmarshalMetadataFromNonSOPSFile(t *testing.T) {
func TestValToString(t *testing.T) {
store := Store{}
assert.Equal(t, "1", store.valToString(1))
assert.Equal(t, "1.000000", store.valToString(1.0))
assert.Equal(t, "-20000000000.000000", store.valToString(-2e10))
assert.Equal(t, "0.000000", store.valToString(2e-10))
assert.Equal(t, "12345000000000000583883634749019137936624068583482471750845213260941541453980911162485633595979333632.000000", store.valToString(1.2345e100))
assert.Equal(t, "0.000000", store.valToString(1.2345e-100))
assert.Equal(t, "1.0", store.valToString(1.0))
assert.Equal(t, "1.1", store.valToString(1.10))
assert.Equal(t, "1.23", store.valToString(1.23))
assert.Equal(t, "1.2345678901234567", store.valToString(1.234567890123456789))
assert.Equal(t, "200000.0", store.valToString(2E5))
assert.Equal(t, "-2E+10", store.valToString(-2E10))
assert.Equal(t, "2E-10", store.valToString(2E-10))
assert.Equal(t, "1.2345E+100", store.valToString(1.2345E100))
assert.Equal(t, "1.2345E-100", store.valToString(1.2345E-100))
assert.Equal(t, "true", store.valToString(true))
assert.Equal(t, "false", store.valToString(false))
ts, _ := time.Parse(time.RFC3339, "2025-01-02T03:04:05Z")