changeset 11211:8efdc47cdc0c

8059175: Zero BigDecimal with negative scale prints leading zeroes in String.format Summary: Correct erroneous appending of zeroes and clean up code logic. Reviewed-by: darcy, psandoz
author bpb
date Wed, 07 Jan 2015 14:15:00 -0800
parents 9095c6b4bedd
children bc74cc84c49e
files src/java.base/share/classes/java/util/Formatter.java test/java/util/Formatter/Basic-X.java.template test/java/util/Formatter/Basic.java test/java/util/Formatter/BasicBigDecimal.java
diffstat 4 files changed, 23 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.base/share/classes/java/util/Formatter.java	Wed Jan 07 09:32:41 2015 -0800
+++ b/src/java.base/share/classes/java/util/Formatter.java	Wed Jan 07 14:15:00 2015 -0800
@@ -3727,29 +3727,29 @@
                             exp = new StringBuilder("+00");
                         }
                     }
-                    return;
-                }
-                long adjusted = -(long) scale + (len - 1);
-                if (form == BigDecimalLayoutForm.DECIMAL_FLOAT) {
+                } else if (form == BigDecimalLayoutForm.DECIMAL_FLOAT) {
                     // count of padding zeros
-                    int pad = scale - len;
-                    if (pad >= 0) {
+
+                    if (scale >= len) {
                         // 0.xxx form
                         mant.append("0.");
                         dot = true;
-                        trailingZeros(mant, pad);
+                        trailingZeros(mant, scale - len);
                         mant.append(coeff);
                     } else {
-                        if (-pad < len) {
+                        if (scale > 0) {
                             // xx.xx form
-                            mant.append(coeff, 0, -pad);
+                            int pad = len - scale;
+                            mant.append(coeff, 0, pad);
                             mant.append('.');
                             dot = true;
-                            mant.append(coeff, -pad, -pad + scale);
-                        } else {
+                            mant.append(coeff, pad, len);
+                        } else { // scale < 0
                             // xx form
                             mant.append(coeff, 0, len);
-                            trailingZeros(mant, -scale);
+                            if (intVal.signum() != 0) {
+                                trailingZeros(mant, -scale);
+                            }
                             this.scale = 0;
                         }
                     }
@@ -3762,6 +3762,7 @@
                         mant.append(coeff, 1, len);
                     }
                     exp = new StringBuilder();
+                    long adjusted = -(long) scale + (len - 1);
                     if (adjusted != 0) {
                         long abs = Math.abs(adjusted);
                         // require sign
--- a/test/java/util/Formatter/Basic-X.java.template	Wed Jan 07 09:32:41 2015 -0800
+++ b/test/java/util/Formatter/Basic-X.java.template	Wed Jan 07 14:15:00 2015 -0800
@@ -1154,6 +1154,10 @@
         test("%.5f", "0.99960", val);
         test("%.6f", "0.999600", val);
 
+        val = new BigDecimal(BigInteger.ZERO, 6);
+        test("%.4f", "0.0000", val);
+        val = new BigDecimal(BigInteger.ZERO, -6);
+        test("%.4f", "0.0000", val);
 #end[BigDecimal]
 
 #if[float]
--- a/test/java/util/Formatter/Basic.java	Wed Jan 07 09:32:41 2015 -0800
+++ b/test/java/util/Formatter/Basic.java	Wed Jan 07 14:15:00 2015 -0800
@@ -26,6 +26,7 @@
  * @bug 4906370 4962433 4973103 4989961 5005818 5031150 4970931 4989491 5002937
  *      5005104 5007745 5061412 5055180 5066788 5088703 6317248 6318369 6320122
  *      6344623 6369500 6534606 6282094 6286592 6476425 5063507 6469160 6476168
+ *      8059175
  *
  * @run shell/timeout=240 Basic.sh
  */
--- a/test/java/util/Formatter/BasicBigDecimal.java	Wed Jan 07 09:32:41 2015 -0800
+++ b/test/java/util/Formatter/BasicBigDecimal.java	Wed Jan 07 14:15:00 2015 -0800
@@ -1154,6 +1154,11 @@
         test("%.5f", "0.99960", val);
         test("%.6f", "0.999600", val);
 
+        val = new BigDecimal(BigInteger.ZERO, 6);
+        test("%.4f", "0.0000", val);
+
+        val = new BigDecimal(BigInteger.ZERO, -6);
+        test("%.4f", "0.0000", val);