1 /*
   2  * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @summary Confirm that the negative multiplier works as expected.
  27  * @bug 4833877
  28  */
  29 
  30 import java.math.*;
  31 import java.text.*;
  32 import java.util.*;
  33 
  34 public class Bug4833877 {
  35 
  36     static DecimalFormat df;
  37 
  38     static boolean err = false;
  39 
  40     public static void main(String[] args) throws Exception {
  41 
  42         Locale defaultLoc = Locale.getDefault();
  43         Locale.setDefault(Locale.US);
  44 
  45         /* ================================================================ */
  46 
  47         df = new DecimalFormat();
  48         df.setMaximumFractionDigits(50);
  49         df.setMultiplier(4);
  50 
  51         /*
  52          * Test for double/Double
  53          */
  54         checkFormat(new Double(252.5252525252525), "1,010.10101010101");
  55         checkParse("-1,010.10101010101", new Double(-252.5252525252525));
  56 
  57         checkFormat(new Double(-2222.2222), "-8,888.8888");
  58         checkParse("8888.8888", new Double(2222.2222));
  59 
  60         /*
  61          * Test for long/Long
  62          */
  63         checkFormat(new Long(1000), "4,000");
  64         checkParse("-4,000", new Long(-1000));
  65 
  66         checkFormat(new Long(-250), "-1,000");
  67         checkParse("1000", new Long(250));
  68 
  69         /* ---------------------------------------------------------------- */
  70 
  71         df.setParseBigDecimal(true);
  72 
  73         /*
  74          * Test for BigDecimal
  75          */
  76         checkFormat(new BigDecimal("22222.222222222222222222222"),
  77                     "88,888.888888888888888888888");
  78         checkParse("-88,888.888888888888888888888",
  79                     new BigDecimal("-22222.222222222222222222222"));
  80 
  81         checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"),
  82                     "-4,444,444,444,444,444,444.444444444444444444");
  83         checkParse("4444444444444444444.444444444444444444",
  84                     new BigDecimal("1111111111111111111.111111111111111111"));
  85 
  86         /*
  87          * Test for BigInteger
  88          */
  89         checkFormat(new BigInteger("22222222222222222222222222"),
  90                     "88,888,888,888,888,888,888,888,888");
  91         checkParse("-88,888,888,888,888,888,888,888,888",
  92                     new BigDecimal("-22222222222222222222222222"));
  93 
  94         checkFormat(new BigInteger("-1111111111111111111111111"),
  95                     "-4,444,444,444,444,444,444,444,444");
  96         checkParse("4444444444444444444444444",
  97                     new BigDecimal("1111111111111111111111111"));
  98 
  99         /* ---------------------------------------------------------------- */
 100 
 101         df.setParseBigDecimal(false);
 102         df.setMultiplier(-4);
 103 
 104         /*
 105          * Test for double/Double
 106          */
 107         checkFormat(new Double(252.5252525252525), "-1,010.10101010101");
 108         checkParse("-1,010.10101010101", new Double(252.5252525252525));
 109 
 110         checkFormat(new Double(-2222.2222), "8,888.8888");
 111         checkParse("8888.8888", new Double(-2222.2222));
 112 
 113         /*
 114          * Test for long/Long
 115          */
 116         checkFormat(new Long(1000), "-4,000");
 117         checkParse("-4,000", new Long(1000));
 118 
 119         checkFormat(new Long(-250), "1,000");
 120         checkParse("1000", new Long(-250));
 121 
 122         /* ---------------------------------------------------------------- */
 123 
 124         df.setParseBigDecimal(true);
 125 
 126         /*
 127          * Test for BigDecimal
 128          */
 129         checkFormat(new BigDecimal("22222.222222222222222222222"),
 130                     "-88,888.888888888888888888888");
 131         checkParse("-88,888.888888888888888888888",
 132                     new BigDecimal("22222.222222222222222222222"));
 133 
 134         checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"),
 135                    "4,444,444,444,444,444,444.444444444444444444");
 136         checkParse("4444444444444444444.444444444444444444",
 137                     new BigDecimal("-1111111111111111111.111111111111111111"));
 138 
 139         /*
 140          * Test for BigInteger
 141          */
 142         checkFormat(new BigInteger("22222222222222222222222222"),
 143                     "-88,888,888,888,888,888,888,888,888");
 144         checkParse("-88,888,888,888,888,888,888,888,888",
 145                     new BigDecimal("22222222222222222222222222"));
 146 
 147         checkFormat(new BigInteger("-1111111111111111111111111"),
 148                    "4,444,444,444,444,444,444,444,444");
 149         checkParse("4444444444444444444444444",
 150                     new BigDecimal("-1111111111111111111111111"));
 151 
 152         /* ---------------------------------------------------------------- */
 153 
 154         df.setParseBigDecimal(false);
 155         df.setMultiplier(-3);
 156 
 157         /*
 158          * Test for double/Double
 159          */
 160         checkFormat(new Double(3333.3333333), "-9,999.9999999");
 161         checkParse("-10,000.00000000000", new Double(3333.3333333333335));// rounding error
 162 
 163         df.setParseIntegerOnly(true);
 164         checkFormat(new Double(-3333.3333333), "9,999.9999999");
 165         checkParse("10,000.00000000000", new Long(-3333));
 166         df.setParseIntegerOnly(false);
 167         checkFormat(new Double(-3333.3333333), "9,999.9999999");
 168         checkParse("10,000.00000000000", new Double(-3333.3333333333335));// rounding error
 169 
 170         /*
 171          * Test for long/Long
 172          */
 173         checkFormat(new Long(3333), "-9,999");
 174         df.setParseIntegerOnly(true);
 175         checkParse("-10,000", new Long(3333));
 176         df.setParseIntegerOnly(false);
 177         checkParse("-10000", new Double(3333.3333333333335));// rounding error
 178 
 179         checkFormat(new Long(-3333), "9,999");
 180         df.setParseIntegerOnly(true);
 181         checkParse("10,000", new Long(-3333));
 182         df.setParseIntegerOnly(false);
 183         checkParse("10000", new Double(-3333.3333333333335));// rounding error
 184 
 185         /* ---------------------------------------------------------------- */
 186 
 187         df.setParseBigDecimal(true);
 188 
 189         /*
 190          * Test for BigDecimal
 191          */
 192         checkFormat(new BigDecimal("33333.333333333333333333333"),
 193                     "-99,999.999999999999999999999");
 194         checkParse("-100,000.000000000000000000000",
 195                     new BigDecimal("33333.333333333333333333333"));
 196 
 197         checkFormat(new BigDecimal("-33333.333333333333333333333"),
 198                     "99,999.999999999999999999999");
 199         checkParse("100,000.000000000000000000000",
 200                     new BigDecimal("-33333.333333333333333333333"));
 201 
 202         /*
 203          * Test for BigInteger
 204          */
 205         checkFormat(new BigInteger("33333333333333333333333333"),
 206                     "-99,999,999,999,999,999,999,999,999");
 207         checkParse("-100,000,000,000,000,000,000,000,000",
 208                     new BigDecimal("33333333333333333333333333"));
 209 
 210         checkFormat(new BigInteger("-33333333333333333333333333"),
 211                     "99,999,999,999,999,999,999,999,999");
 212         df.setParseIntegerOnly(true);
 213         checkParse("100,000,000,000,000,000,000,000,000.000",
 214                     new BigDecimal("-33333333333333333333333333"));
 215         df.setParseIntegerOnly(false);
 216         checkParse("100,000,000,000,000,000,000,000,000.000",
 217                     new BigDecimal("-33333333333333333333333333.333"));
 218 
 219         /* ================================================================ */
 220 
 221         df = new DecimalFormat("0.#E0;-0.#E0");
 222         df.setMaximumFractionDigits(50);
 223         df.setMultiplier(4);
 224 
 225         /*
 226          * Test for double/Double
 227          */
 228         checkFormat(new Double(252.5252525252525), "1.01010101010101E3");
 229         checkParse("-1.01010101010101E3", new Double(-2.525252525252525E2));
 230 
 231         checkFormat(new Double(-2222.2222), "-8.8888888E3");
 232         checkParse("8888.8888", new Double(2.2222222E3));
 233 
 234         /*
 235          * Test for long/Long
 236          */
 237         checkFormat(new Long(1000), "4E3");
 238         checkParse("-4E3", new Long(-1000));
 239 
 240         checkFormat(new Long(-250), "-1E3");
 241         checkParse("1000", new Long(250));
 242 
 243         /* ---------------------------------------------------------------- */
 244 
 245         df.setParseBigDecimal(true);
 246 
 247         /*
 248          * Test for BigDecimal
 249          */
 250 
 251         checkFormat(new BigDecimal("22222.222222222222222222222"),
 252                     "8.8888888888888888888888888E4");
 253         checkParse("-8.8888888888888888888888888E4",
 254                     new BigDecimal("-2.2222222222222222222222222E4"));
 255 
 256         checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"),
 257                     "-4.444444444444444444444444444444444444E18");
 258         checkParse("4444444444444444444.444444444444444444",
 259                     new BigDecimal("1111111111111111111.111111111111111111"));
 260 
 261         /*
 262          * Test for BigInteger
 263          */
 264         checkFormat(new BigInteger("22222222222222222222222222"),
 265                     "8.8888888888888888888888888E25");
 266         checkParse("-8.8888888888888888888888888E25",
 267                     new BigDecimal("-22222222222222222222222222"));
 268 
 269         checkFormat(new BigInteger("-1111111111111111111111111"),
 270                     "-4.444444444444444444444444E24");
 271         checkParse("4444444444444444444444444",
 272                     new BigDecimal("1111111111111111111111111"));
 273 
 274         /* ---------------------------------------------------------------- */
 275 
 276         df.setParseBigDecimal(false);
 277         df.setMultiplier(-4);
 278 
 279         /*
 280          * Test for double/Double
 281          */
 282         checkFormat(new Double(252.5252525252525), "-1.01010101010101E3");
 283         checkParse("-1.01010101010101E3", new Double(2.525252525252525E2));
 284 
 285         checkFormat(new Double(-2222.2222), "8.8888888E3");
 286         checkParse("8888.8888", new Double(-2.2222222E3));
 287 
 288         /*
 289          * Test for long/Long
 290          */
 291         checkFormat(new Long(1000), "-4E3");
 292         checkParse("-4E3", new Long(1000));
 293 
 294         checkFormat(new Long(-250), "1E3");
 295         checkParse("1000", new Long(-250));
 296 
 297         /* ---------------------------------------------------------------- */
 298 
 299         df.setParseBigDecimal(true);
 300 
 301         /*
 302          * Test for BigDecimal
 303          */
 304 
 305         checkFormat(new BigDecimal("22222.222222222222222222222"),
 306                    "-8.8888888888888888888888888E4");
 307         checkParse("-8.8888888888888888888888888E4",
 308                     new BigDecimal("2.2222222222222222222222222E4"));
 309 
 310         checkFormat(new BigDecimal("-1111111111111111111.111111111111111111"),
 311                     "4.444444444444444444444444444444444444E18");
 312         checkParse("4444444444444444444.444444444444444444",
 313                     new BigDecimal("-1111111111111111111.111111111111111111"));
 314 
 315         /*
 316          * Test for BigInteger
 317          */
 318         checkFormat(new BigInteger("22222222222222222222222222"),
 319                    "-8.8888888888888888888888888E25");
 320         checkParse("-8.8888888888888888888888888E25",
 321                     new BigDecimal("22222222222222222222222222"));
 322 
 323         checkFormat(new BigInteger("-1111111111111111111111111"),
 324                     "4.444444444444444444444444E24");
 325         checkParse("4444444444444444444444444",
 326                    new BigDecimal("-1111111111111111111111111"));
 327 
 328         /* ---------------------------------------------------------------- */
 329 
 330         df.setParseBigDecimal(false);
 331         df.setMultiplier(-3);
 332 
 333         /*
 334          * Test for double/Double
 335          */
 336         checkFormat(new Double(3333.3333333), "-9.9999999999E3");
 337         checkParse("-1.00000000000000E3", new Double(3.33333333333333333E2));
 338 
 339         df.setParseIntegerOnly(true);
 340         checkFormat(new Double(-3333.3333333), "9.9999999999E3");
 341         checkParse("10.00000000000000E3", new Long(-3));
 342         df.setParseIntegerOnly(false);
 343         checkFormat(new Double(-3333.3333333), "9.9999999999E3");
 344         checkParse("10.00000000000000E3", new Double(-3.33333333333333333E3));
 345 
 346         /*
 347          * Test for long/Long
 348          */
 349         checkFormat(new Long(3333), "-9.999E3");
 350         df.setParseIntegerOnly(true);
 351         checkParse("-1.0E4", new Long(0));
 352         df.setParseIntegerOnly(false);
 353         checkParse("-1.0E4", new Double(3333.3333333333335));
 354 
 355         checkFormat(new Long(-3333), "9.999E3");
 356         df.setParseIntegerOnly(true);
 357         checkParse("10.0E4", new Long(-3));
 358         df.setParseIntegerOnly(false);
 359         checkParse("10.0E4", new Double(-33333.3333333333336));
 360 
 361         /* ---------------------------------------------------------------- */
 362 
 363         df.setParseBigDecimal(true);
 364 
 365         /*
 366          * Test for BigDecimal
 367          */
 368 
 369         checkFormat(new BigDecimal("333.333333333333333333333333"),
 370                    "-9.99999999999999999999999999E2");
 371         checkParse("-1.0000000000000000000000000E3",
 372                     new BigDecimal("3.333333333333333333333333E2"));
 373 
 374         df.setParseIntegerOnly(true);
 375         checkFormat(new BigDecimal("-333.333333333333333333333333"),
 376                    "9.99999999999999999999999999E2");
 377         checkParse("10.0000000000000000000000000E3",
 378                     new BigDecimal("-3"));
 379         df.setParseIntegerOnly(false);
 380         checkFormat(new BigDecimal("-333.333333333333333333333333"),
 381                    "9.99999999999999999999999999E2");
 382         checkParse("1.0000000000000000000000000E3",
 383                     new BigDecimal("-3.333333333333333333333333E2"));
 384 
 385         /*
 386          * Test for BigInteger
 387          */
 388         checkFormat(new BigInteger("33333333333333333333333333"),
 389                     "-9.9999999999999999999999999E25");
 390         checkParse("-100000000000000000000000000",
 391                     new BigDecimal("33333333333333333333333333"));
 392 
 393         checkFormat(new BigInteger("-33333333333333333333333333"),
 394                     "9.9999999999999999999999999E25");
 395         df.setParseIntegerOnly(true);
 396         checkParse("100000000000000000000000000000",
 397                     new BigDecimal("-33333333333333333333333333333"));
 398         df.setParseIntegerOnly(false);
 399         checkParse("100000000000000000000000000.000",
 400                     new BigDecimal("-33333333333333333333333333.333"));
 401 
 402         /* ================================================================ */
 403 
 404         Locale.setDefault(defaultLoc);
 405 
 406         if (err) {
 407             throw new RuntimeException("Wrong format/parse with DecimalFormat");
 408         }
 409     }
 410 
 411     static void checkFormat(Number num, String expected) {
 412         String got = df.format(num);
 413         if (!got.equals(expected)) {
 414             err = true;
 415             System.err.println("    DecimalFormat format(" +
 416                                num.getClass().getName() +
 417                                ") error:" +
 418                                "\n\tnumber:     " + num +
 419                                "\n\tpattern:    " + df.toPattern() +
 420                                "\n\tmultiplier: " + df.getMultiplier() +
 421                                "\n\tgot:        " + got +
 422                                "\n\texpected:   " + expected);
 423         }
 424     }
 425 
 426     static void checkParse(String text, Double expected) {
 427         Double got = (Double)df.parse(text, new ParsePosition(0));
 428         if (!got.equals(expected)) {
 429             err = true;
 430             System.err.println("    DecimalFormat parse(double) error:" +
 431                                "\n\ttext:       " + text +
 432                                "\n\tpattern:    " + df.toPattern() +
 433                                "\n\tmultiplier: " + df.getMultiplier() +
 434                                "\n\tgot:        " + got +
 435                                "\n\texpected:   " + expected);
 436         }
 437     }
 438 
 439     static void checkParse(String text, Long expected) {
 440         Long got = (Long)df.parse(text, new ParsePosition(0));
 441         if (!got.equals(expected)) {
 442             err = true;
 443             System.err.println("    DecimalFormat parse(long) error:" +
 444                                "\n\ttext:       " + text +
 445                                "\n\tpattern:    " + df.toPattern() +
 446                                "\n\tmultiplier: " + df.getMultiplier() +
 447                                "\n\tgot:        " + got +
 448                                "\n\texpected:   " + expected);
 449         }
 450     }
 451 
 452     static void checkParse(String text, BigDecimal expected) {
 453         BigDecimal got = (BigDecimal)df.parse(text, new ParsePosition(0));
 454         if (!got.equals(expected)) {
 455             err = true;
 456             System.err.println("    DecimalFormat parse(BigDecimal) error:" +
 457                                "\n\ttext:       " + text +
 458                                "\n\tpattern:    " + df.toPattern() +
 459                                "\n\tmultiplier: " + df.getMultiplier() +
 460                                "\n\tgot:        " + got +
 461                                "\n\texpected:   " + expected);
 462         }
 463     }
 464 }