aboutsummaryrefslogtreecommitdiff
path: root/src/lib/strconv
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-11-23 17:27:44 -0800
committerRuss Cox <rsc@golang.org>2008-11-23 17:27:44 -0800
commit0e198da6342aae5763d081a282bbba51affa7e17 (patch)
treea6aba0f65f9bf37c0371a4c43e94431c59bb20d3 /src/lib/strconv
parenta6182dab47eadcd4f90ee8ef2c99e5e8fef2c89e (diff)
downloadgo-0e198da6342aae5763d081a282bbba51affa7e17.tar.xz
fix %g 20 -> "2e+01" want "20"
R=r DELTA=11 (10 added, 0 deleted, 1 changed) OCL=19885 CL=19887
Diffstat (limited to 'src/lib/strconv')
-rw-r--r--src/lib/strconv/ftoa.go9
-rw-r--r--src/lib/strconv/ftoa_test.go3
2 files changed, 11 insertions, 1 deletions
diff --git a/src/lib/strconv/ftoa.go b/src/lib/strconv/ftoa.go
index 5dd057d494..c1c8af3179 100644
--- a/src/lib/strconv/ftoa.go
+++ b/src/lib/strconv/ftoa.go
@@ -94,7 +94,9 @@ func GenericFtoa(bits uint64, fmt byte, prec int, flt *FloatInfo) string {
// Round appropriately.
// Negative precision means "only as much as needed to be exact."
+ shortest := false;
if prec < 0 {
+ shortest = true;
RoundShortest(d, mant, exp, flt);
switch fmt {
case 'e':
@@ -130,8 +132,13 @@ func GenericFtoa(bits uint64, fmt byte, prec int, flt *FloatInfo) string {
}
// %e is used if the exponent from the conversion
// is less than -4 or greater than or equal to the precision.
+ // if precision was the shortest possible, use precision 6 for this decision.
+ eprec := prec;
+ if shortest {
+ eprec = 6
+ }
exp := d.dp - 1;
- if exp < -4 || exp >= prec {
+ if exp < -4 || exp >= eprec {
return FmtE(neg, d, prec - 1);
}
return FmtF(neg, d, Max(prec - d.dp, 0));
diff --git a/src/lib/strconv/ftoa_test.go b/src/lib/strconv/ftoa_test.go
index a85a1a1160..914ecd9e33 100644
--- a/src/lib/strconv/ftoa_test.go
+++ b/src/lib/strconv/ftoa_test.go
@@ -24,6 +24,9 @@ var ftests = []Test {
Test{ 1, 'f', 5, "1.00000" },
Test{ 1, 'g', 5, "1" },
Test{ 1, 'g', -1, "1" },
+ Test{ 20, 'g', -1, "20" },
+ Test{ 200000, 'g', -1, "200000" },
+ Test{ 2000000, 'g', -1, "2e+06" },
Test{ 0, 'e', 5, "0.00000e+00" },
Test{ 0, 'f', 5, "0.00000" },