Skip to content

Commit

Permalink
fmt: allow padding and minus flags at the same time
Browse files Browse the repository at this point in the history
Existing implementation did not allow setting both padding and minus flags at the same time because standard formatting does not allow that. But custom Formatter interface implementations might have use of it. This change moves the check from the place flags are parsed to where they are used in standard formatting.

Fixes #61784

Change-Id: If5909d45dc929ddf911453e1056a4661abe76e52
GitHub-Last-Rev: d99ec55
GitHub-Pull-Request: #61836
Reviewed-on: https://go-review.googlesource.com/c/go/+/516975
Reviewed-by: Rob Pike <[email protected]>
Reviewed-by: Martin Möhrmann <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
Reviewed-by: Michael Knyszek <[email protected]>
Reviewed-by: Martin Möhrmann <[email protected]>
Auto-Submit: Ian Lance Taylor <[email protected]>
  • Loading branch information
mitar authored and gopherbot committed Mar 4, 2024
1 parent 9853da5 commit 6dfd7a5
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 5 deletions.
5 changes: 5 additions & 0 deletions src/fmt/fmt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1501,6 +1501,7 @@ var flagtests = []struct {
{"%-+1.2a", "[%+-1.2a]"},
{"%-+1.2abc", "[%+-1.2a]bc"},
{"%-1.2abc", "[%-1.2a]bc"},
{"%-0abc", "[%-0a]bc"},
}

func TestFlagParser(t *testing.T) {
Expand Down Expand Up @@ -1827,6 +1828,7 @@ var formatterFlagTests = []struct {
{"%-+1.2a", flagPrinter{}, "[%+-1.2a]"},
{"%-+1.2abc", flagPrinter{}, "[%+-1.2a]bc"},
{"%-1.2abc", flagPrinter{}, "[%-1.2a]bc"},
{"%-0abc", flagPrinter{}, "[%-0a]bc"},

// composite values with the 'a' verb
{"%a", [1]flagPrinter{}, "[[%a]]"},
Expand All @@ -1841,6 +1843,7 @@ var formatterFlagTests = []struct {
{"%-+1.2a", [1]flagPrinter{}, "[[%+-1.2a]]"},
{"%-+1.2abc", [1]flagPrinter{}, "[[%+-1.2a]]bc"},
{"%-1.2abc", [1]flagPrinter{}, "[[%-1.2a]]bc"},
{"%-0abc", [1]flagPrinter{}, "[[%-0a]]bc"},

// simple values with the 'v' verb
{"%v", flagPrinter{}, "[%v]"},
Expand All @@ -1855,6 +1858,7 @@ var formatterFlagTests = []struct {
{"%-+1.2v", flagPrinter{}, "[%+-1.2v]"},
{"%-+1.2vbc", flagPrinter{}, "[%+-1.2v]bc"},
{"%-1.2vbc", flagPrinter{}, "[%-1.2v]bc"},
{"%-0vbc", flagPrinter{}, "[%-0v]bc"},

// composite values with the 'v' verb.
{"%v", [1]flagPrinter{}, "[[%v]]"},
Expand All @@ -1869,6 +1873,7 @@ var formatterFlagTests = []struct {
{"%-+1.2v", [1]flagPrinter{}, "[[%+-1.2v]]"},
{"%-+1.2vbc", [1]flagPrinter{}, "[[%+-1.2v]]bc"},
{"%-1.2vbc", [1]flagPrinter{}, "[[%-1.2v]]bc"},
{"%-0vbc", [1]flagPrinter{}, "[[%-0v]]bc"},
}

func TestFormatterFlags(t *testing.T) {
Expand Down
8 changes: 5 additions & 3 deletions src/fmt/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ func (f *fmt) writePadding(n int) {
}
// Decide which byte the padding should be filled with.
padByte := byte(' ')
if f.zero {
// Zero padding is allowed only to the left.
if f.zero && !f.minus {
padByte = byte('0')
}
// Fill padding with padByte.
Expand Down Expand Up @@ -225,7 +226,7 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, verb rune, digits st
f.zero = oldZero
return
}
} else if f.zero && f.widPresent {
} else if f.zero && !f.minus && f.widPresent { // Zero padding is allowed only to the left.
prec = f.wid
if negative || f.plus || f.space {
prec-- // leave room for sign
Expand Down Expand Up @@ -582,7 +583,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
if f.plus || num[0] != '+' {
// If we're zero padding to the left we want the sign before the leading zeros.
// Achieve this by writing the sign out and then padding the unsigned number.
if f.zero && f.widPresent && f.wid > len(num) {
// Zero padding is allowed only to the left.
if f.zero && !f.minus && f.widPresent && f.wid > len(num) {
f.buf.writeByte(num[0])
f.writePadding(f.wid - len(num))
f.buf.write(num[1:])
Expand Down
3 changes: 1 addition & 2 deletions src/fmt/print.go
Original file line number Diff line number Diff line change
Expand Up @@ -1048,12 +1048,11 @@ formatLoop:
case '#':
p.fmt.sharp = true
case '0':
p.fmt.zero = !p.fmt.minus // Only allow zero padding to the left.
p.fmt.zero = true
case '+':
p.fmt.plus = true
case '-':
p.fmt.minus = true
p.fmt.zero = false // Do not pad with zeros to the right.
case ' ':
p.fmt.space = true
default:
Expand Down

0 comments on commit 6dfd7a5

Please sign in to comment.