8059175: Zero BigDecimal with negative scale prints leading zeroes in String.format
Correct erroneous appending of zeroes and clean up code logic. Reviewed-by: darcy, psandoz
This commit is contained in:
parent
c491b1ac4e
commit
29fc16ebbe
jdk
src/java.base/share/classes/java/util
test/java/util/Formatter
@ -3727,29 +3727,29 @@ public final class Formatter implements Closeable, Flushable {
|
||||
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 @@ public final class Formatter implements Closeable, Flushable {
|
||||
mant.append(coeff, 1, len);
|
||||
}
|
||||
exp = new StringBuilder();
|
||||
long adjusted = -(long) scale + (len - 1);
|
||||
if (adjusted != 0) {
|
||||
long abs = Math.abs(adjusted);
|
||||
// require sign
|
||||
|
@ -1154,6 +1154,10 @@ public class Basic$Type$ extends Basic {
|
||||
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]
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -1154,6 +1154,11 @@ public class BasicBigDecimal extends Basic {
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user