17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 1996-2009, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @test
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * General test of Big NumberFormat
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class BigNumberFormatTest extends TestFmwk {
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final int ILLEGAL = -1;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new BigNumberFormatTest().run(args);
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponent() {
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt1 = new DecimalFormat("0.###E0", US);
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US);
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number n = new Long(1234);
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt1, n, "1.234E3");
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt2, n, "1.234E+3");
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt1, "1.234E3", n);
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt1, "1.234E+3", n); // Either format should parse "E+3"
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt2, "1.234E+3", n);
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the functioning of the secondary grouping value.
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSecondaryGrouping() {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat f = new DecimalFormat("#,##,###", US);
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, new Long(123456789), "12,34,56,789");
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,##,###");
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.applyPattern("#,###");
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setSecondaryGroupingSize(4);
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, new Long(123456789), "12,3456,789");
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,####,###");
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // On Sun JDK 1.2-1.3, the hi_IN locale uses '0' for a zero digit,
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // but on IBM JDK 1.2-1.3, the locale uses U+0966.
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f = (DecimalFormat) NumberFormat.getInstance(new Locale("hi", "IN"));
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = transmute("1,87,65,43,210",
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                               f.getDecimalFormatSymbols().getZeroDigit());
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, new Long(1876543210), str);
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectPad(DecimalFormat fmt, String pat, int pos) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, pat, pos, 0, (char)0);
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectPad(DecimalFormat fmt, String pat,
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           int pos, int width, char pad) {
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int apos = 0, awidth = 0;
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char apad = 0;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.applyPattern(pat);
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = fmt.getPadPosition();
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = fmt.getFormatWidth();
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apad = fmt.getPadCharacter();
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = -1;
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = width;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apad = pad;
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (apos == pos && awidth == width && apad == pad) {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + "\" pos=" + apos +
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ((pos == -1) ? "" : " width=" + awidth + " pad=" + apad));
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("FAIL \"" + pat + "\" pos=" + apos +
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  " width=" + awidth + " pad=" + apad +
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", expected " + pos + " " + width + " " + pad);
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatterns() {
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#", US);
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, '^');
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^#", DecimalFormat.PAD_AFTER_PREFIX, 2, '^');
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#*^", DecimalFormat.PAD_BEFORE_SUFFIX, 1, '^');
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^", DecimalFormat.PAD_AFTER_SUFFIX, 2, '^');
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^$#", ILLEGAL);
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^$", ILLEGAL);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat.PAD_BEFORE_SUFFIX,
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  12, 'x');
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "''#0*x", DecimalFormat.PAD_BEFORE_SUFFIX,
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  3, 'x');
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'I''ll'*a###.##", DecimalFormat.PAD_AFTER_PREFIX,
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  10, 'a');
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.applyPattern("AA#,##0.00ZZ");
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter('^');
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(10);
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_PREFIX);
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "*^AA#,##0.00ZZ");
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_SUFFIX);
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00*^ZZ");
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_SUFFIX);
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00ZZ*^");
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //            12  3456789012
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String exp = "AA*^#,##0.00ZZ";
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(12);
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_PREFIX);
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, exp);
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(13);
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^##,##0.00ZZ");
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(14);
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  345678901234
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^###,##0.00ZZ");
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(15);
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  3456789012345
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(16);
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123456
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^#,###,##0.00ZZ");
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectPat(DecimalFormat fmt, String exp) {
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = fmt.toPattern();
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pat.equals(exp)) {
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + '"');
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + pat + "\", expected \"" + exp + '"');
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the handling of the AlphaWorks BigDecimal
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAlphaBigDecimal() {
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*For ICU compatibility [Richard/GCL]*/
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(NumberFormat.getScientificInstance(Locale.US),
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new com.ibm.icu.math.BigDecimal("12345.678901"),
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           },
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "1.2345678901E4");
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new com.ibm.icu.math.BigDecimal("12345.4999"),
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new com.ibm.icu.math.BigDecimal("12344.5001"),
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            },
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.345E3");
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new com.ibm.icu.math.BigDecimal("12345.5000"),
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new com.ibm.icu.math.BigDecimal("12346.5000"),
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            },
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.346E3");
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientific() {
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*For ICU compatibility [Richard/GCL]*/
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(NumberFormat.getScientificInstance(Locale.US),
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new Double(12345.678901),
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new java.math.BigDecimal("12345.678901"),
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            },
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "1.2345678901E4");
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US),
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(12345),
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.34E3");
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US),
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(12345.00001),
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.35E3");
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new Integer(12345),
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Long(12345),
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new java.math.BigDecimal("12345.4999"),
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new java.math.BigDecimal("12344.5001"),
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            },
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.345E3");
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Number[] { new java.math.BigDecimal("12345.5000"),
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new java.math.BigDecimal("12346.5000"),
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            },
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "12.346E3");
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*For ICU compatibility [Richard/GCL]*/
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(NumberFormat.getScientificInstance(Locale.FRANCE),
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(12345.678901),
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "1,2345678901E4");
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(789.12345e-9),
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "789.12E-9");
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US),
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(780.e-9),
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               "780E-9");
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat(".###E0", US),
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Double(45678),
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               ".457E5");
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat(".###E0", US),
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Long(0),
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               ".0E0");
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat[] { new DecimalFormat("#E0", US),
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("##E0", US),
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("####E0", US),
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("0E0", US),
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("00E0", US),
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("000E0", US),
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   },
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Long(45678000),
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new String[] { "4.5678E7",
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "45.678E6",
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "4567.8E4",
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "5E7",
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "46E6",
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "457E5",
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("###E0", US),
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.0000123), "12.3E-6",
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.000123), "123E-6",
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new java.math.BigDecimal("0.00123"), "1.23E-3", // Cafe VM messes up Double(0.00123)
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.0123), "12.3E-3",
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.123), "123E-3",
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1.23), "1.23E0",
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(12.3), "12.3E0",
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(123), "123E0",
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1230), "1.23E3",
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0.#E+00", US),
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.00012), "1.2E-04",
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Long(12000),     "1.2E+04",
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPad() {
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("*^##.##", US),
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Long(0),      "^^^^0",
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(-1.3), "^-1.3",
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Long(0),       "0.0E0______ g-m/s^2",
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1.0/3), "333.333E-3_ g-m/s^2",
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US),
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Long(0),       "0.0______ g-m/s^2",
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1.0/3), "0.33333__ g-m/s^2",
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("*x#,###,###,##0.00;*x(#,###,###,##0.00)", US),
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] {
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   new Long(-100),        "xxxxxxxx(100.00)",
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   new Long(-1000),       "xxxxxx(1,000.00)",
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   new Long(-1000000),    "xx(1,000,000.00)",
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   new Long(-1000000000), "(1,000,000,000.00)",
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               });
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expect(NumberFormat fmt, Object[] data) {
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<data.length; i+=2) {
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmt, (Number) data[i], (String) data[i+1]);
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expect(Object fmto, Object numo, Object expo) {
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = null, fmts[] = null;
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = null, nums[] = null;
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String exp = null, exps[] = null;
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (fmto instanceof NumberFormat[]) {
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmts = (NumberFormat[]) fmto;
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt = (NumberFormat) fmto;
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (numo instanceof Number[]) {
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nums = (Number[]) numo;
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            num = (Number) numo;
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (expo instanceof String[]) {
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            exps = (String[]) expo;
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            exp = (String) expo;
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 1;
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (fmts != null) {
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            n = Math.max(n, fmts.length);
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (nums != null) {
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            n = Math.max(n, nums.length);
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (exps != null) {
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            n = Math.max(n, exps.length);
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<n; ++i) {
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmts == null ? fmt : fmts[i],
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   nums == null ? num : nums[i],
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   exps == null ? exp : exps[i]);
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String showNumber(Number n) {
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String cls = n.getClass().getName();
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!(n instanceof com.ibm.icu.math.BigDecimal
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              || n instanceof java.math.BigDecimal)) {
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int i = cls.lastIndexOf('.');
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cls = cls.substring(i+1);
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return n.toString() + " (" + cls + ')';
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expect(NumberFormat fmt, Number n, String exp) {
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String saw = fmt.format(n);
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat) fmt).toPattern();
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.equals(exp)) {
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   " + showNumber(n) + " x " +
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  pat + " = " +
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  Utility.escape(saw));
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL " + showNumber(n) + " x " +
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  pat + " = \"" +
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  Utility.escape(saw) + ", expected " + Utility.escape(exp));
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expect(NumberFormat fmt, String str, Number exp) {
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number saw = null;
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            saw = fmt.parse(str);
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            saw = null;
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat) fmt).toPattern();
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.equals(exp)) {
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + str + "\" x " +
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  pat + " = " +
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  showNumber(saw));
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + str + "\" x " +
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  pat + " = " +
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  showNumber(saw) + ", expected " + showNumber(exp));
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Given a string composed of [0-9] and other chars, convert the
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * [0-9] chars to be offsets 0..9 from 'zero'.
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String transmute(String str, char zero) {
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buf = new StringBuffer();
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<str.length(); ++i) {
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char c = str.charAt(i);
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (c >= '0' && c <= '9') {
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                c = (char) (c - '0' + zero);
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(c);
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return buf.toString();
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4161100() {
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f = NumberFormat.getInstance();
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setMinimumFractionDigits(1);
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setMaximumFractionDigits(1);
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double a = -0.09;
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = f.format(a);
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(a + " x " +
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              ((DecimalFormat) f).toPattern() + " = " +
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              s);
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("-0.1")) {
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL");
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBigDecimalJ28() {
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "1", "1E0",
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "-1", "-1E0",
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "0", "0E0",
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "12e34", "1.2E35",
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "-12.3e-45", "-1.23E-44",
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "0.73e-7", "7.3E-8",
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getScientificInstance(Locale.US);
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern: " + ((DecimalFormat)fmt).toPattern());
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=2) {
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String input = DATA[i];
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String exp = DATA[i+1];
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.math.BigDecimal bd = new com.ibm.icu.math.BigDecimal(input);
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String output = fmt.format(bd);
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (output.equals(exp)) {
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("input=" + input + " num=" + bd + " output=" + output);
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: input=" + input + " num=" + bd + " output=" + output +
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " expected=" + exp);
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBigDecimalRounding() {
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // jb 3657
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.text.DecimalFormat jdkFormat=new java.text.DecimalFormat("###,###,###,##0");
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        com.ibm.icu.text.DecimalFormat icuFormat=new com.ibm.icu.text.DecimalFormat("###,###,###,##0");
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] values = {
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "-1.74", "-1.24", "-0.74", "-0.24", "0.24", "0.74", "1.24", "1.74"
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < values.length; ++i) {
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String val = values[i];
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            java.math.BigDecimal bd = new java.math.BigDecimal(val);
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String jdk = jdkFormat.format(bd);
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String icu = icuFormat.format(bd);
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Format of BigDecimal " + val + " by JDK is " + jdk);
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Format of BigDecimal " + val + " by ICU is " + icu);
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!jdk.equals(icu)) {
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("BigDecimal jdk: " + jdk + " != icu: " + icu);
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double d = bd.doubleValue();
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            jdk = jdkFormat.format(d);
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            icu = icuFormat.format(d);
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Format of double " + val + " by JDK is " + jdk);
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Format of double " + val + " by ICU is " + icu);
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!jdk.equals(icu)) {
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("double jdk: " + jdk + " != icu: " + icu);
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
451