From ca6628b22eb629ce0907e61a83b72e9d7e3cbbc2 Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 07:50:11 +0800 Subject: [PATCH 01/14] fixes #36562 --- src/fmt/format.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fmt/format.go b/src/fmt/format.go index 74e600cab26201..7ad727e15c5527 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -541,6 +541,9 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true + if f.sharp && num[i-1] == '0' { + digits++ + } case 'p', 'P': tail = append(tail, num[i:]...) num = num[:i] From eb8c95519ae4e14fa490bebd774f20b52bd677cb Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 08:26:51 +0800 Subject: [PATCH 02/14] add tests for checking float with #(sharp) flag --- src/fmt/fmt_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index bbaf40a6199cb7..256b8e5a805f78 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -463,6 +463,9 @@ var fmtTests = []struct { {"%#.4x", 1.0, "0x1.0000p+00"}, {"%#.4g", 1.0, "1.000"}, {"%#.4g", 100000.0, "1.000e+05"}, + {"%#.4g", 1.23, "1.230"}, + {"%#.4g", 0.123, "0.1230"}, + {"%#.4g", 0.12, "0.1200"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, From eaf2097df77ee3178dfc6cc861f1a4667c2e28b5 Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 08:46:15 +0800 Subject: [PATCH 03/14] add tests for checking float with #(sharp) flag --- src/fmt/fmt_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 256b8e5a805f78..64dcad08c654c6 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -463,8 +463,11 @@ var fmtTests = []struct { {"%#.4x", 1.0, "0x1.0000p+00"}, {"%#.4g", 1.0, "1.000"}, {"%#.4g", 100000.0, "1.000e+05"}, + {"%#.4g", 1.234, "1.234"}, + {"%#.4g", 0.1234, "0.1234"}, {"%#.4g", 1.23, "1.230"}, {"%#.4g", 0.123, "0.1230"}, + {"%#.4g", 1.2, "1.200"}, {"%#.4g", 0.12, "0.1200"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, From 586da2cc10aca6ab1d1aa79365d862fca47dcd4e Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 09:17:12 +0800 Subject: [PATCH 04/14] fix #36562 --- src/fmt/fmt_test.go | 1 + src/fmt/format.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 64dcad08c654c6..6b0d0d83ee97da 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -469,6 +469,7 @@ var fmtTests = []struct { {"%#.4g", 0.123, "0.1230"}, {"%#.4g", 1.2, "1.200"}, {"%#.4g", 0.12, "0.1200"}, + {"%#.4g", 10.2, "10.20"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, diff --git a/src/fmt/format.go b/src/fmt/format.go index 7ad727e15c5527..ec587e37ea10aa 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -541,7 +541,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true - if f.sharp && num[i-1] == '0' { + if f.sharp && num[i-1] == '0' && + (num[i-2] < '0' || num[i-2] > '9') { digits++ } case 'p', 'P': From 6ca317c026f5d6563a2deb6d200ea005b4da195b Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 12:34:15 +0800 Subject: [PATCH 05/14] add comments and fix bug when output 0 --- src/fmt/format.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index ec587e37ea10aa..618d32895f286d 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -541,8 +541,10 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true + // Increase digits with sharp flag + //because it's reduced once more at '0' when the input is 0.xxx if f.sharp && num[i-1] == '0' && - (num[i-2] < '0' || num[i-2] > '9') { + (num[i-2] < '0' || '9' < num[i-2]) { digits++ } case 'p', 'P': @@ -560,6 +562,10 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } } if !hasDecimalPoint { + // Output 0 with sharp flag + if f.sharp && num[1] == '0' && len(num) == 2 { + digits++ + } num = append(num, '.') } for digits > 0 { From c1770077c50e3e32d349c8f15957dd6a96c911e9 Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 16 Jan 2020 20:28:09 +0800 Subject: [PATCH 06/14] add test for float 0.0 with #(sharp) flag --- src/fmt/fmt_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 6b0d0d83ee97da..6242c2b13a087e 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -470,6 +470,7 @@ var fmtTests = []struct { {"%#.4g", 1.2, "1.200"}, {"%#.4g", 0.12, "0.1200"}, {"%#.4g", 10.2, "10.20"}, + {"%#.4g", 0.0, "0.0000"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, From 8750f644f29ee619c3d074711a8149cb1e51191d Mon Sep 17 00:00:00 2001 From: yah01 Date: Fri, 17 Jan 2020 12:28:02 +0800 Subject: [PATCH 07/14] updates comments and remove excess codes --- src/fmt/format.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index 618d32895f286d..39916540d6c5cf 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -541,9 +541,9 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true - // Increase digits with sharp flag - //because it's reduced once more at '0' when the input is 0.xxx - if f.sharp && num[i-1] == '0' && + // The sharp flag keeps trailing zeros, but a leading 0 (0.xxx) + // should not contribute to the zero count. + if num[i-1] == '0' && (num[i-2] < '0' || '9' < num[i-2]) { digits++ } @@ -562,8 +562,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } } if !hasDecimalPoint { - // Output 0 with sharp flag - if f.sharp && num[1] == '0' && len(num) == 2 { + // See comment for '.' above. + if num[1] == '0' && len(num) == 2 { digits++ } num = append(num, '.') From b3d213304dfb2a09275eba4164f2d26d45b629cf Mon Sep 17 00:00:00 2001 From: yah01 Date: Fri, 17 Jan 2020 15:16:31 +0800 Subject: [PATCH 08/14] merge two lines into one --- src/fmt/format.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index 39916540d6c5cf..c007fb10db672f 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -543,8 +543,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { hasDecimalPoint = true // The sharp flag keeps trailing zeros, but a leading 0 (0.xxx) // should not contribute to the zero count. - if num[i-1] == '0' && - (num[i-2] < '0' || '9' < num[i-2]) { + if num[i-1] == '0' && (num[i-2] < '0' || '9' < num[i-2]) { digits++ } case 'p', 'P': From 67684290c25563ca1183b4eb001e1c20cd18e499 Mon Sep 17 00:00:00 2001 From: yah01 Date: Sat, 18 Jan 2020 10:42:10 +0800 Subject: [PATCH 09/14] fix #36562 --- src/fmt/fmt_test.go | 1 + src/fmt/format.go | 18 ++++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 6242c2b13a087e..1d166022f86ea6 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -471,6 +471,7 @@ var fmtTests = []struct { {"%#.4g", 0.12, "0.1200"}, {"%#.4g", 10.2, "10.20"}, {"%#.4g", 0.0, "0.0000"}, + {"%#.4g",0.012,"0.01200"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, diff --git a/src/fmt/format.go b/src/fmt/format.go index c007fb10db672f..dad76dc64acae7 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -536,16 +536,12 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { tail := tailBuf[:0] hasDecimalPoint := false + meetNonzeroDigit := false // Starting from i = 1 to skip sign at num[0]. for i := 1; i < len(num); i++ { switch num[i] { case '.': hasDecimalPoint = true - // The sharp flag keeps trailing zeros, but a leading 0 (0.xxx) - // should not contribute to the zero count. - if num[i-1] == '0' && (num[i-2] < '0' || '9' < num[i-2]) { - digits++ - } case 'p', 'P': tail = append(tail, num[i:]...) num = num[:i] @@ -557,14 +553,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } fallthrough default: - digits-- + if num[i] != '0' { + meetNonzeroDigit = true + } + // Count significant digits after meeting first non-zero digit + if meetNonzeroDigit { + digits-- + } } } if !hasDecimalPoint { - // See comment for '.' above. - if num[1] == '0' && len(num) == 2 { - digits++ - } num = append(num, '.') } for digits > 0 { From 6e1f2b69a76a664359bb55310cb1a35d91e5a1ee Mon Sep 17 00:00:00 2001 From: yah01 Date: Sat, 18 Jan 2020 17:05:16 +0800 Subject: [PATCH 10/14] fixes #36562 --- src/fmt/fmt_test.go | 4 ++-- src/fmt/format.go | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 1d166022f86ea6..ffd4a9aaa3cd0e 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -470,8 +470,8 @@ var fmtTests = []struct { {"%#.4g", 1.2, "1.200"}, {"%#.4g", 0.12, "0.1200"}, {"%#.4g", 10.2, "10.20"}, - {"%#.4g", 0.0, "0.0000"}, - {"%#.4g",0.012,"0.01200"}, + {"%#.4g", 0.0, "0.000"}, + {"%#.4g", 0.012, "0.01200"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, diff --git a/src/fmt/format.go b/src/fmt/format.go index dad76dc64acae7..a55d510ea098e0 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -563,6 +563,10 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } } if !hasDecimalPoint { + // 0 should contribute once to digits + if num[1] == '0' && len(num) == 2 { + digits-- + } num = append(num, '.') } for digits > 0 { From 534b9f203be2cfc924f75669c06c69f79b76c993 Mon Sep 17 00:00:00 2001 From: yah01 Date: Wed, 22 Jan 2020 23:47:12 +0800 Subject: [PATCH 11/14] Update format.go --- src/fmt/format.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index a55d510ea098e0..b23ee503997b7e 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -536,7 +536,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { tail := tailBuf[:0] hasDecimalPoint := false - meetNonzeroDigit := false + sawNonzeroDigit := false // Starting from i = 1 to skip sign at num[0]. for i := 1; i < len(num); i++ { switch num[i] { @@ -554,16 +554,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { fallthrough default: if num[i] != '0' { - meetNonzeroDigit = true + sawNonzeroDigit = true } - // Count significant digits after meeting first non-zero digit - if meetNonzeroDigit { + // Count significant digits after saw the first non-zero digit. + if sawNonzeroDigit { digits-- } } } if !hasDecimalPoint { - // 0 should contribute once to digits + // decimal 0 should contribute once to digits. if num[1] == '0' && len(num) == 2 { digits-- } From e97dab8890aeb4f574ccb29bf0608214ec783ebc Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 23 Jan 2020 00:04:35 +0800 Subject: [PATCH 12/14] updates format.go --- src/fmt/format.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index a55d510ea098e0..b23ee503997b7e 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -536,7 +536,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { tail := tailBuf[:0] hasDecimalPoint := false - meetNonzeroDigit := false + sawNonzeroDigit := false // Starting from i = 1 to skip sign at num[0]. for i := 1; i < len(num); i++ { switch num[i] { @@ -554,16 +554,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { fallthrough default: if num[i] != '0' { - meetNonzeroDigit = true + sawNonzeroDigit = true } - // Count significant digits after meeting first non-zero digit - if meetNonzeroDigit { + // Count significant digits after saw the first non-zero digit. + if sawNonzeroDigit { digits-- } } } if !hasDecimalPoint { - // 0 should contribute once to digits + // decimal 0 should contribute once to digits. if num[1] == '0' && len(num) == 2 { digits-- } From 8021bb2912b6be1163f519095c6b07e1d91edac8 Mon Sep 17 00:00:00 2001 From: yah01 Date: Thu, 23 Jan 2020 10:37:56 +0800 Subject: [PATCH 13/14] Update format.go --- src/fmt/format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index b23ee503997b7e..253687d5415c1c 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -564,7 +564,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } if !hasDecimalPoint { // decimal 0 should contribute once to digits. - if num[1] == '0' && len(num) == 2 { + if len(num) == 2 && num[1] == '0' { digits-- } num = append(num, '.') From 405d51b12eb04da8cc3559c92f1546e69a8c1a19 Mon Sep 17 00:00:00 2001 From: yah01 Date: Wed, 26 Feb 2020 16:15:56 +0800 Subject: [PATCH 14/14] updates comments --- src/fmt/format.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fmt/format.go b/src/fmt/format.go index 253687d5415c1c..4d12f82f7dea84 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -556,14 +556,14 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { if num[i] != '0' { sawNonzeroDigit = true } - // Count significant digits after saw the first non-zero digit. + // Count significant digits after the first non-zero digit. if sawNonzeroDigit { digits-- } } } if !hasDecimalPoint { - // decimal 0 should contribute once to digits. + // Leading digit 0 should contribute once to digits. if len(num) == 2 && num[1] == '0' { digits-- }