aboutsummaryrefslogtreecommitdiff
path: root/src/fmt
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2015-05-11 11:13:22 -0700
committerRob Pike <r@golang.org>2015-05-11 18:34:19 +0000
commite3a9a08a0bfd683b7cb3330fedffaeb456261226 (patch)
treee64f8bdb7a704950c177d69597cf7350871134e1 /src/fmt
parente92a7247faee31985680f110ff429df484963487 (diff)
downloadgo-e3a9a08a0bfd683b7cb3330fedffaeb456261226.tar.xz
fmt: allow for space and plus flags when computing widths
Fixes #10770. Fixes #10771. This time maybe for sure? Change-Id: I43d6e5fd6846cf58427fec183832d500a932df59 Reviewed-on: https://go-review.googlesource.com/9896 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/fmt')
-rw-r--r--src/fmt/fmt_test.go5
-rw-r--r--src/fmt/format.go7
2 files changed, 10 insertions, 2 deletions
diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go
index f15a0ba8e8..93121bb3d0 100644
--- a/src/fmt/fmt_test.go
+++ b/src/fmt/fmt_test.go
@@ -557,10 +557,13 @@ var fmtTests = []struct {
{"%0.100f", 1.0, zeroFill("1.", 100, "")},
{"%0.100f", -1.0, zeroFill("-1.", 100, "")},
- // Used to panic: integer function didn't look at f.prec or f.unicode.
+ // Used to panic: integer function didn't look at f.prec or f.unicode or f.width.
{"%#.80x", 42, "0x0000000000000000000000000000000000000000000000000000000000000000000000000000002a"},
{"%.80U", 42, "U+0000000000000000000000000000000000000000000000000000000000000000000000000000002A"},
{"%#.80U", '日', "U+000000000000000000000000000000000000000000000000000000000000000000000000000065E5 '日'"},
+ {"%+.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
+ {"% .65d", 44, " 00000000000000000000000000000000000000000000000000000000000000044"},
+ {"% +.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
// Comparison of padding rules with C printf.
/*
diff --git a/src/fmt/format.go b/src/fmt/format.go
index 099f8a5e00..ba984cf84f 100644
--- a/src/fmt/format.go
+++ b/src/fmt/format.go
@@ -163,7 +163,7 @@ func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
}
var buf []byte = f.intbuf[0:]
- if f.widPresent || f.precPresent {
+ if f.widPresent || f.precPresent || f.plus || f.space {
width := f.wid + f.prec // Only one will be set, both are positive; this provides the maximum.
if base == 16 && f.sharp {
// Also adds "0x".
@@ -177,6 +177,11 @@ func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
width += 1 + 1 + utf8.UTFMax + 1
}
}
+ if f.plus {
+ width++
+ } else if f.space {
+ width++
+ }
if width > nByte {
// We're going to need a bigger boat.
buf = make([]byte, width)