mirror of
https://github.com/golang/go
synced 2024-11-21 19:54:41 -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:
parent
0f7a1951b8
commit
8cdee891d7
@ -180,6 +180,8 @@ var fmttests = []struct {
|
||||
{"%+d", 0, "+0"},
|
||||
{"% d", 0, " 0"},
|
||||
{"% d", 12345, " 12345"},
|
||||
{"%.0d", 0, ""},
|
||||
{"%.d", 0, ""},
|
||||
|
||||
// unicode format
|
||||
{"%U", 0x1, "U+0001"},
|
||||
|
@ -166,6 +166,11 @@ func (f *fmt) fmt_boolean(v bool) {
|
||||
// integer; interprets prec but not wid. Once formatted, result is sent to pad()
|
||||
// and then flags are cleared.
|
||||
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:]
|
||||
negative := signedness == signed && a < 0
|
||||
if negative {
|
||||
|
@ -928,6 +928,10 @@ func (p *pp) doPrintf(format string, a []interface{}) {
|
||||
}
|
||||
} else {
|
||||
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 {
|
||||
|
Loading…
Reference in New Issue
Block a user