1
0
mirror of https://github.com/golang/go synced 2024-11-20 05:54:43 -07:00

fix bug in complex printing: imaginary didn't have same format as real.

add tests.

R=rsc, ken2, ken3
CC=golang-dev
https://golang.org/cl/261041
This commit is contained in:
Rob Pike 2010-03-06 13:38:14 -08:00
parent 788b41751e
commit cba81d8058
3 changed files with 47 additions and 10 deletions

View File

@ -119,6 +119,28 @@ var fmttests = []fmtTest{
fmtTest{"% .3g", -1.0, "-1"},
fmtTest{"% .3g", 1.0, " 1"},
/* TODO: Enable when complex support is in all compilers
// complex values
fmtTest{"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"},
fmtTest{"%+.3f", 0i, "(+0.000+0.000i)"},
fmtTest{"%+.3g", 0i, "(+0+0i)"},
fmtTest{"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"},
fmtTest{"%+.3f", 1 + 2i, "(+1.000+2.000i)"},
fmtTest{"%+.3g", 1 + 2i, "(+1+2i)"},
fmtTest{"%.3e", 0i, "(0.000e+00+0.000e+00i)"},
fmtTest{"%.3f", 0i, "(0.000+0.000i)"},
fmtTest{"%.3g", 0i, "(0+0i)"},
fmtTest{"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"},
fmtTest{"%.3f", 1 + 2i, "(1.000+2.000i)"},
fmtTest{"%.3g", 1 + 2i, "(1+2i)"},
fmtTest{"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"},
fmtTest{"%.3f", -1 - 2i, "(-1.000-2.000i)"},
fmtTest{"%.3g", -1 - 2i, "(-1-2i)"},
fmtTest{"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"},
fmtTest{"%+.3g", complex64(1 + 2i), "(+1+2i)"},
fmtTest{"%+.3g", complex128(1 + 2i), "(+1+2i)"},
*/
// erroneous formats
fmtTest{"", 2, "?(extra int=2)"},
fmtTest{"%d", "hello", "%d(string=hello)"},
@ -210,6 +232,13 @@ var fmttests = []fmtTest{
fmtTest{"%v", &array, "&[1 2 3 4 5]"},
fmtTest{"%v", &iarray, "&[1 hello 2.5 <nil>]"},
/* TODO: Enable when complex support is in all compilers
// complexes with %v
fmtTest{"%v", 1 + 2i, "(1+2i)"},
fmtTest{"%v", complex64(1 + 2i), "(1+2i)"},
fmtTest{"%v", complex128(1 + 2i), "(1+2i)"},
*/
// structs
fmtTest{"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`},
fmtTest{"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`},

View File

@ -43,13 +43,14 @@ type fmt struct {
wid int
prec int
// flags
widPresent bool
precPresent bool
minus bool
plus bool
sharp bool
space bool
zero bool
widPresent bool
precPresent bool
minus bool
plus bool
sharp bool
space bool
zero bool
preserveFlags bool // don't clear flags after this print; used to carry over in complex prints
}
func (f *fmt) clearflags() {
@ -119,7 +120,9 @@ func (f *fmt) pad(b []byte) {
if right > 0 {
f.writePadding(right, padding)
}
f.clearflags()
if !f.preserveFlags {
f.clearflags()
}
}
// append s to buf, padded on left (w > 0) or right (w < 0 or f.minus).
@ -137,7 +140,9 @@ func (f *fmt) padString(s string) {
if right > 0 {
f.writePadding(right, padding)
}
f.clearflags()
if !f.preserveFlags {
f.clearflags()
}
}
func putint(buf []byte, base, val uint64, digits string) int {
@ -425,6 +430,7 @@ func (f *fmt) fmt_fb32(v float32) { f.padString(strconv.Ftoa32(v, 'b', 0)) }
func (f *fmt) fmt_c64(v complex64, fmt_x byte) {
f.buf.WriteByte('(')
r := real(v)
f.preserveFlags = true
for i := 0; ; i++ {
switch fmt_x {
case 'e':
@ -438,6 +444,7 @@ func (f *fmt) fmt_c64(v complex64, fmt_x byte) {
case 'G':
f.fmt_G32(r)
}
f.preserveFlags = false
if i != 0 {
break
}
@ -452,6 +459,7 @@ func (f *fmt) fmt_c64(v complex64, fmt_x byte) {
func (f *fmt) fmt_c128(v complex128, fmt_x byte) {
f.buf.WriteByte('(')
r := real(v)
f.preserveFlags = true
for i := 0; ; i++ {
switch fmt_x {
case 'e':
@ -465,6 +473,7 @@ func (f *fmt) fmt_c128(v complex128, fmt_x byte) {
case 'G':
f.fmt_G64(r)
}
f.preserveFlags = false
if i != 0 {
break
}

View File

@ -927,7 +927,6 @@ func (p *pp) doprintf(format string, a []interface{}) {
p.fmt.fmt_c64(v, 'e')
} else if v, ok := getComplex128(field); ok {
p.fmt.fmt_c128(v, 'e')
} else {
goto badtype
}