Home | History | Annotate | Download | only in text
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package org.apache.harmony.tests.java.text;
     19 
     20 import java.io.ObjectInputStream;
     21 import java.math.BigDecimal;
     22 import java.math.BigInteger;
     23 import java.math.RoundingMode;
     24 import java.text.AttributedCharacterIterator;
     25 import java.text.DecimalFormat;
     26 import java.text.DecimalFormatSymbols;
     27 import java.text.FieldPosition;
     28 import java.text.NumberFormat;
     29 import java.text.ParsePosition;
     30 import java.util.ArrayList;
     31 import java.util.Currency;
     32 import java.util.List;
     33 import java.util.Locale;
     34 
     35 import junit.framework.Assert;
     36 import junit.framework.AssertionFailedError;
     37 import junit.framework.TestCase;
     38 
     39 import org.apache.harmony.testframework.serialization.SerializationTest;
     40 
     41 
     42 public class DecimalFormatTest extends TestCase {
     43 
     44     // https://code.google.com/p/android/issues/detail?id=59600
     45     public void test_setNan_emptyString() throws Exception {
     46         DecimalFormatSymbols dfs = new DecimalFormatSymbols();
     47         dfs.setNaN("");
     48         DecimalFormat df = new DecimalFormat();
     49         df.setDecimalFormatSymbols(dfs);
     50         df.format(Double.NaN);
     51     }
     52 
     53     public void testAttributedCharacterIterator() throws Exception {
     54         // Regression for http://issues.apache.org/jira/browse/HARMONY-333
     55         AttributedCharacterIterator iterator = new DecimalFormat().formatToCharacterIterator(
     56                 new Integer(1));
     57         assertNotNull(iterator);
     58         assertFalse("attributes should exist", iterator.getAttributes().isEmpty());
     59     }
     60 
     61     public void test_parse_bigDecimal() throws Exception {
     62         // parseBigDecimal default to false
     63         DecimalFormat form = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
     64         assertFalse(form.isParseBigDecimal());
     65         form.setParseBigDecimal(true);
     66         assertTrue(form.isParseBigDecimal());
     67 
     68         Number result = form.parse("123.123");
     69         assertEquals(new BigDecimal("123.123"), result);
     70 
     71         form.setParseBigDecimal(false);
     72         assertFalse(form.isParseBigDecimal());
     73 
     74         result = form.parse("123.123");
     75         assertFalse(result instanceof BigDecimal);
     76     }
     77 
     78     public void test_parse_integerOnly() throws Exception {
     79         DecimalFormat format = new DecimalFormat();
     80         assertFalse("Default value of isParseIntegerOnly is true", format.isParseIntegerOnly());
     81 
     82         format.setParseIntegerOnly(true);
     83         assertTrue(format.isParseIntegerOnly());
     84         Number result = format.parse("123.123");
     85         assertEquals(new Long("123"), result);
     86 
     87         format.setParseIntegerOnly(false);
     88         assertFalse(format.isParseIntegerOnly());
     89         result = format.parse("123.123");
     90         assertEquals(new Double("123.123"), result);
     91     }
     92 
     93     // Test the type of the returned object
     94     public void test_parse_returnType() {
     95         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
     96         Number number = form.parse("23.1", new ParsePosition(0));
     97         assertTrue(number instanceof Double);
     98 
     99         // Test parsed object of type double when
    100         // parseBigDecimal is set to true
    101 
    102         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    103         number = form.parse("23.1", new ParsePosition(0));
    104         assertTrue(number instanceof Double);
    105 
    106         form.setParseBigDecimal(true);
    107         number = form.parse("23.1", new ParsePosition(0));
    108 
    109         assertTrue(number instanceof BigDecimal);
    110         assertEquals(new BigDecimal("23.1"), number);
    111 
    112         // When parseIntegerOnly set to true, all numbers will be parsed
    113         // into Long unless the value is out of the bound of Long or
    114         // some special values such as NaN or Infinity.
    115 
    116         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    117         form.setParseIntegerOnly(true);
    118         number = form.parse("23.1f", new ParsePosition(0));
    119 
    120         assertTrue(number instanceof Long);
    121 
    122         number = form.parse("23.0", new ParsePosition(0));
    123         assertTrue(number instanceof Long);
    124 
    125         number = form.parse("-0.0", new ParsePosition(0));
    126         assertTrue(number instanceof Long);
    127         assertTrue(new Long(0).equals(number));
    128 
    129         // The last integers representable by long.
    130         number = form.parse("9223372036854775807.00", new ParsePosition(0));
    131         assertEquals(Long.class, number.getClass());
    132         number = form.parse("9223372036854775808.00", new ParsePosition(0));
    133         assertEquals(Double.class, number.getClass());
    134         // The first integers that need to be represented by double.
    135         number = form.parse("-9223372036854775808.00", new ParsePosition(0));
    136         assertEquals(Long.class, number.getClass());
    137         number = form.parse("-9223372036854775809.00", new ParsePosition(0));
    138         assertEquals(Double.class, number.getClass());
    139 
    140         // Even if parseIntegerOnly is set to true, NaN will be parsed to Double
    141 
    142         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    143         form.setParseIntegerOnly(true);
    144         DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    145         number = form.parse(symbols.getNaN(), new ParsePosition(0));
    146         assertTrue(number instanceof Double);
    147 
    148         // Even if parseIntegerOnly is set to true, Infinity will still be
    149         // parsed to Double
    150 
    151         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    152         form.setParseIntegerOnly(true);
    153         symbols = new DecimalFormatSymbols();
    154         number = form.parse(symbols.getInfinity(), new ParsePosition(0));
    155         assertTrue(number instanceof Double);
    156 
    157         // ParseBigDecimal take precedence of parseBigInteger
    158 
    159         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    160         form.setParseIntegerOnly(true);
    161         form.setParseBigDecimal(true);
    162 
    163         number = form.parse("23.1f", new ParsePosition(0));
    164 
    165         assertTrue(number instanceof BigDecimal);
    166 
    167         number = form.parse("23.0", new ParsePosition(0));
    168         assertTrue(number instanceof BigDecimal);
    169 
    170         number = form.parse("-92,233,720,368,547,758,080.00", new ParsePosition(0));
    171         assertFalse(number instanceof BigInteger);
    172         assertTrue(number instanceof BigDecimal);
    173 
    174         // Test whether the parsed object is of type float. (To be specific,
    175         // they are of type Double)
    176 
    177         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    178 
    179         number = form.parse("23.1f", new ParsePosition(0));
    180         assertTrue(number instanceof Double);
    181 
    182         form.setParseBigDecimal(true);
    183         number = form.parse("23.1f", new ParsePosition(0));
    184         assertTrue(number instanceof BigDecimal);
    185         assertEquals(new BigDecimal("23.1"), number);
    186 
    187         // Integer will be parsed to Long, unless parseBigDecimal is set to true
    188 
    189         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    190 
    191         number = form.parse("123", new ParsePosition(0));
    192         assertTrue(number instanceof Long);
    193 
    194         form.setParseBigDecimal(true);
    195         number = form.parse("123", new ParsePosition(0));
    196         assertTrue(number instanceof BigDecimal);
    197         assertEquals(new BigDecimal("123"), number);
    198 
    199         // NaN will be parsed to Double, no matter parseBigDecimal set or not.
    200 
    201         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    202         symbols = new DecimalFormatSymbols();
    203         number = form.parse(symbols.getNaN() + "", new ParsePosition(0));
    204         assertTrue(number instanceof Double);
    205 
    206         form.setParseBigDecimal(true);
    207         number = form.parse(symbols.getNaN() + "", new ParsePosition(0));
    208         assertTrue(number instanceof Double);
    209 
    210         // Infinity will be parsed to Double, no matter parseBigDecimal set or
    211         // not.
    212 
    213         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    214         symbols = new DecimalFormatSymbols();
    215 
    216         number = form.parse(symbols.getInfinity(), new ParsePosition(0));
    217 
    218         assertTrue(number instanceof Double);
    219         assertEquals("Infinity", number.toString());
    220         // When set bigDecimal to true, the result of parsing infinity
    221 
    222         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    223         symbols = new DecimalFormatSymbols();
    224         form.setParseBigDecimal(true);
    225 
    226         number = form.parse(symbols.getInfinity(), new ParsePosition(0));
    227         assertTrue(number instanceof Double);
    228         assertEquals("Infinity", number.toString());
    229 
    230         // Negative infinity will be parsed to double no matter parseBigDecimal
    231         // set or not
    232 
    233         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    234         symbols = new DecimalFormatSymbols();
    235 
    236         number = form.parse("-" + symbols.getInfinity(), new ParsePosition(0));
    237 
    238         assertTrue(number instanceof Double);
    239         assertEquals("-Infinity", number.toString());
    240 
    241         // When set bigDecimal to true, the result of parsing minus infinity
    242 
    243         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    244         symbols = new DecimalFormatSymbols();
    245         form.setParseBigDecimal(true);
    246 
    247         number = form.parse("-" + symbols.getInfinity(), new ParsePosition(0));
    248 
    249         assertTrue(number instanceof Double);
    250         assertEquals("-Infinity", number.toString());
    251 
    252         // -0.0 will be parsed to different type according to the combination of
    253         // parseBigDecimal and parseIntegerOnly
    254 
    255         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    256 
    257         // parseBigDecimal == true;
    258         // parseIntegerOnly == false;
    259         form.setParseBigDecimal(true);
    260         number = form.parse("-0", new ParsePosition(0));
    261         assertTrue(number instanceof BigDecimal);
    262 
    263         number = form.parse("-0.0", new ParsePosition(0));
    264         assertTrue(number instanceof BigDecimal);
    265 
    266         // parseBigDecimal == false;
    267         // parseIntegerOnly == true;
    268         form.setParseBigDecimal(false);
    269         form.setParseIntegerOnly(true);
    270         number = form.parse("-0", new ParsePosition(0));
    271 
    272         assertTrue(number instanceof Long);
    273 
    274         number = form.parse("-0.0", new ParsePosition(0));
    275         assertTrue(number instanceof Long);
    276 
    277         // parseBigDecimal == false;
    278         // parseIntegerOnly == false;
    279         form.setParseBigDecimal(false);
    280         form.setParseIntegerOnly(false);
    281         number = form.parse("-0", new ParsePosition(0));
    282         assertTrue(number instanceof Double);
    283 
    284         number = form.parse("-0.0", new ParsePosition(0));
    285         assertTrue(number instanceof Double);
    286 
    287         // parseBigDecimal == true;
    288         // parseIntegerOnly == true;
    289         // parseBigDecimal take precedence of parseBigInteger
    290         form.setParseBigDecimal(true);
    291         form.setParseIntegerOnly(true);
    292         number = form.parse("-0", new ParsePosition(0));
    293         assertTrue(number instanceof BigDecimal);
    294 
    295         number = form.parse("-0.0", new ParsePosition(0));
    296         assertTrue(number instanceof BigDecimal);
    297 
    298         number = form.parse("12.4", new ParsePosition(0));
    299         assertTrue(number instanceof BigDecimal);
    300 
    301         // When parseBigDecimal is set to false, no matter how massive the
    302         // mantissa part of a number is, the number will be parsed into Double
    303 
    304         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    305 
    306         number = form.parse("9,223,372,036,854,775,808.00",
    307                 new ParsePosition(0));
    308 
    309         assertTrue(number instanceof Double);
    310         assertEquals("9.223372036854776E18", number.toString());
    311 
    312         number = form.parse("-92,233,720,368,547,758,080.00",
    313                 new ParsePosition(0));
    314         assertTrue(number instanceof Double);
    315         assertEquals("-9.223372036854776E19", number.toString());
    316 
    317         // When parseBigDecimal is set to true, if mantissa part of number
    318         // exceeds Long.MAX_VALUE, the number will be parsed into BigDecimal
    319 
    320         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    321 
    322         form.setParseBigDecimal(true);
    323         number = form.parse("9,223,372,036,854,775,808.00",
    324                 new ParsePosition(0));
    325 
    326         assertTrue(number instanceof BigDecimal);
    327 
    328         assertEquals(9.223372036854776E18, number.doubleValue(), 0);
    329 
    330         number = form.parse("-92,233,720,368,547,758,080.00", new ParsePosition(0));
    331 
    332         assertTrue(number instanceof BigDecimal);
    333         assertEquals(-9.223372036854776E19, number.doubleValue(), 0);
    334 
    335         // The minimum value of Long will be parsed to Long when parseBigDecimal
    336         // is not set
    337 
    338         ParsePosition pos = new ParsePosition(0);
    339         DecimalFormat df = new DecimalFormat();
    340         pos = new ParsePosition(0);
    341         Number nb = df.parse("" + Long.MIN_VALUE, pos);
    342         assertTrue(nb instanceof Long);
    343 
    344         // The maximum value of Long will be parsed to Long when parseBigDecimal
    345         // is set
    346         pos = new ParsePosition(0);
    347         df = new DecimalFormat();
    348         pos = new ParsePosition(0);
    349         nb = df.parse("" + Long.MAX_VALUE, pos);
    350         assertTrue(nb instanceof Long);
    351 
    352         // When parsing invalid string( which is neither consist of digits nor
    353         // NaN/Infinity), a null will be returned.
    354 
    355         pos = new ParsePosition(0);
    356         df = new DecimalFormat();
    357         try {
    358             nb = df.parse("invalid", pos);
    359             assertNull(nb);
    360         } catch (NullPointerException e) {
    361             fail("Should not throw NPE");
    362         }
    363     }
    364 
    365     public void test_parse_largeBigDecimal() {
    366         DecimalFormat form = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
    367         form.setParseIntegerOnly(true);
    368         form.setParseBigDecimal(true);
    369 
    370         final String doubleMax2 = "359,538,626,972,463,141,629,054,847,463,408,"
    371                 + "713,596,141,135,051,689,993,197,834,953,606,314,521,560,057,077,"
    372                 + "521,179,117,265,533,756,343,080,917,907,028,764,928,468,642,653,"
    373                 + "778,928,365,536,935,093,407,075,033,972,099,821,153,102,564,152,"
    374                 + "490,980,180,778,657,888,151,737,016,910,267,884,609,166,473,806,"
    375                 + "445,896,331,617,118,664,246,696,549,595,652,408,289,446,337,476,"
    376                 + "354,361,838,599,762,500,808,052,368,249,716,736";
    377         Number number = form.parse(doubleMax2, new ParsePosition(0));
    378         assertTrue(number instanceof BigDecimal);
    379         BigDecimal result = (BigDecimal) number;
    380         assertEquals(new BigDecimal(Double.MAX_VALUE).add(new BigDecimal(Double.MAX_VALUE)),
    381                 result);
    382     }
    383 
    384     public void testMaximumFractionDigits_getAndSet() {
    385         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    386         // getMaximumFractionDigits of DecimalFormat defaults to 3
    387         assertEquals(3, form.getMaximumFractionDigits());
    388 
    389         form.setMaximumFractionDigits(310);
    390         assertEquals(310, form.getMaximumFractionDigits());
    391 
    392         // Deliberately > 340. The API docs mention 340 and suggest that you can set the value
    393         // higher but it will use 340 as a ceiling.
    394         form.setMaximumFractionDigits(500);
    395         assertEquals(500, form.getMaximumFractionDigits());
    396 
    397         form.setMaximumFractionDigits(500);
    398         assertEquals(500, form.getMaximumFractionDigits());
    399         form.format(12.3);
    400         assertEquals(500, form.getMaximumFractionDigits());
    401 
    402         form.setMaximumFractionDigits(-2);
    403         assertEquals(0, form.getMaximumFractionDigits());
    404     }
    405 
    406     public void testMinimumFractionDigits_getAndSet() {
    407         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    408 
    409         // getMinimumFractionDigits from NumberFormat (default to 0)
    410         // getMinimumFractionDigits from DecimalFormat (default to 0)
    411         assertEquals(0, form.getMinimumFractionDigits());
    412 
    413         form.setMinimumFractionDigits(310);
    414         assertEquals(310, form.getMinimumFractionDigits());
    415 
    416         // Deliberately > 340. The API docs mention 340 and suggest that you can set the value
    417         // higher but it will use 340 as a ceiling.
    418         form.setMinimumFractionDigits(500);
    419         assertEquals(500, form.getMinimumFractionDigits());
    420 
    421         form.setMaximumFractionDigits(400);
    422         assertEquals(400, form.getMinimumFractionDigits());
    423 
    424         form.setMinimumFractionDigits(-3);
    425         assertEquals(0, form.getMinimumFractionDigits());
    426     }
    427 
    428     public void testMaximumIntegerDigits_getAndSet() {
    429         // When use default locale, in this case zh_CN
    430         // the returned instance of NumberFormat is a DecimalFormat
    431         DecimalFormat form = new DecimalFormat("00.###E0");
    432         assertEquals(2, form.getMaximumIntegerDigits());
    433 
    434         form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    435 
    436         form.setMaximumIntegerDigits(300);
    437         assertEquals(300, form.getMaximumIntegerDigits());
    438 
    439         // Deliberately > 309. The API docs mention 309 and suggest that you can set the value
    440         // higher but it will use 309 as a ceiling.
    441         form.setMaximumIntegerDigits(500);
    442         assertEquals(500, form.getMaximumIntegerDigits());
    443 
    444         form = new DecimalFormat("00.###E0");
    445         assertEquals(2, form.getMaximumIntegerDigits());
    446 
    447         form.setMaximumIntegerDigits(500);
    448         assertEquals(500, form.getMaximumIntegerDigits());
    449         form.format(12.3);
    450         assertEquals(500, form.getMaximumIntegerDigits());
    451 
    452         form.setMaximumIntegerDigits(-3);
    453         assertEquals(0, form.getMaximumIntegerDigits());
    454 
    455         // regression test for HARMONY-878
    456         assertTrue(new DecimalFormat("0\t'0'").getMaximumIntegerDigits() > 0);
    457     }
    458 
    459     public void testMinimumIntegerDigits_getAndSet() {
    460         final int minIntDigit = 1;
    461         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    462 
    463         // getMaximumIntegerDigits from DecimalFormat (default to 1)
    464         assertEquals(minIntDigit, form.getMinimumIntegerDigits());
    465 
    466         form.setMinimumIntegerDigits(300);
    467         assertEquals(300, form.getMinimumIntegerDigits());
    468 
    469         // Deliberately > 309. The API docs mention 309 and suggest that you can set the value
    470         // higher but it will use 309 as a ceiling.
    471         form.setMinimumIntegerDigits(500);
    472         assertEquals(500, form.getMinimumIntegerDigits());
    473 
    474         form.setMaximumIntegerDigits(400);
    475         assertEquals(400, form.getMinimumIntegerDigits());
    476 
    477         form.setMinimumIntegerDigits(-3);
    478         assertEquals(0, form.getMinimumIntegerDigits());
    479     }
    480 
    481     // When MaxFractionDigits is set first and less than MinFractionDigits, max
    482     // will be changed to min value
    483     public void testMinimumFactionDigits_minChangesMax() {
    484         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    485 
    486         form.setMaximumFractionDigits(100);
    487         form.setMinimumFractionDigits(200);
    488 
    489         assertEquals(200, form.getMaximumFractionDigits());
    490         assertEquals(200, form.getMinimumFractionDigits());
    491 
    492         form.setMaximumIntegerDigits(100);
    493         form.setMinimumIntegerDigits(200);
    494 
    495         assertEquals(200, form.getMaximumIntegerDigits());
    496         assertEquals(200, form.getMinimumIntegerDigits());
    497     }
    498 
    499     // When MinFractionDigits is set first and less than MaxFractionDigits, min
    500     // will be changed to max value
    501     public void testMaximumFactionDigits_maxChangesMin() {
    502         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    503 
    504         form.setMinimumFractionDigits(200);
    505         form.setMaximumFractionDigits(100);
    506 
    507         assertEquals(100, form.getMaximumFractionDigits());
    508         assertEquals(100, form.getMinimumFractionDigits());
    509 
    510         form.setMinimumIntegerDigits(200);
    511         form.setMaximumIntegerDigits(100);
    512 
    513         assertEquals(100, form.getMaximumIntegerDigits());
    514         assertEquals(100, form.getMinimumIntegerDigits());
    515     }
    516 
    517     public void test_formatObject_errorCases() {
    518         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    519 
    520         // If Object(including null) is not of type Number,
    521         // IllegalArgumentException will be thrown out
    522         try {
    523             form.format(new Object(), new StringBuffer(), new FieldPosition(0));
    524             fail("Should throw IAE");
    525         } catch (IllegalArgumentException e) {
    526             // expected
    527         }
    528         try {
    529             form.format(null, new StringBuffer(), new FieldPosition(0));
    530             fail("Should throw IAE");
    531         } catch (IllegalArgumentException e) {
    532             // expected
    533         }
    534 
    535         // When StringBuffer == null || FieldPosition == null
    536         // NullPointerException will be thrown out.
    537         try {
    538             form.format(new Double(1.9), null, new FieldPosition(0));
    539             fail("Should throw NPE");
    540         } catch (NullPointerException e) {
    541             // expected
    542         }
    543 
    544         try {
    545             form.format(new Double(1.3), new StringBuffer(), null);
    546             fail("Should throw NPE");
    547         } catch (NullPointerException e) {
    548             // expected
    549         }
    550 
    551         try {
    552             form.format(new Object(), new StringBuffer(), new FieldPosition(0));
    553             fail();
    554         } catch (IllegalArgumentException expected) {
    555         }
    556     }
    557 
    558     public void test_formatObject() {
    559         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    560 
    561         // format maxLong
    562         FieldPosition pos = new FieldPosition(0);
    563         StringBuffer out = format.format(new Long(Long.MAX_VALUE), new StringBuffer(), pos);
    564         assertTrue("Wrong result L1: " + out, out.toString().equals("9,223,372,036,854,775,807"));
    565 
    566         // format minLong
    567         pos = new FieldPosition(0);
    568         out = format.format(new Long(Long.MIN_VALUE), new StringBuffer(), pos);
    569         assertTrue("Wrong result L2: " + out, out.toString().equals("-9,223,372,036,854,775,808"));
    570 
    571         // format maxLong of type BigInteger
    572         pos = new FieldPosition(0);
    573         out = format.format(new java.math.BigInteger(String.valueOf(Long.MAX_VALUE)),
    574                 new StringBuffer(), pos);
    575         assertTrue("Wrong result BI1: " + out, out.toString().equals("9,223,372,036,854,775,807"));
    576 
    577         // format minLong of type BigInteger
    578         pos = new FieldPosition(0);
    579         out = format.format(new java.math.BigInteger(String.valueOf(Long.MIN_VALUE)),
    580                 new StringBuffer(), pos);
    581         assertTrue("Wrong result BI2: " + out, out.toString().equals("-9,223,372,036,854,775,808"));
    582 
    583         // format maxLong + 1
    584         java.math.BigInteger big;
    585         pos = new FieldPosition(0);
    586         big = new java.math.BigInteger(String.valueOf(Long.MAX_VALUE))
    587                 .add(new java.math.BigInteger("1"));
    588         out = format.format(big, new StringBuffer(), pos);
    589         assertTrue("Wrong result BI3: " + out, out.toString().equals("9,223,372,036,854,775,808"));
    590 
    591         // format minLong - 1
    592         pos = new FieldPosition(0);
    593         big = new java.math.BigInteger(String.valueOf(Long.MIN_VALUE))
    594                 .add(new java.math.BigInteger("-1"));
    595         out = format.format(big, new StringBuffer(), pos);
    596         assertTrue("Wrong result BI4: " + out, out.toString().equals("-9,223,372,036,854,775,809"));
    597 
    598         // format big decimal
    599         pos = new FieldPosition(0);
    600         out = format.format(new java.math.BigDecimal("51.348"), new StringBuffer(), pos);
    601         assertTrue("Wrong result BD1: " + out, out.toString().equals("51.348"));
    602 
    603         // format big decimal
    604         pos = new FieldPosition(0);
    605         out = format.format(new java.math.BigDecimal("51"), new StringBuffer(), pos);
    606         assertTrue("Wrong result BD2: " + out, out.toString().equals("51"));
    607 
    608         // format big decimal Double.MAX_VALUE * 2
    609         java.math.BigDecimal bigDecimal;
    610         pos = new FieldPosition(0);
    611         final String doubleMax2 = "359,538,626,972,463,141,629,054,847,463,408,"
    612                 + "713,596,141,135,051,689,993,197,834,953,606,314,521,560,057,077,"
    613                 + "521,179,117,265,533,756,343,080,917,907,028,764,928,468,642,653,"
    614                 + "778,928,365,536,935,093,407,075,033,972,099,821,153,102,564,152,"
    615                 + "490,980,180,778,657,888,151,737,016,910,267,884,609,166,473,806,"
    616                 + "445,896,331,617,118,664,246,696,549,595,652,408,289,446,337,476,"
    617                 + "354,361,838,599,762,500,808,052,368,249,716,736";
    618         bigDecimal = new BigDecimal(Double.MAX_VALUE).add(new BigDecimal(Double.MAX_VALUE));
    619         out = format.format(bigDecimal, new StringBuffer(), pos);
    620         assertTrue("Wrong result BDmax2: " + out, out.toString().equals(doubleMax2));
    621 
    622         // format big decimal Double.MIN_VALUE + Double.MIN_VALUE
    623         // and Double.MIN_VALUE - Double.MIN_VALUE
    624         pos = new FieldPosition(0);
    625 
    626         bigDecimal = new BigDecimal(Double.MIN_VALUE).add(new BigDecimal(Double.MIN_VALUE));
    627         out = format.format(bigDecimal, new StringBuffer(), pos);
    628 
    629         bigDecimal = new BigDecimal(Float.MAX_VALUE).add(new BigDecimal(Float.MAX_VALUE));
    630         out = format.format(bigDecimal, new StringBuffer(), pos);
    631         final String BDFloatMax2 = "680,564,693,277,057,719,623,408,366,969,033,850,880";
    632         assertTrue("Wrong result BDFloatMax2: " + out, out.toString().equals(BDFloatMax2));
    633         // format big decimal Float.MIN_VALUE + Float.MIN_VALUE
    634         // and Float.MIN_VALUE - Float.MIN_VALUE
    635         bigDecimal = new BigDecimal(Float.MIN_VALUE).add(new BigDecimal(Float.MIN_VALUE));
    636         out = format.format(bigDecimal, new StringBuffer(), pos);
    637         final String BDFloatMin2 = "0";
    638 
    639         bigDecimal = new BigDecimal(Float.MIN_VALUE).subtract(new BigDecimal(Float.MIN_VALUE));
    640         out = format.format(bigDecimal, new StringBuffer(), pos);
    641 
    642         assertTrue("Wrong result BDFloatMax2: " + out, out.toString().equals(BDFloatMin2));
    643     }
    644 
    645     public void test_equals() {
    646         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    647         DecimalFormat cloned = (DecimalFormat) format.clone();
    648         cloned.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
    649         assertEquals(format, cloned);
    650 
    651         Currency c = Currency.getInstance(Locale.US);
    652         cloned.setCurrency(c);
    653 
    654         assertEquals(format, cloned);
    655     }
    656 
    657     public void test_getNegativePrefix() {
    658         DecimalFormat df = new DecimalFormat();
    659         df.setNegativePrefix("--");
    660         assertTrue("Incorrect negative prefix", df.getNegativePrefix().equals("--"));
    661     }
    662 
    663     public void test_getNegativeSuffix() {
    664         DecimalFormat df = new DecimalFormat();
    665         df.setNegativeSuffix("&");
    666         assertTrue("Incorrect negative suffix", df.getNegativeSuffix().equals("&"));
    667     }
    668 
    669     public void test_getPositivePrefix() {
    670         DecimalFormat df = new DecimalFormat();
    671         df.setPositivePrefix("++");
    672         assertTrue("Incorrect positive prefix", df.getPositivePrefix().equals("++"));
    673     }
    674 
    675     public void test_getPositiveSuffix() {
    676         DecimalFormat df = new DecimalFormat();
    677         df.setPositiveSuffix("%");
    678         assertTrue("Incorrect positive prefix", df.getPositiveSuffix().equals("%"));
    679     }
    680 
    681     public void test_setPositivePrefix() throws Exception {
    682         DecimalFormat format = new DecimalFormat();
    683         assertEquals("", format.getPositivePrefix());
    684 
    685         format.setPositivePrefix("PosPrf");
    686         assertEquals("PosPrf", format.getPositivePrefix());
    687         assertTrue(format.parse("PosPrf123.45").doubleValue() == 123.45);
    688 
    689         format.setPositivePrefix("");
    690         assertEquals("", format.getPositivePrefix());
    691 
    692         format.setPositivePrefix(null);
    693         assertNull(format.getPositivePrefix());
    694     }
    695 
    696     public void test_setPositiveSuffix() throws Exception {
    697         DecimalFormat format = new DecimalFormat();
    698         assertEquals("", format.getPositiveSuffix());
    699 
    700         format.setPositiveSuffix("PosSfx");
    701         assertEquals("PosSfx", format.getPositiveSuffix());
    702         assertTrue(format.parse("123.45PosSfx").doubleValue() == 123.45);
    703 
    704         format.setPositiveSuffix("");
    705         assertEquals("", format.getPositiveSuffix());
    706 
    707         format.setPositiveSuffix(null);
    708         assertNull(format.getPositiveSuffix());
    709     }
    710 
    711     public void test_setNegativePrefix() throws Exception {
    712         DecimalFormat format = new DecimalFormat();
    713         assertEquals("-", format.getNegativePrefix());
    714 
    715         format.setNegativePrefix("NegPrf");
    716         assertEquals("NegPrf", format.getNegativePrefix());
    717         assertTrue(format.parse("NegPrf123.45").doubleValue() == -123.45);
    718         format.setNegativePrefix("");
    719         assertEquals("", format.getNegativePrefix());
    720 
    721         format.setNegativePrefix(null);
    722         assertNull(format.getNegativePrefix());
    723     }
    724 
    725     public void test_setNegativeSuffix() throws Exception {
    726         DecimalFormat format = new DecimalFormat();
    727         assertEquals("", format.getNegativeSuffix());
    728 
    729         format.setNegativeSuffix("NegSfx");
    730         assertEquals("NegSfx", format.getNegativeSuffix());
    731         assertTrue(format.parse("123.45NegPfx").doubleValue() == 123.45);
    732 
    733         format.setNegativeSuffix("");
    734         assertEquals("", format.getNegativeSuffix());
    735 
    736         format.setNegativeSuffix(null);
    737         assertNull(format.getNegativeSuffix());
    738     }
    739 
    740     public void test_setGroupingUsed() {
    741         DecimalFormat format = new DecimalFormat();
    742 
    743         StringBuffer buf = new StringBuffer();
    744         format.setGroupingUsed(false);
    745         format.format(new Long(1970), buf, new FieldPosition(0));
    746         assertEquals("1970", buf.toString());
    747         assertFalse(format.isGroupingUsed());
    748         format.format(new Long(1970), buf, new FieldPosition(0));
    749         assertEquals("19701970", buf.toString());
    750         assertFalse(format.isGroupingUsed());
    751 
    752         format.setGroupingUsed(true);
    753         format.format(new Long(1970), buf, new FieldPosition(0));
    754         assertEquals("197019701,970", buf.toString());
    755         assertTrue(format.isGroupingUsed());
    756     }
    757 
    758     public void test_isGroupingUsed() {
    759         assertFalse(new DecimalFormat("####.##").isGroupingUsed());
    760         assertFalse(new DecimalFormat("######.######").isGroupingUsed());
    761         assertFalse(new DecimalFormat("000000.000000").isGroupingUsed());
    762         assertFalse(new DecimalFormat("######.000000").isGroupingUsed());
    763         assertFalse(new DecimalFormat("000000.######").isGroupingUsed());
    764         assertFalse(new DecimalFormat(" ###.###").isGroupingUsed());
    765         assertFalse(new DecimalFormat("$#####.######").isGroupingUsed());
    766         assertFalse(new DecimalFormat("$$####.######").isGroupingUsed());
    767 
    768         assertTrue(new DecimalFormat("###,####").isGroupingUsed());
    769     }
    770 
    771     public void testConstructor_noArg() {
    772         // Test for method java.text.DecimalFormat()
    773         // the constructor form that specifies a pattern is equal to the form
    774         // constructed with no pattern and applying that pattern using the
    775         // applyPattern call
    776         DecimalFormat format1 = new DecimalFormat();
    777         format1.applyPattern("'$'1000.0000");
    778         DecimalFormat format2 = new DecimalFormat();
    779         format2.applyPattern("'$'1000.0000");
    780         assertTrue("Constructed format did not match applied format object",
    781                 format2.equals(format1));
    782         DecimalFormat format3 = new DecimalFormat("'$'1000.0000");
    783         assertTrue("Constructed format did not match applied format object",
    784                 format3.equals(format1));
    785         DecimalFormat format4 = new DecimalFormat("'$'8000.0000");
    786         assertTrue("Constructed format did not match applied format object",
    787                 !format4.equals(format1));
    788     }
    789 
    790     public void testConstructor_string() {
    791         // Test for method java.text.DecimalFormat(java.lang.String)
    792         // the constructor form that specifies a pattern is equal to the form
    793         // constructed with no pattern and applying that pattern using the
    794         // applyPattern call
    795         DecimalFormat format = new DecimalFormat("'$'0000.0000");
    796         DecimalFormat format1 = new DecimalFormat();
    797         format1.applyPattern("'$'0000.0000");
    798         assertTrue("Constructed format did not match applied format object",
    799                 format.equals(format1));
    800 
    801         new DecimalFormat("####.##");
    802         new DecimalFormat("######.######");
    803         new DecimalFormat("000000.000000");
    804         new DecimalFormat("######.000000");
    805         new DecimalFormat("000000.######");
    806         new DecimalFormat(" ###.###");
    807         new DecimalFormat("$#####.######");
    808         new DecimalFormat("$$####.######");
    809         new DecimalFormat("%#,##,###,####");
    810         new DecimalFormat("#,##0.00;(#,##0.00)");
    811 
    812         try {
    813             new DecimalFormat(null);
    814             fail();
    815         } catch (NullPointerException expected) {
    816         }
    817 
    818         try {
    819             new DecimalFormat("%#,##,###,####'");
    820             fail();
    821         } catch (IllegalArgumentException expected) {
    822         }
    823 
    824         try {
    825             new DecimalFormat("#.##0.00");
    826             fail();
    827         } catch (IllegalArgumentException expected) {
    828         }
    829     }
    830 
    831     public void testConstructor_stringAndSymbols() {
    832         // case 1: Try to construct object using correct pattern and format
    833         // symbols.
    834         DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.CANADA);
    835         DecimalFormat format1 = new DecimalFormat("'$'1000.0000", dfs);
    836         DecimalFormat format2 = new DecimalFormat();
    837         format2.applyPattern("'$'1000.0000");
    838         format2.setDecimalFormatSymbols(dfs);
    839         assertTrue("Constructed format did not match applied format object",
    840                 format2.equals(format1));
    841         assertTrue("Constructed format did not match applied format object",
    842                 !format1.equals(
    843                         new DecimalFormat("'$'1000.0000", new DecimalFormatSymbols(Locale.CHINA))));
    844 
    845         // case 2: Try to construct object using null arguments.
    846         try {
    847             new DecimalFormat("'$'1000.0000", (DecimalFormatSymbols) null);
    848             fail();
    849         } catch (NullPointerException expected) {
    850         }
    851         try {
    852             new DecimalFormat(null, new DecimalFormatSymbols());
    853             fail();
    854         } catch (NullPointerException expected) {
    855         }
    856         try {
    857             new DecimalFormat(null, (DecimalFormatSymbols) null);
    858             fail();
    859         } catch (NullPointerException expected) {
    860         }
    861 
    862         // case 3: Try to construct object using incorrect pattern.
    863         try {
    864             new DecimalFormat("$'", new DecimalFormatSymbols());
    865             fail();
    866         } catch (IllegalArgumentException expected) {
    867         }
    868     }
    869 
    870     public void test_applyPattern() {
    871         DecimalFormat format = new DecimalFormat("#.#");
    872         assertEquals("Wrong pattern 1", "#0.#", format.toPattern());
    873         format = new DecimalFormat("#.");
    874         assertEquals("Wrong pattern 2", "#0.", format.toPattern());
    875         format = new DecimalFormat("#");
    876         assertEquals("Wrong pattern 3", "#", format.toPattern());
    877         format = new DecimalFormat(".#");
    878         assertEquals("Wrong pattern 4", "#.0", format.toPattern());
    879 
    880         // Regression for HARMONY-6485
    881         format = new DecimalFormat();
    882         format.setMinimumIntegerDigits(0);
    883         format.setMinimumFractionDigits(0);
    884         format.setMaximumFractionDigits(0);
    885         format.applyPattern("00.0#");
    886         assertEquals("Minimum integer digits not set", 2, format.getMinimumIntegerDigits());
    887         assertEquals("Minimum fraction digits not set", 1, format.getMinimumFractionDigits());
    888         assertEquals("Maximum fraction digits not set", 2, format.getMaximumFractionDigits());
    889 
    890         try {
    891             format.applyPattern(null);
    892             fail();
    893         } catch (NullPointerException expected) {
    894         }
    895 
    896         try {
    897             format.applyPattern("%#,##,###,####'");
    898             fail();
    899         } catch (IllegalArgumentException expected) {
    900         }
    901 
    902         try {
    903             format.applyPattern("#.##0.00");
    904             fail();
    905         } catch (IllegalArgumentException expected) {
    906         }
    907     }
    908 
    909     // AndroidOnly: icu supports 2 grouping sizes
    910     public void test_applyPattern_icu2GroupingSizes() {
    911         DecimalFormat decFormat = new DecimalFormat("#.#");
    912         String[] patterns = {
    913                 "####.##", "######.######", "000000.000000",
    914                 "######.000000", "000000.######", " ###.###", "$#####.######",
    915                 "$$####.######", "%#,##,###,####", "#,##0.00;(#,##0.00)",
    916                 "##.##-E"
    917         };
    918 
    919         String[] expResult = {
    920                 "#0.##", "#0.######", "#000000.000000",
    921                 "#.000000", "#000000.######", " #0.###", "$#0.######",
    922                 "$$#0.######",
    923                 "%#,###,####", // icu only. icu supports two grouping sizes
    924                 "#,##0.00;(#,##0.00)",
    925                 "#0.##-E"
    926                 // icu only. E in the suffix does not need to be quoted.
    927         };
    928 
    929         for (int i = 0; i < patterns.length; i++) {
    930             decFormat.applyPattern(patterns[i]);
    931             String result = decFormat.toPattern();
    932             assertEquals("Failed to apply following pattern: " + patterns[i] +
    933                     "\n expected: " + expResult[i] +
    934                     "\n returned: " + result, expResult[i], result);
    935         }
    936     }
    937 
    938     public void test_applyLocalizedPattern() throws Exception {
    939         DecimalFormat format = new DecimalFormat();
    940 
    941         // case 1: Try to apply correct variants of pattern.
    942         format.applyLocalizedPattern("#.#");
    943         assertEquals("Wrong pattern 1", "#0.#", format.toLocalizedPattern());
    944         format.applyLocalizedPattern("#.");
    945         assertEquals("Wrong pattern 2", "#0.", format.toLocalizedPattern());
    946         format.applyLocalizedPattern("#");
    947         assertEquals("Wrong pattern 3", "#", format.toLocalizedPattern());
    948         format.applyLocalizedPattern(".#");
    949         assertEquals("Wrong pattern 4", "#.0", format.toLocalizedPattern());
    950 
    951         // case 2: Try to apply malformed patten.
    952         try {
    953             format.applyLocalizedPattern("'#,#:#0.0#;(#)");
    954             fail();
    955         } catch (IllegalArgumentException expected) {
    956         }
    957 
    958         // case 3: Try to apply null pattern.
    959         try {
    960             format.applyLocalizedPattern((String) null);
    961             fail();
    962         } catch (NullPointerException expected) {
    963         }
    964     }
    965 
    966     public void test_toPattern() {
    967         DecimalFormat format = new DecimalFormat();
    968         format.applyPattern("#.#");
    969         assertEquals("Wrong pattern 1", "#0.#", format.toPattern());
    970         format.applyPattern("#.");
    971         assertEquals("Wrong pattern 2", "#0.", format.toPattern());
    972         format.applyPattern("#");
    973         assertEquals("Wrong pattern 3", "#", format.toPattern());
    974         format.applyPattern(".#");
    975         assertEquals("Wrong pattern 4", "#.0", format.toPattern());
    976     }
    977 
    978     public void test_toLocalizedPattern() {
    979         DecimalFormat format = new DecimalFormat();
    980         format.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
    981         format.applyLocalizedPattern("#.#");
    982         assertEquals("Wrong pattern 1", "#0.#", format.toLocalizedPattern());
    983         format.applyLocalizedPattern("#.");
    984         assertEquals("Wrong pattern 2", "#0.", format.toLocalizedPattern());
    985         format.applyLocalizedPattern("#");
    986         assertEquals("Wrong pattern 3", "#", format.toLocalizedPattern());
    987         format.applyLocalizedPattern(".#");
    988         assertEquals("Wrong pattern 4", "#.0", format.toLocalizedPattern());
    989     }
    990 
    991     public void test_hashCode() {
    992         DecimalFormat df1 = new DecimalFormat();
    993         DecimalFormat df2 = (DecimalFormat) df1.clone();
    994         assertTrue("Hash codes of equals object are not equal", df2.hashCode() == df1.hashCode());
    995     }
    996 
    997     public void test_clone() {
    998         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    999         DecimalFormat cloned = (DecimalFormat) format.clone();
   1000         assertEquals(cloned.getDecimalFormatSymbols(), format.getDecimalFormatSymbols());
   1001 
   1002         format = new DecimalFormat("'$'0000.0000");
   1003         DecimalFormat format1 = (DecimalFormat) (format.clone());
   1004         // make sure the objects are equal
   1005         assertTrue("Object's clone isn't equal!", format.equals(format1));
   1006         // change the content of the clone and make sure it's not equal anymore
   1007         // verifies that it's data is now distinct from the original
   1008         format1.applyPattern("'$'0000.####");
   1009         assertTrue("Object's changed clone should not be equal!", !format.equals(format1));
   1010     }
   1011 
   1012     public void test_formatDouble_maximumFractionDigits() {
   1013         DecimalFormat df = new DecimalFormat("###0.##", new DecimalFormatSymbols(Locale.US));
   1014         df.setMaximumFractionDigits(3);
   1015         assertEquals(3, df.getMaximumFractionDigits());
   1016         assertEquals("1.235", df.format(1.23456));
   1017         df.setMinimumFractionDigits(4);
   1018         assertEquals(4, df.getMaximumFractionDigits());
   1019         assertEquals("456.0000", df.format(456));
   1020 
   1021         df = new DecimalFormat("##0.#");
   1022         df.setMaximumFractionDigits(30);
   1023         assertEquals("0", df.format(0.0));
   1024         assertEquals("-0", df.format(-0.0));
   1025         assertEquals("1", df.format(1.0));
   1026         assertEquals("-1", df.format(-1.0));
   1027     }
   1028 
   1029     public void test_formatDouble_minimumFractionDigits() {
   1030         DecimalFormat df = new DecimalFormat("###0.##", new DecimalFormatSymbols(Locale.US));
   1031         df.setMinimumFractionDigits(4);
   1032         assertEquals(4, df.getMinimumFractionDigits());
   1033         assertEquals("1.2300", df.format(1.23));
   1034         df.setMaximumFractionDigits(2);
   1035         assertEquals(2, df.getMinimumFractionDigits());
   1036         assertEquals("456.00", df.format(456));
   1037 
   1038         df = new DecimalFormat("##0.#", new DecimalFormatSymbols(Locale.US));
   1039         df.setMinimumFractionDigits(30);
   1040         assertEquals("0.000000000000000000000000000000", df.format(0.0));
   1041         assertEquals("-0.000000000000000000000000000000", df.format(-0.0));
   1042         assertEquals("1.000000000000000000000000000000", df.format(1.0));
   1043         assertEquals("-1.000000000000000000000000000000", df.format(-1.0));
   1044     }
   1045 
   1046     public void test_formatDouble_withFieldPosition() {
   1047         new Support_DecimalFormat(
   1048                 "test_formatDLjava_lang_StringBufferLjava_text_FieldPosition")
   1049                 .t_format_with_FieldPosition();
   1050     }
   1051 
   1052     // This test serves as a regression test for Android's behavior.
   1053     // There are many patterns that produce different output from the RI but are sometimes the
   1054     // consequence of Android following the ICU DecimalFormat rules.
   1055     public void test_formatDouble_scientificNotation() {
   1056         FormatTester formatTester = new FormatTester();
   1057         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1058 
   1059         DecimalFormat df = new DecimalFormat("00.0#E0", dfs);
   1060         // ["00.0#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1061         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=2,
   1062         // maxFractionDigits=2,minIntegerDigits=2,minFractionDigits=1,grouping=false]
   1063         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1064         // Scientific notation => use significant digit logic
   1065         // '@' not present: Significant digits: Min: 1,
   1066         // Max: "min integer digits" (2) + "max fractional digits (2) == 4
   1067         formatTester.format(df, "00.0E0", 0.0);
   1068         formatTester.format(df, "10.0E-1", 1.0);
   1069         formatTester.format(df, "12.0E0", 12.0);
   1070         formatTester.format(df, "12.3E1", 123.0);
   1071         formatTester.format(df, "12.34E2", 1234.0);
   1072         formatTester.format(df, "12.35E3", 12346.0);
   1073         formatTester.format(df, "10.0E4", 99999.0);
   1074         formatTester.format(df, "12.0E-1", 1.2);
   1075         formatTester.format(df, "12.3E0", 12.3);
   1076         formatTester.format(df, "12.34E1", 123.4);
   1077         formatTester.format(df, "12.35E2", 1234.6);
   1078         formatTester.format(df, "10.0E3", 9999.9);
   1079         formatTester.format(df, "10.0E-2", 0.1);
   1080         formatTester.format(df, "12.0E-2", 0.12);
   1081         formatTester.format(df, "12.3E-2", 0.123);
   1082         formatTester.format(df, "12.34E-2", 0.1234);
   1083         formatTester.format(df, "12.35E-2", 0.12346);
   1084         formatTester.format(df, "10.0E-1", 0.99999);
   1085         formatTester.format(df, "-10.0E-1", -1.0);
   1086         formatTester.format(df, "-12.0E0", -12.0);
   1087         formatTester.format(df, "-12.3E1", -123.0);
   1088         formatTester.format(df, "-12.34E2", -1234.0);
   1089         formatTester.format(df, "-12.35E3", -12346.0);
   1090         formatTester.format(df, "-10.0E4", -99999.0);
   1091 
   1092         df = new DecimalFormat("#00.0##E0", dfs);
   1093         // ["#00.0##E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1094         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1095         // maxFractionDigits=3,minIntegerDigits=2,minFractionDigits=1,grouping=false]
   1096         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1097         // Scientific notation => use significant digit logic
   1098         // '@' not present: Significant digits: Min: 1,
   1099         // Max: "min integer digits" (2) + "max fractional digits (3) == 5
   1100         formatTester.format(df, "100E-3", 0.1);
   1101         formatTester.format(df, "120E-3", 0.12);
   1102         formatTester.format(df, "123E-3", 0.123);
   1103         formatTester.format(df, "123.4E-3", 0.1234);
   1104         formatTester.format(df, "123.46E-3", 0.1234567);
   1105         formatTester.format(df, "10E-3", 0.01);
   1106         formatTester.format(df, "12E-3", 0.012);
   1107         formatTester.format(df, "12.3E-3", 0.0123);
   1108         formatTester.format(df, "12.34E-3", 0.01234);
   1109         formatTester.format(df, "12.346E-3", 0.01234567);
   1110         formatTester.format(df, "1.0E-3", 0.001);
   1111         formatTester.format(df, "1.2E-3", 0.0012);
   1112         formatTester.format(df, "1.23E-3", 0.00123);
   1113         formatTester.format(df, "1.234E-3", 0.001234);
   1114         formatTester.format(df, "1.2346E-3", 0.001234567);
   1115         formatTester.format(df, "100E-6", 0.0001);
   1116         formatTester.format(df, "120E-6", 0.00012);
   1117         formatTester.format(df, "123E-6", 0.000123);
   1118         formatTester.format(df, "123.4E-6", 0.0001234);
   1119         formatTester.format(df, "123.46E-6", 0.0001234567);
   1120         formatTester.format(df, "0.0E0", 0.0);
   1121         formatTester.format(df, "1.0E0", 1.0);
   1122         formatTester.format(df, "12E0", 12.0);
   1123         formatTester.format(df, "123E0", 123.0);
   1124         formatTester.format(df, "1.234E3", 1234.0);
   1125         formatTester.format(df, "12.345E3", 12345.0);
   1126         formatTester.format(df, "123.46E3", 123456.0);
   1127         formatTester.format(df, "1.2346E6", 1234567.0);
   1128         formatTester.format(df, "12.346E6", 12345678.0);
   1129         formatTester.format(df, "100E6", 99999999.0);
   1130 
   1131         df = new DecimalFormat("#.0E0", dfs);
   1132         // ["#.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1133         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1134         // maxFractionDigits=1,minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1135         // Because maximum integer digit count is set: The exponent must be a multiple of it (1).
   1136         // Scientific notation => use significant digit logic
   1137         // '@' not present: Significant digits: Min: 1,
   1138         // Max: "min integer digits" (0) + "max fractional digits (1) == 1
   1139         formatTester.format(df, "0.0E0", 0.0);
   1140         formatTester.format(df, "1.0E0", 1.0);
   1141         formatTester.format(df, "1.0E1", 12.0);
   1142         formatTester.format(df, "1.0E2", 123.0);
   1143         formatTester.format(df, "1.0E3", 1234.0);
   1144         formatTester.format(df, "1.0E4", 9999.0);
   1145 
   1146         df = new DecimalFormat("0.E0", dfs);
   1147         // ["0.E0",isDecimalSeparatorAlwaysShown=true,groupingSize=0,multiplier=1,negativePrefix=-,
   1148         // negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,maxFractionDigits=0,
   1149         // minIntegerDigits=1,minFractionDigits=0,grouping=false]
   1150         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1151         // Scientific notation => use significant digit logic
   1152         // '@' not present: Significant digits: Min: 1,
   1153         // Max: "min integer digits" (1) + "max fractional digits (0) == 1
   1154         formatTester.format(df, "0.E0", 0.0);
   1155         formatTester.format(df, "1.E0", 1.0);
   1156         formatTester.format(df, "1.E1", 12.0);
   1157         formatTester.format(df, "1.E2", 123.0);
   1158         formatTester.format(df, "1.E3", 1234.0);
   1159         formatTester.format(df, "1.E4", 9999.0);
   1160 
   1161         df = new DecimalFormat("##0.00#E0", dfs);
   1162         // ["##0.00#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1163         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1164         // maxFractionDigits=3,minIntegerDigits=1,minFractionDigits=2,grouping=false]
   1165         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1166         // Scientific notation => use significant digit logic
   1167         // '@' not present: Significant digits: Min: 1,
   1168         // Max: "min integer digits" (1) + "max fractional digits (3) == 4
   1169         formatTester.format(df, "100E-3", 0.1);
   1170         formatTester.format(df, "123.5E-3", 0.1234567);
   1171         formatTester.format(df, "1.00E0", 0.9999999);
   1172         formatTester.format(df, "10.0E-3", 0.01);
   1173         formatTester.format(df, "12.35E-3", 0.01234567);
   1174         formatTester.format(df, "100E-3", 0.09999999);
   1175         formatTester.format(df, "1.00E-3", 0.001);
   1176         formatTester.format(df, "1.235E-3", 0.001234567);
   1177         formatTester.format(df, "10.0E-3", 0.009999999);
   1178         formatTester.format(df, "100E-6", 0.0001);
   1179         formatTester.format(df, "123.5E-6", 0.0001234567);
   1180         formatTester.format(df, "1.00E-3", 0.0009999999);
   1181 
   1182         df = new DecimalFormat("###0.00#E0", dfs);
   1183         // ["###0.00#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1184         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=4,
   1185         // maxFractionDigits=3,minIntegerDigits=1,minFractionDigits=2,grouping=false]
   1186         // Because maximum integer digit count is set: The exponent must be a multiple of it (4).
   1187         // Scientific notation => use significant digit logic
   1188         // '@' not present: Significant digits: Min: 1,
   1189         // Max: "min integer digits" (1) + "max fractional digits (3) == 4
   1190         formatTester.format(df, "1000E-4", 0.1);
   1191         formatTester.format(df, "1235E-4", 0.12345678);
   1192         formatTester.format(df, "1.00E0", 0.99999999);
   1193         formatTester.format(df, "100E-4", 0.01);
   1194         formatTester.format(df, "123.5E-4", 0.012345678);
   1195         formatTester.format(df, "1000E-4", 0.099999999);
   1196         formatTester.format(df, "10.0E-4", 0.001);
   1197         formatTester.format(df, "12.35E-4", 0.0012345678);
   1198         formatTester.format(df, "100E-4", 0.0099999999);
   1199         formatTester.format(df, "1.00E-4", 0.0001);
   1200         formatTester.format(df, "1.235E-4", 0.00012345678);
   1201         formatTester.format(df, "10.0E-4", 0.00099999999);
   1202         formatTester.format(df, "1000E-8", 0.00001);
   1203         formatTester.format(df, "1235E-8", 0.000012345678);
   1204         formatTester.format(df, "1.00E-4", 0.000099999999);
   1205 
   1206         df = new DecimalFormat("###0.0#E0", dfs);
   1207         // ["###0.0#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1208         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=4,
   1209         // maxFractionDigits=2,minIntegerDigits=1,minFractionDigits=1,grouping=false]
   1210         // Because maximum integer digit count is set: The exponent must be a multiple of it (4).
   1211         // Scientific notation => use significant digit logic
   1212         // '@' not present: Significant digits: Min: 1,
   1213         // Max: "min integer digits" (1) + "max fractional digits (2) == 3
   1214         formatTester.format(df, "1000E-4", 0.1);
   1215         formatTester.format(df, "1230E-4", 0.1234567);
   1216         formatTester.format(df, "1.0E0", 0.9999999);
   1217         formatTester.format(df, "100E-4", 0.01);
   1218         formatTester.format(df, "123E-4", 0.01234567);
   1219         formatTester.format(df, "1000E-4", 0.09999999);
   1220         formatTester.format(df, "10E-4", 0.001);
   1221         formatTester.format(df, "12.3E-4", 0.001234567);
   1222         formatTester.format(df, "100E-4", 0.009999999);
   1223         formatTester.format(df, "1.0E-4", 0.0001);
   1224         formatTester.format(df, "1.23E-4", 0.0001234567);
   1225         formatTester.format(df, "10E-4", 0.0009999999);
   1226         formatTester.format(df, "1000E-8", 0.00001);
   1227         formatTester.format(df, "1230E-8", 0.00001234567);
   1228         formatTester.format(df, "1.0E-4", 0.00009999999);
   1229 
   1230         df = new DecimalFormat("##0.0E0", dfs);
   1231         // ["##0.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1232         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1233         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=1,grouping=false]
   1234         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1235         // Scientific notation => use significant digit logic
   1236         // '@' not present: Significant digits: Min: 1,
   1237         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1238         formatTester.format(df, "0.0E0", 0.0);
   1239         formatTester.format(df, "1.0E0", 1.0);
   1240         formatTester.format(df, "12E0", 12.0);
   1241         formatTester.format(df, "120E0", 123.0);
   1242         formatTester.format(df, "1.2E3", 1234.0);
   1243         formatTester.format(df, "12E3", 12346.0);
   1244         formatTester.format(df, "100E3", 99999.0);
   1245         formatTester.format(df, "1.0E6", 999999.0);
   1246 
   1247         df = new DecimalFormat("0.#E0", dfs);
   1248         // ["0.#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1249         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1250         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=0,grouping=false]
   1251         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1252         // Scientific notation => use significant digit logic
   1253         // '@' not present: Significant digits: Min: 1,
   1254         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1255         formatTester.format(df, "0E0", 0.0);
   1256         formatTester.format(df, "1E0", 1.0);
   1257         formatTester.format(df, "1.2E1", 12.0);
   1258         formatTester.format(df, "1.2E2", 123.0);
   1259         formatTester.format(df, "1.2E3", 1234.0);
   1260         formatTester.format(df, "1E4", 9999.0);
   1261 
   1262         df = new DecimalFormat(".0E0", dfs);
   1263         // [".0E0",isDecimalSeparatorAlwaysShown=true,groupingSize=0,multiplier=1,negativePrefix=-,
   1264         // negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=0,maxFractionDigits=1,
   1265         // minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1266         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1267         // Scientific notation => use significant digit logic
   1268         // '@' not present: Significant digits: Min: 1,
   1269         // Max: "min integer digits" (0) + "max fractional digits (1) == 2
   1270         formatTester.format(df, ".0E0", 0.0);
   1271         formatTester.format(df, ".1E1", 1.0);
   1272         formatTester.format(df, ".1E2", 12.0);
   1273         formatTester.format(df, ".1E3", 123.0);
   1274         formatTester.format(df, ".1E4", 1234.0);
   1275         formatTester.format(df, ".1E5", 9999.0);
   1276 
   1277         formatTester.throwFailures();
   1278     }
   1279 
   1280     public void test_formatDouble_scientificNotationMinusZero() throws Exception {
   1281         FormatTester formatTester = new FormatTester();
   1282         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1283 
   1284         DecimalFormat df = new DecimalFormat("00.0#E0", dfs);
   1285         // ["00.0#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1286         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=2,
   1287         // maxFractionDigits=2,minIntegerDigits=2,minFractionDigits=1,grouping=false]
   1288         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1289         // Scientific notation => use significant digit logic
   1290         // '@' not present: Significant digits: Min: 1,
   1291         // Max: "min integer digits" (2) + "max fractional digits (2) == 4
   1292         formatTester.format(df, "-00.0E0", -0.0);
   1293 
   1294         df = new DecimalFormat("##0.0E0", dfs);
   1295         // ["##0.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1296         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1297         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=1,grouping=false]
   1298         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1299         // Scientific notation => use significant digit logic
   1300         // '@' not present: Significant digits: Min: 1,
   1301         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1302         formatTester.format(df, "-0.0E0", -0.0);
   1303 
   1304         df = new DecimalFormat("#.0E0", dfs);
   1305         // ["#.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1306         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1307         // maxFractionDigits=1,minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1308         // Because maximum integer digit count is set: The exponent must be a multiple of it (1).
   1309         // Scientific notation => use significant digit logic
   1310         // '@' not present: Significant digits: Min: 1,
   1311         // Max: "min integer digits" (0) + "max fractional digits (1) == 2
   1312         formatTester.format(df, "-0.0E0", -0.0);
   1313 
   1314         df = new DecimalFormat("0.#E0", dfs);
   1315         // ["0.#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1316         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1317         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=0,grouping=false]
   1318         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1319         // Scientific notation => use significant digit logic
   1320         // '@' not present: Significant digits: Min: 1,
   1321         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1322         formatTester.format(df, "-0E0", -0.0);
   1323 
   1324         df = new DecimalFormat(".0E0", dfs);
   1325         // [".0E0",isDecimalSeparatorAlwaysShown=true,groupingSize=0,multiplier=1,negativePrefix=-,
   1326         // negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=0,maxFractionDigits=1,
   1327         // minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1328         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1329         // Scientific notation => use significant digit logic
   1330         // '@' not present: Significant digits: Min: 1,
   1331         // Max: "min integer digits" (0) + "max fractional digits (1) == 1
   1332         formatTester.format(df, "-.0E0", -0.0);
   1333 
   1334         formatTester.throwFailures();
   1335     }
   1336 
   1337     public void test_formatLong_maximumIntegerDigits() {
   1338         DecimalFormat df = new DecimalFormat("###0.##");
   1339         df.setMaximumIntegerDigits(2);
   1340         assertEquals(2, df.getMaximumIntegerDigits());
   1341         assertEquals("34", df.format(1234));
   1342         df.setMinimumIntegerDigits(4);
   1343         assertEquals(4, df.getMaximumIntegerDigits());
   1344         assertEquals("0026", df.format(26));
   1345     }
   1346 
   1347     public void test_formatLong_minimumIntegerDigits() {
   1348         DecimalFormat df = new DecimalFormat("###0.##", new DecimalFormatSymbols(Locale.US));
   1349         df.setMinimumIntegerDigits(3);
   1350         assertEquals(3, df.getMinimumIntegerDigits());
   1351         assertEquals("012", df.format(12));
   1352         df.setMaximumIntegerDigits(2);
   1353         assertEquals(2, df.getMinimumIntegerDigits());
   1354         assertEquals("00.7", df.format(0.7));
   1355     }
   1356 
   1357     // See also the _formatDouble tests. This tests a subset of patterns / values.
   1358     public void test_formatLong_scientificNotation() {
   1359         FormatTester formatTester = new FormatTester();
   1360         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1361 
   1362         DecimalFormat df = new DecimalFormat("00.0#E0", dfs);
   1363         // ["00.0#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1364         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=2,
   1365         // maxFractionDigits=2,minIntegerDigits=2,minFractionDigits=1,grouping=false]
   1366         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1367         // Scientific notation => use significant digit logic
   1368         // '@' not present: Significant digits: Min: 1,
   1369         // Max: "min integer digits" (2) + "max fractional digits (2) == 4
   1370         formatTester.format(df, "00.0E0", 0);
   1371         formatTester.format(df, "10.0E-1", 1);
   1372         formatTester.format(df, "12.0E0", 12);
   1373         formatTester.format(df, "12.3E1", 123);
   1374         formatTester.format(df, "12.34E2", 1234);
   1375         formatTester.format(df, "12.35E3", 12346);
   1376         formatTester.format(df, "10.0E4", 99999);
   1377         formatTester.format(df, "-10.0E-1", -1);
   1378         formatTester.format(df, "-12.0E0", -12);
   1379         formatTester.format(df, "-12.3E1", -123);
   1380         formatTester.format(df, "-12.34E2", -1234);
   1381         formatTester.format(df, "-12.35E3", -12346);
   1382         formatTester.format(df, "-10.0E4", -99999);
   1383 
   1384         df = new DecimalFormat("##0.0E0", dfs);
   1385         // ["##0.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1386         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1387         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=1,grouping=false]
   1388         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1389         // Scientific notation => use significant digit logic
   1390         // '@' not present: Significant digits: Min: 1,
   1391         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1392         formatTester.format(df, "0.0E0", 0);
   1393         formatTester.format(df, "1.0E0", 1);
   1394         formatTester.format(df, "12E0", 12);
   1395         formatTester.format(df, "120E0", 123);
   1396         formatTester.format(df, "1.2E3", 1234);
   1397         formatTester.format(df, "12E3", 12346);
   1398         formatTester.format(df, "100E3", 99999);
   1399         formatTester.format(df, "1.0E6", 999999);
   1400 
   1401         df = new DecimalFormat("#00.0##E0", dfs);
   1402         // ["##0.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1403         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=3,
   1404         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=1,grouping=false]
   1405         // Because maximum integer digit count is set: The exponent must be a multiple of it (3).
   1406         // Scientific notation => use significant digit logic
   1407         // '@' not present: Significant digits: Min: 1,
   1408         // Max: "min integer digits" (2) + "max fractional digits (3) == 5
   1409         formatTester.format(df, "0.0E0", 0);
   1410         formatTester.format(df, "1.0E0", 1);
   1411         formatTester.format(df, "12E0", 12);
   1412         formatTester.format(df, "123E0", 123);
   1413         formatTester.format(df, "1.234E3", 1234);
   1414         formatTester.format(df, "12.345E3", 12345);
   1415         formatTester.format(df, "123.46E3", 123456);
   1416         formatTester.format(df, "1.2346E6", 1234567);
   1417         formatTester.format(df, "12.346E6", 12345678);
   1418         formatTester.format(df, "100E6", 99999999);
   1419 
   1420         df = new DecimalFormat("#.0E0", dfs);
   1421         // ["#.0E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1422         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1423         // maxFractionDigits=1,minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1424         // Because maximum integer digit count is set: The exponent must be a multiple of it (1).
   1425         // Scientific notation => use significant digit logic
   1426         // '@' not present: Significant digits: Min: 1,
   1427         // Max: "min integer digits" (0) + "max fractional digits (1) == 1
   1428         formatTester.format(df, "0.0E0", 0);
   1429         formatTester.format(df, "1.0E0", 1);
   1430         formatTester.format(df, "1.0E1", 12);
   1431         formatTester.format(df, "1.0E2", 123);
   1432         formatTester.format(df, "1.0E3", 1234);
   1433         formatTester.format(df, "1.0E4", 9999);
   1434 
   1435         df = new DecimalFormat("0.#E0", dfs);
   1436         // ["0.#E0",isDecimalSeparatorAlwaysShown=false,groupingSize=0,multiplier=1,
   1437         // negativePrefix=-,negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=1,
   1438         // maxFractionDigits=1,minIntegerDigits=1,minFractionDigits=0,grouping=false]
   1439         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1440         // Scientific notation => use significant digit logic
   1441         // '@' not present: Significant digits: Min: 1,
   1442         // Max: "min integer digits" (1) + "max fractional digits (1) == 2
   1443         formatTester.format(df, "0E0", 0);
   1444         formatTester.format(df, "1E0", 1);
   1445         formatTester.format(df, "1.2E1", 12);
   1446         formatTester.format(df, "1.2E2", 123);
   1447         formatTester.format(df, "1.2E3", 1234);
   1448         formatTester.format(df, "1E4", 9999);
   1449 
   1450         df = new DecimalFormat(".0E0", dfs);
   1451         // [".0E0",isDecimalSeparatorAlwaysShown=true,groupingSize=0,multiplier=1,negativePrefix=-,
   1452         // negativeSuffix=,positivePrefix=,positiveSuffix=,maxIntegerDigits=0,maxFractionDigits=1,
   1453         // minIntegerDigits=0,minFractionDigits=1,grouping=false]
   1454         // Because maximum integer digit was not explicitly set: The exponent can be any integer.
   1455         // Scientific notation => use significant digit logic
   1456         // '@' not present: Significant digits: Min: 1,
   1457         // Max: "min integer digits" (0) + "max fractional digits (1) == 1
   1458         formatTester.format(df, ".0E0", 0);
   1459         formatTester.format(df, ".1E1", 1);
   1460         formatTester.format(df, ".1E2", 12);
   1461         formatTester.format(df, ".1E3", 123);
   1462         formatTester.format(df, ".1E4", 1234);
   1463         formatTester.format(df, ".1E5", 9999);
   1464 
   1465         formatTester.throwFailures();
   1466     }
   1467 
   1468     // Demonstrates that fraction digit rounding occurs as expected with 1, 10 and 14 fraction
   1469     // digits, using numbers that are well within the precision of IEEE 754.
   1470     public void test_formatDouble_maxFractionDigits() {
   1471         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1472         DecimalFormat format = new DecimalFormat("#0.#", dfs);
   1473         format.setGroupingUsed(false);
   1474         format.setMaximumIntegerDigits(400);
   1475         format.setMaximumFractionDigits(1);
   1476 
   1477         assertEquals("1", format.format(0.99));
   1478         assertEquals("1", format.format(0.95));
   1479         assertEquals("0.9", format.format(0.94));
   1480         assertEquals("0.9", format.format(0.90));
   1481 
   1482         assertEquals("0.2", format.format(0.19));
   1483         assertEquals("0.2", format.format(0.15));
   1484         assertEquals("0.1", format.format(0.14));
   1485         assertEquals("0.1", format.format(0.10));
   1486 
   1487         format.setMaximumFractionDigits(10);
   1488         assertEquals("1", format.format(0.99999999999));
   1489         assertEquals("1", format.format(0.99999999995));
   1490         assertEquals("0.9999999999", format.format(0.99999999994));
   1491         assertEquals("0.9999999999", format.format(0.99999999990));
   1492 
   1493         assertEquals("0.1111111112", format.format(0.11111111119));
   1494         assertEquals("0.1111111112", format.format(0.11111111115));
   1495         assertEquals("0.1111111111", format.format(0.11111111114));
   1496         assertEquals("0.1111111111", format.format(0.11111111110));
   1497 
   1498         format.setMaximumFractionDigits(14);
   1499         assertEquals("1", format.format(0.999999999999999));
   1500         assertEquals("1", format.format(0.999999999999995));
   1501         assertEquals("0.99999999999999", format.format(0.999999999999994));
   1502         assertEquals("0.99999999999999", format.format(0.999999999999990));
   1503 
   1504         assertEquals("0.11111111111112", format.format(0.111111111111119));
   1505         assertEquals("0.11111111111112", format.format(0.111111111111115));
   1506         assertEquals("0.11111111111111", format.format(0.111111111111114));
   1507         assertEquals("0.11111111111111", format.format(0.111111111111110));
   1508     }
   1509 
   1510     // This demonstrates rounding at the 15th decimal digit. By setting the maximum fraction digits
   1511     // we force rounding at a point just below the full IEEE 754 precision. IEEE 754 should be
   1512     // precise to just above 15 decimal digits.
   1513     // df.format() with no limits always emits up to 16 decimal digits, slightly above what IEEE 754
   1514     // can store precisely.
   1515     public void test_formatDouble_roundingTo15Digits() throws Exception {
   1516         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1517         DecimalFormat df = new DecimalFormat("#.#", dfs);
   1518         df.setMaximumIntegerDigits(400);
   1519         df.setGroupingUsed(false);
   1520 
   1521         df.setMaximumFractionDigits(0);
   1522         assertEquals("1000000000000000", df.format(999999999999999.9));
   1523         df.setMaximumFractionDigits(1);
   1524         assertEquals("100000000000000", df.format(99999999999999.99));
   1525         df.setMaximumFractionDigits(2);
   1526         assertEquals("10000000000000", df.format(9999999999999.999));
   1527         df.setMaximumFractionDigits(3);
   1528         assertEquals("1000000000000", df.format(999999999999.9999));
   1529         df.setMaximumFractionDigits(4);
   1530         assertEquals("100000000000", df.format(99999999999.99999));
   1531         df.setMaximumFractionDigits(5);
   1532         assertEquals("10000000000", df.format(9999999999.999999));
   1533         df.setMaximumFractionDigits(6);
   1534         assertEquals("1000000000", df.format(999999999.9999999));
   1535         df.setMaximumFractionDigits(7);
   1536         assertEquals("100000000", df.format(99999999.99999999));
   1537         df.setMaximumFractionDigits(8);
   1538         assertEquals("10000000", df.format(9999999.999999999));
   1539         df.setMaximumFractionDigits(9);
   1540         assertEquals("1000000", df.format(999999.9999999999));
   1541         df.setMaximumFractionDigits(10);
   1542         assertEquals("100000", df.format(99999.99999999999));
   1543         df.setMaximumFractionDigits(11);
   1544         assertEquals("10000", df.format(9999.999999999999));
   1545         df.setMaximumFractionDigits(12);
   1546         assertEquals("1000", df.format(999.9999999999999));
   1547         df.setMaximumFractionDigits(13);
   1548         assertEquals("100", df.format(99.99999999999999));
   1549         df.setMaximumFractionDigits(14);
   1550         assertEquals("10", df.format(9.999999999999999));
   1551         df.setMaximumFractionDigits(15);
   1552         assertEquals("1", df.format(0.9999999999999999));
   1553     }
   1554 
   1555     // This checks formatting over most of the representable IEEE 754 range using a formatter that
   1556     // should be performing no lossy rounding.
   1557     // It checks that the formatted double can be parsed to get the original double.
   1558     // IEEE 754 can represent values from (decimal) ~2.22507E308 to ~1.79769E308 to full precision.
   1559     // Close to zero it can go down to 4.94066E-324 with a loss of precision.
   1560     // At the extremes of the double range this test will not be testing doubles that exactly
   1561     // represent powers of 10. The test is only interested in whether the doubles closest
   1562     // to powers of 10 that can be represented can each be turned into a string and read back again
   1563     // to arrive at the original double.
   1564     public void test_formatDouble_wideRange() throws Exception {
   1565         for (int i = -324; i < 309; i++) {
   1566             // Generate a decimal number we are interested in: 1 * 10^i
   1567             String stringForm = "1e" + i;
   1568             BigDecimal bigDecimal = new BigDecimal(stringForm);
   1569 
   1570             // Obtain the nearest double representation of the decimal number.
   1571             // This is lossy because going from BigDecimal -> double is inexact, but we should
   1572             // arrive at a number that is as close as possible to the decimal value. We assume that
   1573             // BigDecimal is capable of this, but it is not critical to this test if it gets it a
   1574             // little wrong, though it may mean we are testing a double value different from the one
   1575             // we thought we were.
   1576             double d = bigDecimal.doubleValue();
   1577 
   1578             assertDecimalFormatIsLossless(d);
   1579         }
   1580     }
   1581 
   1582     // This test is a regression test for http://b/17656132.
   1583     // It checks hand-picked values can be formatted and parsed to get the original double.
   1584     // The formatter as configured should perform no rounding.
   1585     public void test_formatDouble_roundingProblemCases() throws Exception {
   1586         // Most of the double literals below are not exactly representable in IEEE 754 but
   1587         // it should not matter to this test.
   1588         assertDecimalFormatIsLossless(999999999999999.9);
   1589         assertDecimalFormatIsLossless(99999999999999.99);
   1590         assertDecimalFormatIsLossless(9999999999999.999);
   1591         assertDecimalFormatIsLossless(999999999999.9999);
   1592         assertDecimalFormatIsLossless(99999999999.99999);
   1593         assertDecimalFormatIsLossless(9999999999.999999);
   1594         assertDecimalFormatIsLossless(999999999.9999999);
   1595         assertDecimalFormatIsLossless(99999999.99999999);
   1596         assertDecimalFormatIsLossless(9999999.999999999);
   1597         assertDecimalFormatIsLossless(999999.9999999999);
   1598         assertDecimalFormatIsLossless(99999.99999999999);
   1599         assertDecimalFormatIsLossless(9999.999999999999);
   1600         assertDecimalFormatIsLossless(999.9999999999999);
   1601         assertDecimalFormatIsLossless(99.99999999999999);
   1602         assertDecimalFormatIsLossless(9.999999999999999);
   1603         assertDecimalFormatIsLossless(0.9999999999999999);
   1604     }
   1605 
   1606     // This test checks hand-picked values can be formatted and parsed to get the original double.
   1607     // The formatter as configured should perform no rounding.
   1608     // These numbers are not affected by http://b/17656132.
   1609     public void test_formatDouble_varyingScale() throws Exception {
   1610         // Most of the double literals below are not exactly representable in IEEE 754 but
   1611         // it should not matter to this test.
   1612 
   1613         assertDecimalFormatIsLossless(999999999999999.);
   1614 
   1615         assertDecimalFormatIsLossless(123456789012345.);
   1616         assertDecimalFormatIsLossless(12345678901234.5);
   1617         assertDecimalFormatIsLossless(1234567890123.25);
   1618         assertDecimalFormatIsLossless(999999999999.375);
   1619         assertDecimalFormatIsLossless(99999999999.0625);
   1620         assertDecimalFormatIsLossless(9999999999.03125);
   1621         assertDecimalFormatIsLossless(999999999.015625);
   1622         assertDecimalFormatIsLossless(99999999.0078125);
   1623         assertDecimalFormatIsLossless(9999999.00390625);
   1624         assertDecimalFormatIsLossless(999999.001953125);
   1625         assertDecimalFormatIsLossless(9999.00048828125);
   1626         assertDecimalFormatIsLossless(999.000244140625);
   1627         assertDecimalFormatIsLossless(99.0001220703125);
   1628         assertDecimalFormatIsLossless(9.00006103515625);
   1629         assertDecimalFormatIsLossless(0.000030517578125);
   1630     }
   1631 
   1632     private static void assertDecimalFormatIsLossless(double d) throws Exception {
   1633         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1634         DecimalFormat format = new DecimalFormat("#0.#", dfs);
   1635         format.setGroupingUsed(false);
   1636         format.setMaximumIntegerDigits(400);
   1637         format.setMaximumFractionDigits(400);
   1638 
   1639         // Every floating point binary can be represented exactly in decimal if you have enough
   1640         // digits. This shows the value actually being tested.
   1641         String testId = "decimalValue: " + new BigDecimal(d);
   1642 
   1643         // As a sanity check we try out parseDouble() with the string generated by
   1644         // Double.toString(). Strictly speaking Double.toString() is probably not guaranteed to be
   1645         // lossless, but in reality it probably is, or at least is close enough.
   1646         assertDoubleEqual(
   1647                 testId + " failed parseDouble(toString()) sanity check",
   1648                 d, Double.parseDouble(Double.toString(d)));
   1649 
   1650         // Format the number: If this is lossy it is a problem. We are trying to check that it
   1651         // doesn't lose any unnecessary precision.
   1652         String result = format.format(d);
   1653 
   1654         // Here we use Double.parseDouble() which should able to parse a number we know was
   1655         // representable as a double into the original double. If parseDouble() is not implemented
   1656         // correctly the test is invalid.
   1657         double doubleParsed = Double.parseDouble(result);
   1658         assertDoubleEqual(testId + " (format() produced " + result + ")",
   1659                 d, doubleParsed);
   1660 
   1661         // For completeness we try to parse using the formatter too. If this fails but the format
   1662         // above didn't it may be a problem with parse(), or with format() that we didn't spot.
   1663         assertDoubleEqual(testId + " failed parse(format()) check",
   1664                 d, format.parse(result).doubleValue());
   1665     }
   1666 
   1667     private static void assertDoubleEqual(String message, double d, double doubleParsed) {
   1668         assertEquals(message,
   1669                 createPrintableDouble(d),createPrintableDouble(doubleParsed));
   1670     }
   1671 
   1672     private static String createPrintableDouble(double d) {
   1673         return Double.toString(d) + "(" + Long.toHexString(Double.doubleToRawLongBits(d)) + ")";
   1674     }
   1675 
   1676     // Concise demonstration of http://b/17656132 using hard-coded expected values.
   1677     public void test_formatDouble_bug17656132() {
   1678         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   1679         DecimalFormat df = new DecimalFormat("#0.#", dfs);
   1680         df.setGroupingUsed(false);
   1681         df.setMaximumIntegerDigits(400);
   1682         df.setMaximumFractionDigits(400);
   1683 
   1684         // The expected values below come from the RI and are correct 16 decimal digit
   1685         // representations of the formatted value. Android does something different.
   1686         // The decimal value given in each comment is the actual double value as represented by
   1687         // IEEE 754. See new BigDecimal(double).
   1688 
   1689         // double: 999999999999999.9 is decimal 999999999999999.875
   1690         assertEquals("999999999999999.9", df.format(999999999999999.9));
   1691         // double: 99999999999999.98 is decimal 99999999999999.984375
   1692         assertEquals("99999999999999.98", df.format(99999999999999.98));
   1693         // double 9999999999999.998 is decimal 9999999999999.998046875
   1694         assertEquals("9999999999999.998", df.format(9999999999999.998));
   1695         // double 999999999999.9999 is decimal 999999999999.9998779296875
   1696         assertEquals("999999999999.9999", df.format(999999999999.9999));
   1697         // double 99999999999.99998 is decimal 99999999999.9999847412109375
   1698         assertEquals("99999999999.99998", df.format(99999999999.99998));
   1699         // double 9999999999.999998 is decimal 9999999999.9999980926513671875
   1700         assertEquals("9999999999.999998", df.format(9999999999.999998));
   1701         // double 1E23 is decimal 99999999999999991611392
   1702         assertEquals("99999999999999990000000", df.format(1E23));
   1703     }
   1704 
   1705     public void test_getDecimalFormatSymbols() {
   1706         DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
   1707         DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
   1708         assertNotSame(dfs, df.getDecimalFormatSymbols());
   1709     }
   1710 
   1711     public void test_getCurrency() {
   1712         Currency currK = Currency.getInstance("KRW");
   1713         Currency currX = Currency.getInstance("XXX");
   1714         Currency currE = Currency.getInstance("EUR");
   1715 
   1716         DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(new Locale("ko", "KR"));
   1717         assertTrue("Test1: Returned incorrect currency", df.getCurrency() == currK);
   1718 
   1719         df = (DecimalFormat) NumberFormat.getCurrencyInstance(new Locale("", "KR"));
   1720         assertTrue("Test2: Returned incorrect currency", df.getCurrency() == currK);
   1721 
   1722         df = (DecimalFormat) NumberFormat.getCurrencyInstance(new Locale("ko", ""));
   1723         assertTrue("Test3: Returned incorrect currency", df.getCurrency() == currX);
   1724 
   1725         df = (DecimalFormat) NumberFormat.getCurrencyInstance(new Locale("fr", "FR"));
   1726         assertTrue("Test4: Returned incorrect currency", df.getCurrency() == currE);
   1727 
   1728         // Regression for HARMONY-1351
   1729         df = (DecimalFormat) NumberFormat.getCurrencyInstance(new Locale("QWERTY"));
   1730         assertTrue("Test5: Returned incorrect currency", df.getCurrency() == currX);
   1731 
   1732         // JDK fails these tests since it doesn't have the PREEURO variant
   1733         // df = (DecimalFormat)NumberFormat.getCurrencyInstance(new Locale("fr",
   1734         // "FR","PREEURO"));
   1735         // assertTrue("Test5: Returned incorrect currency", df.getCurrency() ==
   1736         // currF);
   1737     }
   1738 
   1739     public void test_getGroupingSize() {
   1740         DecimalFormat df = new DecimalFormat("###0.##");
   1741         assertEquals("Wrong unset size", 0, df.getGroupingSize());
   1742         df = new DecimalFormat("#,##0.##");
   1743         assertEquals("Wrong set size", 3, df.getGroupingSize());
   1744         df = new DecimalFormat("#,###,###0.##");
   1745         assertEquals("Wrong multiple set size", 4, df.getGroupingSize());
   1746     }
   1747 
   1748     public void test_getMultiplier() {
   1749         final int defaultMultiplier = 1;
   1750         DecimalFormat form = (DecimalFormat) NumberFormat.getInstance(Locale.US);
   1751         assertEquals(defaultMultiplier, form.getMultiplier());
   1752 
   1753         DecimalFormat df = new DecimalFormat("###0.##");
   1754         assertEquals("Wrong unset multiplier", 1, df.getMultiplier());
   1755         df = new DecimalFormat("###0.##%");
   1756         assertEquals("Wrong percent multiplier", 100, df.getMultiplier());
   1757         df = new DecimalFormat("###0.##\u2030");
   1758         assertEquals("Wrong mille multiplier", 1000, df.getMultiplier());
   1759     }
   1760 
   1761     public void test_isDecimalSeparatorAlwaysShown() {
   1762         DecimalFormat df = new DecimalFormat("###0.##");
   1763         assertTrue("Wrong unset value", !df.isDecimalSeparatorAlwaysShown());
   1764         df = new DecimalFormat("###0.00");
   1765         assertTrue("Wrong unset2 value", !df.isDecimalSeparatorAlwaysShown());
   1766         df = new DecimalFormat("###0.");
   1767         assertTrue("Wrong set value", df.isDecimalSeparatorAlwaysShown());
   1768     }
   1769 
   1770     public void test_parse_withParsePosition() {
   1771         DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ENGLISH);
   1772         ParsePosition pos = new ParsePosition(0);
   1773         Number result = format.parse("9223372036854775807", pos);
   1774         assertTrue("Wrong result type for Long.MAX_VALUE", result.getClass() == Long.class);
   1775         assertTrue("Wrong result Long.MAX_VALUE", result.longValue() == Long.MAX_VALUE);
   1776         pos = new ParsePosition(0);
   1777         result = format.parse("-9223372036854775808", pos);
   1778         assertTrue("Wrong result type for Long.MIN_VALUE", result.getClass() == Long.class);
   1779         assertTrue("Wrong result Long.MIN_VALUE: " + result.longValue(),
   1780                 result.longValue() == Long.MIN_VALUE);
   1781         pos = new ParsePosition(0);
   1782         result = format.parse("9223372036854775808", pos);
   1783         assertTrue("Wrong result type for Long.MAX_VALUE+1", result.getClass() == Double.class);
   1784         assertTrue("Wrong result Long.MAX_VALUE + 1",
   1785                 result.doubleValue() == (double) Long.MAX_VALUE + 1);
   1786         pos = new ParsePosition(0);
   1787         result = format.parse("-9223372036854775809", pos);
   1788         assertTrue("Wrong result type for Long.MIN_VALUE+1", result.getClass() == Double.class);
   1789         assertTrue("Wrong result Long.MIN_VALUE - 1",
   1790                 result.doubleValue() == (double) Long.MIN_VALUE - 1);
   1791 
   1792         pos = new ParsePosition(0);
   1793         result = format.parse("18446744073709551629", pos);
   1794         assertTrue("Wrong result type for overflow", result.getClass() == Double.class);
   1795         assertTrue("Wrong result for overflow", result.doubleValue() == 18446744073709551629d);
   1796 
   1797         pos = new ParsePosition(0);
   1798         result = format.parse("42325917317067571199", pos);
   1799         assertTrue("Wrong result type for overflow a: " + result,
   1800                 result.getClass() == Double.class);
   1801         assertTrue("Wrong result for overflow a: " + result,
   1802                 result.doubleValue() == 42325917317067571199d);
   1803         pos = new ParsePosition(0);
   1804         result = format.parse("4232591731706757119E1", pos);
   1805         assertTrue("Wrong result type for overflow b: " + result,
   1806                 result.getClass() == Double.class);
   1807         assertTrue("Wrong result for overflow b: " + result,
   1808                 result.doubleValue() == 42325917317067571190d);
   1809         pos = new ParsePosition(0);
   1810         result = format.parse(".42325917317067571199E20", pos);
   1811         assertTrue("Wrong result type for overflow c: " + result,
   1812                 result.getClass() == Double.class);
   1813         assertTrue("Wrong result for overflow c: " + result,
   1814                 result.doubleValue() == 42325917317067571199d);
   1815         pos = new ParsePosition(0);
   1816         result = format.parse("922337203685477580.9E1", pos);
   1817         assertTrue("Wrong result type for overflow d: " + result,
   1818                 result.getClass() == Double.class);
   1819         assertTrue("Wrong result for overflow d: " + result,
   1820                 result.doubleValue() == 9223372036854775809d);
   1821         pos = new ParsePosition(0);
   1822         result = format.parse("9.223372036854775809E18", pos);
   1823         assertTrue("Wrong result type for overflow e: " + result,
   1824                 result.getClass() == Double.class);
   1825         assertTrue("Wrong result for overflow e: " + result,
   1826                 result.doubleValue() == 9223372036854775809d);
   1827     }
   1828 
   1829     public void test_parse_withMultiplier() {
   1830         DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ENGLISH);
   1831         Number result;
   1832 
   1833         format.setMultiplier(100);
   1834         result = format.parse("9223372036854775807", new ParsePosition(0));
   1835         assertEquals("Wrong result type multiplier 100: " + result, Double.class,
   1836                 result.getClass());
   1837         assertEquals("Wrong result for multiplier 100: " + result,
   1838                 92233720368547758.07d, result.doubleValue());
   1839 
   1840         format.setMultiplier(1000);
   1841         result = format.parse("9223372036854775807", new ParsePosition(0));
   1842         assertEquals("Wrong result type multiplier 1000: " + result, Double.class,
   1843                 result.getClass());
   1844         assertEquals("Wrong result for multiplier 1000: " + result,
   1845                 9223372036854775.807d, result.doubleValue());
   1846 
   1847         format.setMultiplier(10000);
   1848         result = format.parse("9223372036854775807", new ParsePosition(0));
   1849         assertEquals("Wrong result type multiplier 10000: " + result,
   1850                 Double.class, result.getClass());
   1851         assertEquals("Wrong result for multiplier 10000: " + result,
   1852                 922337203685477.5807d, result.doubleValue());
   1853     }
   1854 
   1855     public void test_setDecimalFormatSymbols() {
   1856         DecimalFormat df = new DecimalFormat("###0.##");
   1857         DecimalFormatSymbols dfs = new DecimalFormatSymbols();
   1858         dfs.setDecimalSeparator('@');
   1859         df.setDecimalFormatSymbols(dfs);
   1860         assertTrue("Not set", df.getDecimalFormatSymbols().equals(dfs));
   1861         assertEquals("Symbols not used", "1@2", df.format(1.2));
   1862 
   1863         // The returned symbols may be cloned in two spots
   1864         // 1. When set
   1865         // 2. When returned
   1866         DecimalFormat format = new DecimalFormat();
   1867         DecimalFormatSymbols symbols = new DecimalFormatSymbols();
   1868         format.setDecimalFormatSymbols(symbols);
   1869         DecimalFormatSymbols symbolsOut = format.getDecimalFormatSymbols();
   1870         assertNotSame(symbols, symbolsOut);
   1871     }
   1872 
   1873     public void test_setDecimalSeparatorAlwaysShown() {
   1874         DecimalFormat df = new DecimalFormat("###0.##", new DecimalFormatSymbols(Locale.US));
   1875         assertEquals("Wrong default result", "5", df.format(5));
   1876         df.setDecimalSeparatorAlwaysShown(true);
   1877         assertTrue("Not set", df.isDecimalSeparatorAlwaysShown());
   1878         assertEquals("Wrong set result", "7.", df.format(7));
   1879     }
   1880 
   1881     public void test_setCurrency() {
   1882         Locale locale = Locale.CANADA;
   1883         DecimalFormat df = ((DecimalFormat) NumberFormat.getCurrencyInstance(locale));
   1884 
   1885         try {
   1886             df.setCurrency(null);
   1887             fail("Expected NullPointerException");
   1888         } catch (NullPointerException e) {
   1889         }
   1890 
   1891         Currency currency = Currency.getInstance("AED");
   1892         df.setCurrency(currency);
   1893         assertTrue("Returned incorrect currency", currency == df.getCurrency());
   1894         assertEquals("Returned incorrect currency symbol", currency.getSymbol(locale),
   1895                 df.getDecimalFormatSymbols().getCurrencySymbol());
   1896         assertEquals("Returned incorrect international currency symbol", currency.getCurrencyCode(),
   1897                 df.getDecimalFormatSymbols().getInternationalCurrencySymbol());
   1898     }
   1899 
   1900     public void test_setGroupingSize() {
   1901         DecimalFormat df = new DecimalFormat("###0.##", new DecimalFormatSymbols(Locale.ENGLISH));
   1902         df.setGroupingUsed(true);
   1903         df.setGroupingSize(2);
   1904         assertEquals("Value not set", 2, df.getGroupingSize());
   1905         String result = df.format(123);
   1906         assertTrue("Invalid format:" + result, result.equals("1,23"));
   1907     }
   1908 
   1909     public void testSerializationSelf() throws Exception {
   1910         SerializationTest.verifySelf(new DecimalFormat());
   1911     }
   1912 
   1913     public void testSerializationHarmonyRICompatible() throws Exception {
   1914         NumberFormat nf = NumberFormat.getInstance(Locale.FRANCE);
   1915 
   1916         DecimalFormat df = null;
   1917         if (!(nf instanceof DecimalFormat)) {
   1918             throw new Error("This NumberFormat is not a DecimalFormat");
   1919 
   1920         }
   1921         df = (DecimalFormat) nf;
   1922 
   1923         ObjectInputStream oinput = null;
   1924 
   1925         DecimalFormat deserializedDF = null;
   1926 
   1927         try {
   1928             oinput = new ObjectInputStream(getClass().getResource(
   1929                     "/serialization/org/apache/harmony/tests/java/text/DecimalFormat.ser")
   1930                     .openStream());
   1931             deserializedDF = (DecimalFormat) oinput.readObject();
   1932         } finally {
   1933             try {
   1934                 if (null != oinput) {
   1935                     oinput.close();
   1936                 }
   1937             } catch (Exception e) {
   1938                 // ignore
   1939             }
   1940         }
   1941 
   1942         assertEquals(df.getNegativePrefix(), deserializedDF.getNegativePrefix());
   1943         assertEquals(df.getNegativeSuffix(), deserializedDF.getNegativeSuffix());
   1944         assertEquals(df.getPositivePrefix(), deserializedDF.getPositivePrefix());
   1945         assertEquals(df.getPositiveSuffix(), deserializedDF.getPositiveSuffix());
   1946         assertEquals(df.getCurrency(), deserializedDF.getCurrency());
   1947 
   1948         DecimalFormatSymbolsTest.assertDecimalFormatSymbolsRIFrance(
   1949                 deserializedDF.getDecimalFormatSymbols());
   1950 
   1951         assertEquals(df.getGroupingSize(), df.getGroupingSize());
   1952         assertEquals(df.getMaximumFractionDigits(), deserializedDF
   1953                 .getMaximumFractionDigits());
   1954 
   1955         assertEquals(df.getMaximumIntegerDigits(), deserializedDF
   1956                 .getMaximumIntegerDigits());
   1957 
   1958         assertEquals(df.getMinimumFractionDigits(), deserializedDF
   1959                 .getMinimumFractionDigits());
   1960         assertEquals(df.getMinimumIntegerDigits(), deserializedDF
   1961                 .getMinimumIntegerDigits());
   1962         assertEquals(df.getMultiplier(), deserializedDF.getMultiplier());
   1963 
   1964         // Deliberately omitted this assertion. Since different data resource
   1965         // will cause the assertion fail.
   1966         // assertEquals(df, deserializedDF);
   1967 
   1968     }
   1969 
   1970     public void test_parse_infinityBigDecimalFalse() {
   1971         // Regression test for HARMONY-106
   1972         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();
   1973         DecimalFormatSymbols symbols = new DecimalFormatSymbols();
   1974         Number number = format.parse(symbols.getInfinity(),
   1975                 new ParsePosition(0));
   1976         assertTrue(number instanceof Double);
   1977         assertTrue(Double.isInfinite(number.doubleValue()));
   1978     }
   1979 
   1980     public void test_parse_minusInfinityBigDecimalFalse() {
   1981         // Regression test for HARMONY-106
   1982         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();
   1983         DecimalFormatSymbols symbols = new DecimalFormatSymbols();
   1984         Number number = format.parse("-" + symbols.getInfinity(),
   1985                 new ParsePosition(0));
   1986         assertTrue(number instanceof Double);
   1987         assertTrue(Double.isInfinite(number.doubleValue()));
   1988     }
   1989 
   1990     public void test_setDecimalFormatSymbolsAsNull() {
   1991         // Regression for HARMONY-1070
   1992         DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();
   1993         format.setDecimalFormatSymbols(null);
   1994     }
   1995 
   1996     public void test_formatToCharacterIterator_null() {
   1997         try {
   1998             // Regression for HARMONY-466
   1999             new DecimalFormat().formatToCharacterIterator(null);
   2000             fail("NullPointerException expected");
   2001         } catch (NullPointerException e) {
   2002             // expected
   2003         }
   2004     }
   2005 
   2006     public void test_formatToCharacterIterator_original() {
   2007         new Support_DecimalFormat(
   2008                 "test_formatToCharacterIteratorLjava_lang_Object")
   2009                 .t_formatToCharacterIterator();
   2010     }
   2011 
   2012     public void test_formatToCharacterIterator() throws Exception {
   2013         AttributedCharacterIterator iterator;
   2014         int[] runStarts;
   2015         int[] runLimits;
   2016         String result;
   2017         char current;
   2018 
   2019         // BigInteger.
   2020         iterator = new DecimalFormat().formatToCharacterIterator(new BigInteger("123456789"));
   2021         runStarts = new int[] { 0, 0, 0, 3, 4, 4, 4, 7, 8, 8, 8 };
   2022         runLimits = new int[] { 3, 3, 3, 4, 7, 7, 7, 8, 11, 11, 11 };
   2023         result = "123,456,789";
   2024         current = iterator.current();
   2025         for (int i = 0; i < runStarts.length; i++) {
   2026             assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart());
   2027             assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit());
   2028             assertEquals("wrong char @" + i, result.charAt(i), current);
   2029             current = iterator.next();
   2030         }
   2031         assertEquals(0, iterator.getBeginIndex());
   2032         assertEquals(11, iterator.getEndIndex());
   2033 
   2034         // For BigDecimal with multiplier test.
   2035         DecimalFormat df = new DecimalFormat();
   2036         df.setMultiplier(10);
   2037         iterator = df.formatToCharacterIterator(new BigDecimal("12345678901234567890"));
   2038         result = "123,456,789,012,345,678,900";
   2039         current = iterator.current();
   2040         for (int i = 0; i < result.length(); i++) {
   2041             assertEquals("wrong char @" + i, result.charAt(i), current);
   2042             current = iterator.next();
   2043         }
   2044 
   2045         // For BigDecimal with multiplier test.
   2046         df = new DecimalFormat();
   2047         df.setMultiplier(-1);
   2048         df.setMaximumFractionDigits(20);
   2049         iterator = df.formatToCharacterIterator(new BigDecimal("1.23456789012345678901"));
   2050         result = "-1.23456789012345678901";
   2051         current = iterator.current();
   2052         for (int i = 0; i < result.length(); i++) {
   2053             assertEquals("wrong char @" + i, result.charAt(i), current);
   2054             current = iterator.next();
   2055         }
   2056 
   2057         iterator = new DecimalFormat().formatToCharacterIterator(new BigDecimal("1.23456789E301"));
   2058         runStarts = new int[] { 0, 0, 2, 3, 3, 3, 6, 7, 7, 7, 10, 11, 11, 11, 14 };
   2059         runLimits = new int[] { 2, 2, 3, 6, 6, 6, 7, 10, 10, 10, 11, 14, 14, 14, 15 };
   2060         result = "12,345,678,900,"; // 000,000,000,000....
   2061         current = iterator.current();
   2062         for (int i = 0; i < runStarts.length; i++) {
   2063             assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart());
   2064             assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit());
   2065             assertEquals("wrong char @" + i, result.charAt(i), current);
   2066             current = iterator.next();
   2067         }
   2068         assertEquals(0, iterator.getBeginIndex());
   2069         assertEquals(402, iterator.getEndIndex());
   2070 
   2071         iterator = new DecimalFormat().formatToCharacterIterator(new BigDecimal("1.2345678E4"));
   2072         runStarts = new int[] { 0, 0, 2, 3, 3, 3, 6, 7, 7, 7 };
   2073         runLimits = new int[] { 2, 2, 3, 6, 6, 6, 7, 10, 10, 10 };
   2074         result = "12,345.678";
   2075         current = iterator.current();
   2076         for (int i = 0; i < runStarts.length; i++) {
   2077             assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart());
   2078             assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit());
   2079             assertEquals("wrong char @" + i, result.charAt(i), current);
   2080             current = iterator.next();
   2081         }
   2082         assertEquals(0, iterator.getBeginIndex());
   2083         assertEquals(10, iterator.getEndIndex());
   2084     }
   2085 
   2086     public void test_formatToCharacterIterator_veryLarge() throws Exception {
   2087         AttributedCharacterIterator iterator;
   2088         int[] runStarts;
   2089         int[] runLimits;
   2090         String result;
   2091         char current;
   2092 
   2093         Number number = new BigDecimal("1.23456789E1234");
   2094         assertEquals("1.23456789E+1234", number.toString());
   2095         iterator = new DecimalFormat().formatToCharacterIterator(number);
   2096         runStarts = new int[] { 0, 0, 2, 3, 3, 3, 6, 7, 7, 7, 10, 11, 11, 11, 14 };
   2097         runLimits = new int[] { 2, 2, 3, 6, 6, 6, 7, 10, 10, 10, 11, 14, 14, 14, 15 };
   2098         result = "12,345,678,900,"; // 000,000,000,000....
   2099         current = iterator.current();
   2100         for (int i = 0; i < runStarts.length; i++) {
   2101             assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart());
   2102             assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit());
   2103             assertEquals("wrong char @" + i, result.charAt(i), current);
   2104             current = iterator.next();
   2105         }
   2106         assertEquals(0, iterator.getBeginIndex());
   2107         assertEquals(1646, iterator.getEndIndex());
   2108     }
   2109 
   2110     public void test_formatToCharacterIterator_roundingUnnecessaryArithmeticException() {
   2111         DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
   2112         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2113         decimalFormat.setMaximumFractionDigits(0);
   2114         try {
   2115             // when rounding is needed, but RoundingMode is set to RoundingMode.UNNECESSARY,
   2116             // throw ArithmeticException
   2117             decimalFormat.formatToCharacterIterator(new Double(1.5));
   2118             fail("ArithmeticException expected");
   2119         } catch (ArithmeticException e) {
   2120             // expected
   2121         }
   2122     }
   2123 
   2124     public void test_formatDouble_roundingUnnecessaryArithmeticException() {
   2125         DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
   2126         decimalFormat.setMaximumFractionDigits(0);
   2127         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2128 
   2129         try {
   2130             // when rounding is needed, but RoundingMode is set to RoundingMode.UNNECESSARY,
   2131             // throw ArithmeticException
   2132             decimalFormat.format(11.5, new StringBuffer(), new FieldPosition(0));
   2133             fail("ArithmeticException expected");
   2134         } catch (ArithmeticException e) {
   2135             // expected
   2136         }
   2137     }
   2138 
   2139     public void test_format_roundingUnnecessaryArithmeticException() {
   2140         final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
   2141         DecimalFormat decimalFormat = new DecimalFormat("00.0#E0", dfs);
   2142 
   2143         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2144         try {
   2145             // when rounding is needed, but RoundingMode is set to RoundingMode.UNNECESSARY,
   2146             // throw ArithmeticException
   2147             decimalFormat.format(99999, new StringBuffer(), new FieldPosition(0));
   2148             fail("ArithmeticException expected");
   2149         } catch (ArithmeticException e) {
   2150             // expected
   2151         }
   2152     }
   2153 
   2154     public void test_getRoundingMode() {
   2155         // get the default RoundingMode of this DecimalFormat
   2156         DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
   2157 
   2158         // the default RoundingMode is HALF_EVEN
   2159         assertEquals("Incorrect default RoundingMode",
   2160                 decimalFormat.getRoundingMode(), RoundingMode.HALF_EVEN);
   2161 
   2162         // set RoundingMode.HALF_DOWN of this DecimalFormat
   2163         decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
   2164         assertEquals("Returned incorrect RoundingMode",
   2165                 decimalFormat.getRoundingMode(), RoundingMode.HALF_DOWN);
   2166 
   2167     }
   2168 
   2169     public void test_setRoundingMode_null() {
   2170         DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
   2171         try {
   2172             // when the given RoundingMode is null, throw NullPointerException
   2173             decimalFormat.setRoundingMode(null);
   2174             fail("NullPointerException expected");
   2175         } catch (NullPointerException e) {
   2176             // expected
   2177         }
   2178     }
   2179 
   2180     public void test_format_withRoundingMode() {
   2181         DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
   2182         // ignore the fraction part of a given value
   2183         decimalFormat.setMaximumFractionDigits(0);
   2184 
   2185         // set RoundingMode.HALF_DOWN of this DecimalFormat and test its
   2186         // behavior
   2187         decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
   2188         String result = decimalFormat.format(11.3);
   2189         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11", result);
   2190 
   2191         result = decimalFormat.format(11.5);
   2192         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11", result);
   2193 
   2194         result = decimalFormat.format(11.6);
   2195         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "12", result);
   2196 
   2197         // set RoundingMode.CEILING of this DecimalFormat and test its
   2198         // behavior
   2199         decimalFormat.setRoundingMode(RoundingMode.CEILING);
   2200         result = decimalFormat.format(11.3);
   2201         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "12", result);
   2202 
   2203         result = decimalFormat.format(-11.5);
   2204         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "-11", result);
   2205 
   2206         // set RoundingMode.DOWN of this DecimalFormat and test its
   2207         // behavior
   2208         decimalFormat.setRoundingMode(RoundingMode.DOWN);
   2209         result = decimalFormat.format(11.3);
   2210         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "11", result);
   2211 
   2212         result = decimalFormat.format(-11.5);
   2213         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "-11", result);
   2214 
   2215         result = decimalFormat.format(0);
   2216         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "0", result);
   2217 
   2218         // set RoundingMode.FLOOR of this DecimalFormat and test its
   2219         // behavior
   2220         decimalFormat.setRoundingMode(RoundingMode.FLOOR);
   2221         result = decimalFormat.format(11.3);
   2222         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "11", result);
   2223 
   2224         result = decimalFormat.format(-11.5);
   2225         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "-12", result);
   2226 
   2227         result = decimalFormat.format(0);
   2228         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "0", result);
   2229 
   2230         // set RoundingMode.HALF_EVEN of this DecimalFormat and test its
   2231         // behavior
   2232         decimalFormat.setRoundingMode(RoundingMode.HALF_EVEN);
   2233         result = decimalFormat.format(5.5);
   2234         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "6", result);
   2235 
   2236         result = decimalFormat.format(-5.5);
   2237         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "-6", result);
   2238 
   2239         result = decimalFormat.format(0.2);
   2240         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "0", result);
   2241 
   2242         // set RoundingMode.HALF_UP of this DecimalFormat and test its
   2243         // behavior
   2244         decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
   2245         result = decimalFormat.format(5.5);
   2246         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "6", result);
   2247 
   2248         result = decimalFormat.format(-5.5);
   2249         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "-6", result);
   2250 
   2251         result = decimalFormat.format(0.2);
   2252         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "0", result);
   2253 
   2254         result = decimalFormat.format(-0.2);
   2255         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "-0", result);
   2256 
   2257         // set RoundingMode.UP of this DecimalFormat and test its
   2258         // behavior
   2259         decimalFormat.setRoundingMode(RoundingMode.UP);
   2260         result = decimalFormat.format(5.5);
   2261         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "6", result);
   2262 
   2263         result = decimalFormat.format(-5.5);
   2264         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "-6", result);
   2265 
   2266         result = decimalFormat.format(0.2);
   2267         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "1", result);
   2268 
   2269         result = decimalFormat.format(-0.2);
   2270         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "-1", result);
   2271 
   2272         // set RoundingMode.UNNECESSARY of this DecimalFormat and test its
   2273         // behavior
   2274         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2275 
   2276         try {
   2277             // when rounding is needed but RoundingMode is set to RoundingMode.UNNECESSARY,
   2278             // throw ArithmeticException
   2279             result = decimalFormat.format(5.5);
   2280             fail("ArithmeticException expected: RoundingMode.UNNECESSARY");
   2281         } catch (ArithmeticException e) {
   2282             // expected
   2283         }
   2284 
   2285         result = decimalFormat.format(1.0);
   2286         assertEquals(
   2287                 "Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY", "1", result);
   2288 
   2289         result = decimalFormat.format(-1.0);
   2290         assertEquals(
   2291                 "Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY", "-1", result);
   2292 
   2293         // set MaxFractionDigits to 3, test different DecimalFormat format
   2294         // function with differnt RoundingMode
   2295         decimalFormat.setMaximumFractionDigits(3);
   2296 
   2297         // set RoundingMode.HALF_DOWN of this DecimalFormat and test its
   2298         // behavior
   2299         decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
   2300         result = decimalFormat.format(11.5653);
   2301         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11.565", result);
   2302 
   2303         result = decimalFormat.format(11.5655);
   2304         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11.565", result);
   2305 
   2306         result = decimalFormat.format(11.5656);
   2307         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11.566", result);
   2308 
   2309         // set RoundingMode.CEILING of this DecimalFormat and test its
   2310         // behavior
   2311         decimalFormat.setRoundingMode(RoundingMode.CEILING);
   2312         result = decimalFormat.format(11.5653);
   2313         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "11.566", result);
   2314 
   2315         result = decimalFormat.format(-11.5653);
   2316         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "-11.565", result);
   2317 
   2318         // set RoundingMode.DOWN of this DecimalFormat and test its
   2319         // behavior
   2320         decimalFormat.setRoundingMode(RoundingMode.DOWN);
   2321         result = decimalFormat.format(11.5653);
   2322         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "11.565", result);
   2323 
   2324         result = decimalFormat.format(-11.5653);
   2325         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "-11.565", result);
   2326 
   2327         result = decimalFormat.format(0);
   2328         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "0", result);
   2329 
   2330         // set RoundingMode.FLOOR of this DecimalFormat and test its
   2331         // behavior
   2332         decimalFormat.setRoundingMode(RoundingMode.FLOOR);
   2333         result = decimalFormat.format(11.5653);
   2334         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "11.565", result);
   2335 
   2336         result = decimalFormat.format(-11.5655);
   2337         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "-11.566", result);
   2338 
   2339         result = decimalFormat.format(0);
   2340         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "0", result);
   2341 
   2342         // set RoundingMode.HALF_EVEN of this DecimalFormat and test its
   2343         // behavior
   2344         decimalFormat.setRoundingMode(RoundingMode.HALF_EVEN);
   2345         result = decimalFormat.format(11.5653);
   2346         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "11.565", result);
   2347 
   2348         result = decimalFormat.format(-11.5655);
   2349         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "-11.566", result);
   2350 
   2351         result = decimalFormat.format(11.5656);
   2352         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "11.566", result);
   2353 
   2354         // set RoundingMode.HALF_UP of this DecimalFormat and test its
   2355         // behavior
   2356         decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
   2357         result = decimalFormat.format(11.5653);
   2358         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "11.565", result);
   2359 
   2360         result = decimalFormat.format(-11.5655);
   2361         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "-11.566", result);
   2362 
   2363         result = decimalFormat.format(11.5656);
   2364         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "11.566", result);
   2365 
   2366         // set RoundingMode.UP of this DecimalFormat and test its
   2367         // behavior
   2368         decimalFormat.setRoundingMode(RoundingMode.UP);
   2369         result = decimalFormat.format(11.5653);
   2370         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "11.566", result);
   2371 
   2372         result = decimalFormat.format(-11.5655);
   2373         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "-11.566", result);
   2374 
   2375         // set RoundingMode.UNNECESSARY of this DecimalFormat and test its
   2376         // behavior
   2377         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2378         result = decimalFormat.format(-11.565);
   2379         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY",
   2380                 "-11.565", result);
   2381 
   2382         result = decimalFormat.format(11.565);
   2383         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY",
   2384                 "11.565", result);
   2385 
   2386         // when setting MaxFractionDigits to negative value -2, default it as
   2387         // zero, test different DecimalFormat format
   2388         // function with differnt RoundingMode
   2389         decimalFormat.setMaximumFractionDigits(-2);
   2390 
   2391         // set RoundingMode.HALF_DOWN of this DecimalFormat and test its
   2392         // behavior
   2393         decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
   2394         result = decimalFormat.format(11.3);
   2395         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11", result);
   2396 
   2397         result = decimalFormat.format(11.5);
   2398         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "11", result);
   2399 
   2400         result = decimalFormat.format(11.6);
   2401         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_DOWN", "12", result);
   2402 
   2403         // set RoundingMode.CEILING of this DecimalFormat and test its
   2404         // behavior
   2405         decimalFormat.setRoundingMode(RoundingMode.CEILING);
   2406         result = decimalFormat.format(11.3);
   2407         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "12", result);
   2408 
   2409         result = decimalFormat.format(-11.5);
   2410         assertEquals("Incorrect RoundingMode behavior: RoundingMode.CEILING", "-11", result);
   2411 
   2412         // set RoundingMode.DOWN of this DecimalFormat and test its
   2413         // behavior
   2414         decimalFormat.setRoundingMode(RoundingMode.DOWN);
   2415         result = decimalFormat.format(11.3);
   2416         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "11", result);
   2417 
   2418         result = decimalFormat.format(-11.5);
   2419         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "-11", result);
   2420 
   2421         result = decimalFormat.format(0);
   2422         assertEquals("Incorrect RoundingMode behavior: RoundingMode.DOWN", "0", result);
   2423 
   2424         // set RoundingMode.FLOOR of this DecimalFormat and test its
   2425         // behavior
   2426         decimalFormat.setRoundingMode(RoundingMode.FLOOR);
   2427         result = decimalFormat.format(11.3);
   2428         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "11", result);
   2429 
   2430         result = decimalFormat.format(-11.5);
   2431         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "-12", result);
   2432 
   2433         result = decimalFormat.format(0);
   2434         assertEquals("Incorrect RoundingMode behavior: RoundingMode.FLOOR", "0", result);
   2435 
   2436         // set RoundingMode.HALF_EVEN of this DecimalFormat and test its
   2437         // behavior
   2438         decimalFormat.setRoundingMode(RoundingMode.HALF_EVEN);
   2439         result = decimalFormat.format(5.5);
   2440         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "6", result);
   2441 
   2442         result = decimalFormat.format(-5.5);
   2443         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "-6", result);
   2444 
   2445         result = decimalFormat.format(0.2);
   2446         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_EVEN", "0", result);
   2447 
   2448         // set RoundingMode.HALF_UP of this DecimalFormat and test its
   2449         // behavior
   2450         decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
   2451         result = decimalFormat.format(5.5);
   2452         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "6", result);
   2453 
   2454         result = decimalFormat.format(-5.5);
   2455         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "-6", result);
   2456 
   2457         result = decimalFormat.format(0.2);
   2458         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "0", result);
   2459 
   2460         result = decimalFormat.format(-0.2);
   2461         assertEquals("Incorrect RoundingMode behavior: RoundingMode.HALF_UP", "-0", result);
   2462 
   2463         // set RoundingMode.UP of this DecimalFormat and test its
   2464         // behavior
   2465         decimalFormat.setRoundingMode(RoundingMode.UP);
   2466         result = decimalFormat.format(5.5);
   2467         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "6", result);
   2468 
   2469         result = decimalFormat.format(-5.5);
   2470         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "-6", result);
   2471 
   2472         result = decimalFormat.format(0.2);
   2473         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "1", result);
   2474 
   2475         result = decimalFormat.format(-0.2);
   2476         assertEquals("Incorrect RoundingMode behavior: RoundingMode.UP", "-1", result);
   2477 
   2478         // set RoundingMode.UNNECESSARY of this DecimalFormat and test its
   2479         // behavior
   2480         decimalFormat.setRoundingMode(RoundingMode.UNNECESSARY);
   2481 
   2482         result = decimalFormat.format(1.0);
   2483         assertEquals(
   2484                 "Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY", "1", result);
   2485 
   2486         result = decimalFormat.format(-1.0);
   2487         assertEquals(
   2488                 "Incorrect RoundingMode behavior: RoundingMode.UNNECESSARY", "-1", result);
   2489 
   2490         // Regression for HARMONY-6485
   2491         // Test with applyPattern call after setRoundingMode
   2492 
   2493         // set RoundingMode.HALF_UP of this DecimalFormat and test its
   2494         // behavior
   2495         decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
   2496         decimalFormat.applyPattern(".##");
   2497         result = decimalFormat.format(0.125);
   2498         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".13", result);
   2499         result = decimalFormat.format(0.255);
   2500         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".26", result);
   2501         result = decimalFormat.format(0.732);
   2502         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".73", result);
   2503         result = decimalFormat.format(0.467);
   2504         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".47", result);
   2505 
   2506         // set RoundingMode.HALF_DOWN of this DecimalFormat and test its
   2507         // behavior
   2508         decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
   2509         decimalFormat.applyPattern(".##");
   2510         result = decimalFormat.format(0.125);
   2511         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".12", result);
   2512         result = decimalFormat.format(0.255);
   2513         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".25", result);
   2514         result = decimalFormat.format(0.732);
   2515         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".73", result);
   2516         result = decimalFormat.format(0.467);
   2517         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".47", result);
   2518 
   2519         // set RoundingMode.UP of this DecimalFormat and test its
   2520         // behavior
   2521         decimalFormat.setRoundingMode(RoundingMode.UP);
   2522         decimalFormat.applyPattern(".##");
   2523         result = decimalFormat.format(0.125);
   2524         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".13", result);
   2525         result = decimalFormat.format(0.255);
   2526         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".26", result);
   2527         result = decimalFormat.format(0.732);
   2528         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".74", result);
   2529         result = decimalFormat.format(0.467);
   2530         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".47", result);
   2531 
   2532         // set RoundingMode.DOWN of this DecimalFormat and test its
   2533         // behavior
   2534         decimalFormat.setRoundingMode(RoundingMode.DOWN);
   2535         decimalFormat.applyPattern(".##");
   2536         result = decimalFormat.format(0.125);
   2537         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".12", result);
   2538         result = decimalFormat.format(0.255);
   2539         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".25", result);
   2540         result = decimalFormat.format(0.732);
   2541         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".73", result);
   2542         result = decimalFormat.format(0.467);
   2543         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".46", result);
   2544 
   2545         // set RoundingMode.HALF_EVEN of this DecimalFormat and test its
   2546         // behavior
   2547         decimalFormat.setRoundingMode(RoundingMode.HALF_EVEN);
   2548         decimalFormat.applyPattern(".##");
   2549         result = decimalFormat.format(0.125);
   2550         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".12", result);
   2551         result = decimalFormat.format(0.255);
   2552         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".26", result);
   2553         result = decimalFormat.format(0.732);
   2554         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".73", result);
   2555         result = decimalFormat.format(0.467);
   2556         assertEquals("Incorrect RoundingMode behavior after applyPattern", ".47", result);
   2557     }
   2558 
   2559     private static class FormatTester {
   2560         private List<AssertionFailedError> failures = new ArrayList<AssertionFailedError>();
   2561 
   2562         public void format(DecimalFormat format, String expected, double value) {
   2563             try {
   2564                 Assert.assertEquals(format.toPattern() + ": " + value, expected,
   2565                         format.format(value));
   2566             } catch (AssertionFailedError e) {
   2567                 failures.add(e);
   2568             }
   2569         }
   2570 
   2571         public void format(DecimalFormat format, String expected, int value) {
   2572             try {
   2573                 Assert.assertEquals(format.toPattern() + ": " + value, expected,
   2574                         format.format(value));
   2575             } catch (AssertionFailedError e) {
   2576                 failures.add(e);
   2577             }
   2578         }
   2579 
   2580         public void throwFailures() throws AssertionFailedError {
   2581             if (failures.isEmpty()) {
   2582                 return;
   2583             }
   2584             if (failures.size() == 1) {
   2585                 throw failures.get(0);
   2586             }
   2587             AssertionFailedError combined = new AssertionFailedError("Multiple format failures");
   2588             for (AssertionFailedError failure : failures) {
   2589                 combined.addSuppressed(failure);
   2590             }
   2591             throw combined;
   2592         }
   2593     }
   2594 }
   2595