| /* |
| * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /* |
| * @test |
| * @summary Confirm that the negative multiplier works as expected. |
| * @bug 4833877 |
| */ |
| |
| import java.math.*; |
| import java.text.*; |
| import java.util.*; |
| |
| public class Bug4833877 { |
| |
| static DecimalFormat df; |
| |
| static boolean err = false; |
| |
| public static void main(String[] args) throws Exception { |
| |
| Locale defaultLoc = Locale.getDefault(); |
| Locale.setDefault(Locale.US); |
| |
| /* ================================================================ */ |
| |
| df = new DecimalFormat(); |
| df.setMaximumFractionDigits(50); |
| df.setMultiplier(4); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(252.5252525252525, "1,010.10101010101"); |
| checkParse("-1,010.10101010101", -252.5252525252525); |
| |
| checkFormat(-2222.2222, "-8,888.8888"); |
| checkParse("8888.8888", 2222.2222); |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(1000L, "4,000"); |
| checkParse("-4,000", -1000L); |
| |
| checkFormat(-250L, "-1,000"); |
| checkParse("1000", 250L); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| checkFormat(new BigDecimal("22222.222222222222222222222"), |
| "88,888.888888888888888888888"); |
| checkParse("-88,888.888888888888888888888", |
| new BigDecimal("-22222.222222222222222222222")); |
| |
| checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"), |
| "-4,444,444,444,444,444,444.444444444444444444"); |
| checkParse("4444444444444444444.444444444444444444", |
| new BigDecimal("1111111111111111111.111111111111111111")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("22222222222222222222222222"), |
| "88,888,888,888,888,888,888,888,888"); |
| checkParse("-88,888,888,888,888,888,888,888,888", |
| new BigDecimal("-22222222222222222222222222")); |
| |
| checkFormat(new BigInteger("-1111111111111111111111111"), |
| "-4,444,444,444,444,444,444,444,444"); |
| checkParse("4444444444444444444444444", |
| new BigDecimal("1111111111111111111111111")); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(false); |
| df.setMultiplier(-4); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(252.5252525252525, "-1,010.10101010101"); |
| checkParse("-1,010.10101010101", 252.5252525252525); |
| |
| checkFormat(-2222.2222, "8,888.8888"); |
| checkParse("8888.8888", -2222.2222); |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(1000L, "-4,000"); |
| checkParse("-4,000", 1000L); |
| |
| checkFormat(-250L, "1,000"); |
| checkParse("1000", -250L); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| checkFormat(new BigDecimal("22222.222222222222222222222"), |
| "-88,888.888888888888888888888"); |
| checkParse("-88,888.888888888888888888888", |
| new BigDecimal("22222.222222222222222222222")); |
| |
| checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"), |
| "4,444,444,444,444,444,444.444444444444444444"); |
| checkParse("4444444444444444444.444444444444444444", |
| new BigDecimal("-1111111111111111111.111111111111111111")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("22222222222222222222222222"), |
| "-88,888,888,888,888,888,888,888,888"); |
| checkParse("-88,888,888,888,888,888,888,888,888", |
| new BigDecimal("22222222222222222222222222")); |
| |
| checkFormat(new BigInteger("-1111111111111111111111111"), |
| "4,444,444,444,444,444,444,444,444"); |
| checkParse("4444444444444444444444444", |
| new BigDecimal("-1111111111111111111111111")); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(false); |
| df.setMultiplier(-3); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(3333.3333333, "-9,999.9999999"); |
| checkParse("-10,000.00000000000", 3333.3333333333335);// rounding error |
| |
| df.setParseIntegerOnly(true); |
| checkFormat(-3333.3333333, "9,999.9999999"); |
| checkParse("10,000.00000000000", -3333L); |
| df.setParseIntegerOnly(false); |
| checkFormat(-3333.3333333, "9,999.9999999"); |
| checkParse("10,000.00000000000", -3333.3333333333335);// rounding error |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(3333L, "-9,999"); |
| df.setParseIntegerOnly(true); |
| checkParse("-10,000", 3333L); |
| df.setParseIntegerOnly(false); |
| checkParse("-10000", 3333.3333333333335);// rounding error |
| |
| checkFormat(-3333L, "9,999"); |
| df.setParseIntegerOnly(true); |
| checkParse("10,000", -3333L); |
| df.setParseIntegerOnly(false); |
| checkParse("10000", -3333.3333333333335);// rounding error |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| checkFormat(new BigDecimal("33333.333333333333333333333"), |
| "-99,999.999999999999999999999"); |
| checkParse("-100,000.000000000000000000000", |
| new BigDecimal("33333.333333333333333333333")); |
| |
| checkFormat(new BigDecimal("-33333.333333333333333333333"), |
| "99,999.999999999999999999999"); |
| checkParse("100,000.000000000000000000000", |
| new BigDecimal("-33333.333333333333333333333")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("33333333333333333333333333"), |
| "-99,999,999,999,999,999,999,999,999"); |
| checkParse("-100,000,000,000,000,000,000,000,000", |
| new BigDecimal("33333333333333333333333333")); |
| |
| checkFormat(new BigInteger("-33333333333333333333333333"), |
| "99,999,999,999,999,999,999,999,999"); |
| df.setParseIntegerOnly(true); |
| checkParse("100,000,000,000,000,000,000,000,000.000", |
| new BigDecimal("-33333333333333333333333333")); |
| df.setParseIntegerOnly(false); |
| checkParse("100,000,000,000,000,000,000,000,000.000", |
| new BigDecimal("-33333333333333333333333333.333")); |
| |
| /* ================================================================ */ |
| |
| df = new DecimalFormat("0.#E0;-0.#E0"); |
| df.setMaximumFractionDigits(50); |
| df.setMultiplier(4); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(252.5252525252525, "1.01010101010101E3"); |
| checkParse("-1.01010101010101E3", -2.525252525252525E2); |
| |
| checkFormat(-2222.2222, "-8.8888888E3"); |
| checkParse("8888.8888", 2.2222222E3); |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(1000L, "4E3"); |
| checkParse("-4E3", -1000L); |
| |
| checkFormat(-250L, "-1E3"); |
| checkParse("1000", 250L); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| |
| checkFormat(new BigDecimal("22222.222222222222222222222"), |
| "8.8888888888888888888888888E4"); |
| checkParse("-8.8888888888888888888888888E4", |
| new BigDecimal("-2.2222222222222222222222222E4")); |
| |
| checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"), |
| "-4.444444444444444444444444444444444444E18"); |
| checkParse("4444444444444444444.444444444444444444", |
| new BigDecimal("1111111111111111111.111111111111111111")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("22222222222222222222222222"), |
| "8.8888888888888888888888888E25"); |
| checkParse("-8.8888888888888888888888888E25", |
| new BigDecimal("-22222222222222222222222222")); |
| |
| checkFormat(new BigInteger("-1111111111111111111111111"), |
| "-4.444444444444444444444444E24"); |
| checkParse("4444444444444444444444444", |
| new BigDecimal("1111111111111111111111111")); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(false); |
| df.setMultiplier(-4); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(252.5252525252525, "-1.01010101010101E3"); |
| checkParse("-1.01010101010101E3", 2.525252525252525E2); |
| |
| checkFormat(-2222.2222, "8.8888888E3"); |
| checkParse("8888.8888", -2.2222222E3); |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(1000L, "-4E3"); |
| checkParse("-4E3", 1000L); |
| |
| checkFormat(-250L, "1E3"); |
| checkParse("1000", -250L); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| |
| checkFormat(new BigDecimal("22222.222222222222222222222"), |
| "-8.8888888888888888888888888E4"); |
| checkParse("-8.8888888888888888888888888E4", |
| new BigDecimal("2.2222222222222222222222222E4")); |
| |
| checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"), |
| "4.444444444444444444444444444444444444E18"); |
| checkParse("4444444444444444444.444444444444444444", |
| new BigDecimal("-1111111111111111111.111111111111111111")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("22222222222222222222222222"), |
| "-8.8888888888888888888888888E25"); |
| checkParse("-8.8888888888888888888888888E25", |
| new BigDecimal("22222222222222222222222222")); |
| |
| checkFormat(new BigInteger("-1111111111111111111111111"), |
| "4.444444444444444444444444E24"); |
| checkParse("4444444444444444444444444", |
| new BigDecimal("-1111111111111111111111111")); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(false); |
| df.setMultiplier(-3); |
| |
| /* |
| * Test for double/Double |
| */ |
| checkFormat(3333.3333333, "-9.9999999999E3"); |
| checkParse("-1.00000000000000E3", 3.33333333333333333E2); |
| |
| df.setParseIntegerOnly(true); |
| checkFormat(-3333.3333333, "9.9999999999E3"); |
| checkParse("10.00000000000000E3",-3L); |
| df.setParseIntegerOnly(false); |
| checkFormat(-3333.3333333, "9.9999999999E3"); |
| checkParse("10.00000000000000E3", -3.33333333333333333E3); |
| |
| /* |
| * Test for long/Long |
| */ |
| checkFormat(3333L, "-9.999E3"); |
| df.setParseIntegerOnly(true); |
| checkParse("-1.0E4", 0L); |
| df.setParseIntegerOnly(false); |
| checkParse("-1.0E4", 3333.3333333333335); |
| |
| checkFormat(-3333L, "9.999E3"); |
| df.setParseIntegerOnly(true); |
| checkParse("10.0E4", -3L); |
| df.setParseIntegerOnly(false); |
| checkParse("10.0E4", -33333.3333333333336); |
| |
| /* ---------------------------------------------------------------- */ |
| |
| df.setParseBigDecimal(true); |
| |
| /* |
| * Test for BigDecimal |
| */ |
| |
| checkFormat(new BigDecimal("333.333333333333333333333333"), |
| "-9.99999999999999999999999999E2"); |
| checkParse("-1.0000000000000000000000000E3", |
| new BigDecimal("3.333333333333333333333333E2")); |
| |
| df.setParseIntegerOnly(true); |
| checkFormat(new BigDecimal("-333.333333333333333333333333"), |
| "9.99999999999999999999999999E2"); |
| checkParse("10.0000000000000000000000000E3", |
| new BigDecimal("-3")); |
| df.setParseIntegerOnly(false); |
| checkFormat(new BigDecimal("-333.333333333333333333333333"), |
| "9.99999999999999999999999999E2"); |
| checkParse("1.0000000000000000000000000E3", |
| new BigDecimal("-3.333333333333333333333333E2")); |
| |
| /* |
| * Test for BigInteger |
| */ |
| checkFormat(new BigInteger("33333333333333333333333333"), |
| "-9.9999999999999999999999999E25"); |
| checkParse("-100000000000000000000000000", |
| new BigDecimal("33333333333333333333333333")); |
| |
| checkFormat(new BigInteger("-33333333333333333333333333"), |
| "9.9999999999999999999999999E25"); |
| df.setParseIntegerOnly(true); |
| checkParse("100000000000000000000000000000", |
| new BigDecimal("-33333333333333333333333333333")); |
| df.setParseIntegerOnly(false); |
| checkParse("100000000000000000000000000.000", |
| new BigDecimal("-33333333333333333333333333.333")); |
| |
| /* ================================================================ */ |
| |
| Locale.setDefault(defaultLoc); |
| |
| if (err) { |
| throw new RuntimeException("Wrong format/parse with DecimalFormat"); |
| } |
| } |
| |
| static void checkFormat(Number num, String expected) { |
| String got = df.format(num); |
| if (!got.equals(expected)) { |
| err = true; |
| System.err.println(" DecimalFormat format(" + |
| num.getClass().getName() + |
| ") error:" + |
| "\n\tnumber: " + num + |
| "\n\tpattern: " + df.toPattern() + |
| "\n\tmultiplier: " + df.getMultiplier() + |
| "\n\tgot: " + got + |
| "\n\texpected: " + expected); |
| } |
| } |
| |
| static void checkParse(String text, Double expected) { |
| Double got = (Double)df.parse(text, new ParsePosition(0)); |
| if (!got.equals(expected)) { |
| err = true; |
| System.err.println(" DecimalFormat parse(double) error:" + |
| "\n\ttext: " + text + |
| "\n\tpattern: " + df.toPattern() + |
| "\n\tmultiplier: " + df.getMultiplier() + |
| "\n\tgot: " + got + |
| "\n\texpected: " + expected); |
| } |
| } |
| |
| static void checkParse(String text, Long expected) { |
| Long got = (Long)df.parse(text, new ParsePosition(0)); |
| if (!got.equals(expected)) { |
| err = true; |
| System.err.println(" DecimalFormat parse(long) error:" + |
| "\n\ttext: " + text + |
| "\n\tpattern: " + df.toPattern() + |
| "\n\tmultiplier: " + df.getMultiplier() + |
| "\n\tgot: " + got + |
| "\n\texpected: " + expected); |
| } |
| } |
| |
| static void checkParse(String text, BigDecimal expected) { |
| BigDecimal got = (BigDecimal)df.parse(text, new ParsePosition(0)); |
| if (!got.equals(expected)) { |
| err = true; |
| System.err.println(" DecimalFormat parse(BigDecimal) error:" + |
| "\n\ttext: " + text + |
| "\n\tpattern: " + df.toPattern() + |
| "\n\tmultiplier: " + df.getMultiplier() + |
| "\n\tgot: " + got + |
| "\n\texpected: " + expected); |
| } |
| } |
| } |