# HG changeset patch # User sherman # Date 1232684994 28800 # Node ID 23d42a96635e7cdf5c3e18bd510ef7eb1e751546 # Parent dd4ba253de9f92818be51603408c1e94e25e46e6 6476425: (fmt)java.util.Formatter.print() throws IllegalArgumentException on large BigDecima Summary: Correct the wrong calculation of "precision" in certain circumstances. Reviewed-by: darcy, alanb diff -r dd4ba253de9f -r 23d42a96635e jdk/src/share/classes/java/util/Formatter.java --- a/jdk/src/share/classes/java/util/Formatter.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/src/share/classes/java/util/Formatter.java Thu Jan 22 20:29:54 2009 -0800 @@ -39,6 +39,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.math.MathContext; +import java.math.RoundingMode; import java.nio.charset.Charset; import java.text.DateFormatSymbols; import java.text.DecimalFormat; @@ -1252,7 +1253,7 @@ * Double#toString(double)} respectively, then the value will be rounded * using the {@linkplain java.math.BigDecimal#ROUND_HALF_UP round half up * algorithm}. Otherwise, zeros may be appended to reach the precision. - * For a canonical representation of the value,use {@link + * For a canonical representation of the value, use {@link * Float#toString(float)} or {@link Double#toString(double)} as * appropriate. * @@ -3569,15 +3570,23 @@ // Create a new BigDecimal with the desired precision. int prec = (precision == -1 ? 6 : precision); int scale = value.scale(); - int compPrec = value.precision(); - if (scale > prec) - compPrec -= (scale - prec); - MathContext mc = new MathContext(compPrec); - BigDecimal v - = new BigDecimal(value.unscaledValue(), scale, mc); - - BigDecimalLayout bdl - = new BigDecimalLayout(v.unscaledValue(), v.scale(), + + if (scale > prec) { + // more "scale" digits than the requested "precision + int compPrec = value.precision(); + if (compPrec <= scale) { + // case of 0.xxxxxx + value = value.setScale(prec, RoundingMode.HALF_UP); + } else { + compPrec -= (scale - prec); + value = new BigDecimal(value.unscaledValue(), + scale, + new MathContext(compPrec)); + } + } + BigDecimalLayout bdl = new BigDecimalLayout( + value.unscaledValue(), + value.scale(), BigDecimalLayoutForm.DECIMAL_FLOAT); char mant[] = bdl.mantissa(); diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/Basic-X.java --- a/jdk/test/java/util/Formatter/Basic-X.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/Basic-X.java Thu Jan 22 20:29:54 2009 -0800 @@ -1054,6 +1054,52 @@ test("%4.1f", " 1.0", val); test("%4.2f", "0.99", val); test("%4.3f", "0.990", val); + + // #6476425 + val = new BigDecimal("0.00001"); + test("%.0f", "0", val); + test("%.1f", "0.0", val); + test("%.2f", "0.00", val); + test("%.3f", "0.000", val); + test("%.4f", "0.0000", val); + test("%.5f", "0.00001", val); + + val = new BigDecimal("1.00001"); + test("%.0f", "1", val); + test("%.1f", "1.0", val); + test("%.2f", "1.00", val); + test("%.3f", "1.000", val); + test("%.4f", "1.0000", val); + test("%.5f", "1.00001", val); + + val = new BigDecimal("1.23456"); + test("%.0f", "1", val); + test("%.1f", "1.2", val); + test("%.2f", "1.23", val); + test("%.3f", "1.235", val); + test("%.4f", "1.2346", val); + test("%.5f", "1.23456", val); + test("%.6f", "1.234560", val); + + val = new BigDecimal("9.99999"); + test("%.0f", "10", val); + test("%.1f", "10.0", val); + test("%.2f", "10.00", val); + test("%.3f", "10.000", val); + test("%.4f", "10.0000", val); + test("%.5f", "9.99999", val); + test("%.6f", "9.999990", val); + + + val = new BigDecimal("1.99999"); + test("%.0f", "2", val); + test("%.1f", "2.0", val); + test("%.2f", "2.00", val); + test("%.3f", "2.000", val); + test("%.4f", "2.0000", val); + test("%.5f", "1.99999", val); + test("%.6f", "1.999990", val); + #end[BigDecimal] #if[float] diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/Basic.java --- a/jdk/test/java/util/Formatter/Basic.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/Basic.java Thu Jan 22 20:29:54 2009 -0800 @@ -25,7 +25,7 @@ * @summary Unit test for formatter * @bug 4906370 4962433 4973103 4989961 5005818 5031150 4970931 4989491 5002937 * 5005104 5007745 5061412 5055180 5066788 5088703 6317248 6318369 6320122 - * 6344623 6369500 6534606 6282094 6286592 + * 6344623 6369500 6534606 6282094 6286592 6476425 * * @run shell/timeout=240 Basic.sh */ diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicBigDecimal.java --- a/jdk/test/java/util/Formatter/BasicBigDecimal.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicBigDecimal.java Thu Jan 22 20:29:54 2009 -0800 @@ -1055,6 +1055,52 @@ test("%4.2f", "0.99", val); test("%4.3f", "0.990", val); + // #6476425 + val = new BigDecimal("0.00001"); + test("%.0f", "0", val); + test("%.1f", "0.0", val); + test("%.2f", "0.00", val); + test("%.3f", "0.000", val); + test("%.4f", "0.0000", val); + test("%.5f", "0.00001", val); + + val = new BigDecimal("1.00001"); + test("%.0f", "1", val); + test("%.1f", "1.0", val); + test("%.2f", "1.00", val); + test("%.3f", "1.000", val); + test("%.4f", "1.0000", val); + test("%.5f", "1.00001", val); + + val = new BigDecimal("1.23456"); + test("%.0f", "1", val); + test("%.1f", "1.2", val); + test("%.2f", "1.23", val); + test("%.3f", "1.235", val); + test("%.4f", "1.2346", val); + test("%.5f", "1.23456", val); + test("%.6f", "1.234560", val); + + val = new BigDecimal("9.99999"); + test("%.0f", "10", val); + test("%.1f", "10.0", val); + test("%.2f", "10.00", val); + test("%.3f", "10.000", val); + test("%.4f", "10.0000", val); + test("%.5f", "9.99999", val); + test("%.6f", "9.999990", val); + + + val = new BigDecimal("1.99999"); + test("%.0f", "2", val); + test("%.1f", "2.0", val); + test("%.2f", "2.00", val); + test("%.3f", "2.000", val); + test("%.4f", "2.0000", val); + test("%.5f", "1.99999", val); + test("%.6f", "1.999990", val); + + diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicBigInteger.java --- a/jdk/test/java/util/Formatter/BasicBigInteger.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicBigInteger.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicBoolean.java --- a/jdk/test/java/util/Formatter/BasicBoolean.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicBoolean.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicBooleanObject.java --- a/jdk/test/java/util/Formatter/BasicBooleanObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicBooleanObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicByte.java --- a/jdk/test/java/util/Formatter/BasicByte.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicByte.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicByteObject.java --- a/jdk/test/java/util/Formatter/BasicByteObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicByteObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicChar.java --- a/jdk/test/java/util/Formatter/BasicChar.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicChar.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicCharObject.java --- a/jdk/test/java/util/Formatter/BasicCharObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicCharObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicDateTime.java --- a/jdk/test/java/util/Formatter/BasicDateTime.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicDateTime.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicDouble.java --- a/jdk/test/java/util/Formatter/BasicDouble.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicDouble.java Thu Jan 22 20:29:54 2009 -0800 @@ -1074,6 +1074,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %f - float, double, Double, BigDecimal //--------------------------------------------------------------------- diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicDoubleObject.java --- a/jdk/test/java/util/Formatter/BasicDoubleObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicDoubleObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1074,6 +1074,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %f - float, double, Double, BigDecimal //--------------------------------------------------------------------- diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicFloat.java --- a/jdk/test/java/util/Formatter/BasicFloat.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicFloat.java Thu Jan 22 20:29:54 2009 -0800 @@ -1057,6 +1057,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %f - float //--------------------------------------------------------------------- diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicFloatObject.java --- a/jdk/test/java/util/Formatter/BasicFloatObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicFloatObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1090,6 +1090,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %g // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicInt.java --- a/jdk/test/java/util/Formatter/BasicInt.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicInt.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicIntObject.java --- a/jdk/test/java/util/Formatter/BasicIntObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicIntObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicLong.java --- a/jdk/test/java/util/Formatter/BasicLong.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicLong.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicLongObject.java --- a/jdk/test/java/util/Formatter/BasicLongObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicLongObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicShort.java --- a/jdk/test/java/util/Formatter/BasicShort.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicShort.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/BasicShortObject.java --- a/jdk/test/java/util/Formatter/BasicShortObject.java Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/BasicShortObject.java Thu Jan 22 20:29:54 2009 -0800 @@ -1524,6 +1524,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %t // diff -r dd4ba253de9f -r 23d42a96635e jdk/test/java/util/Formatter/genBasic.sh --- a/jdk/test/java/util/Formatter/genBasic.sh Tue Jan 20 16:16:35 2009 -0800 +++ b/jdk/test/java/util/Formatter/genBasic.sh Thu Jan 22 20:29:54 2009 -0800 @@ -23,14 +23,14 @@ # have any questions. # -SPP='sh ../../../../make/java/nio/spp.sh' +javac -d . ../../../../make/tools/src/build/tools/spp/Spp.java gen() { # if [ $3 = "true" ] # then $SPP -K$1 -Dtype=$1 -DType=$2 -KprimBasic$2.java # else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java # fi - $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java + java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java } gen boolean Boolean prim "" "" "" @@ -54,3 +54,5 @@ gen BigDecimal BigDecimal "" fp "" "" gen Calendar DateTime "" "" "" datetime + +rm -rf build