1
0
mirror of https://github.com/golang/go synced 2024-11-22 08:54:39 -07:00

fmt: handle precision 0 format stings in standard way

The C-stdlib heritage of printf/fprintf/sprintf has two odd
aspects for precisions of zero with integers. First, the zero
can be specified in any of these ways, "%4.0d", "%.0d" and
"%.d" which was not previously supported here. Secondly, the
seemingly universal interpretation of precision for integers
is that precision==0 and value==0 means print nothing at all.
The code here now handles this for integers just as the code
in big/int.c does the same for the Int type. New tests are
added to fmt_test.go to verify these changes.

R=r, r
CC=golang-dev
https://golang.org/cl/4717045
This commit is contained in:
Michael T. Jones 2011-07-21 16:46:51 +10:00 committed by Rob Pike
parent 0f7a1951b8
commit 8cdee891d7
3 changed files with 11 additions and 0 deletions

View File

@ -180,6 +180,8 @@ var fmttests = []struct {
{"%+d", 0, "+0"}, {"%+d", 0, "+0"},
{"% d", 0, " 0"}, {"% d", 0, " 0"},
{"% d", 12345, " 12345"}, {"% d", 12345, " 12345"},
{"%.0d", 0, ""},
{"%.d", 0, ""},
// unicode format // unicode format
{"%U", 0x1, "U+0001"}, {"%U", 0x1, "U+0001"},

View File

@ -166,6 +166,11 @@ func (f *fmt) fmt_boolean(v bool) {
// integer; interprets prec but not wid. Once formatted, result is sent to pad() // integer; interprets prec but not wid. Once formatted, result is sent to pad()
// and then flags are cleared. // and then flags are cleared.
func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) { func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
// precision of 0 and value of 0 means "print nothing"
if f.precPresent && f.prec == 0 && a == 0 {
return
}
var buf []byte = f.intbuf[0:] var buf []byte = f.intbuf[0:]
negative := signedness == signed && a < 0 negative := signedness == signed && a < 0
if negative { if negative {

View File

@ -928,6 +928,10 @@ func (p *pp) doPrintf(format string, a []interface{}) {
} }
} else { } else {
p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i+1, end) p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i+1, end)
if !p.fmt.precPresent {
p.fmt.prec = 0
p.fmt.precPresent = true
}
} }
} }
if i >= end { if i >= end {