17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2014, 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 com.ibm.icu.dev.test.TestFmwk;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author rocketman
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatSpecificationTest extends TestFmwk {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new NumberFormatSpecificationTest().run(args);
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBasicPatterns() {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double num = 1234.567;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234,57", formatFrWithPattern(num, "#,##0.##"));
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1234,57", formatFrWithPattern(num, "0.##"));
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1235", formatFrWithPattern(num, "0"));
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234,567", formatFrWithPattern(num, "#,##0.###"));
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1234,567", formatFrWithPattern(num, "###0.#####"));
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1234,5670", formatFrWithPattern(num, "###0.0000#"));
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "01234,5670", formatFrWithPattern(num, "00000.0000"));
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234,57 €", formatFrWithPattern(num, "#,##0.00 ¤"));
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNfSetters() {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = nfWithPattern("#,##0.##");
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumIntegerDigits(5);
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMinimumIntegerDigits(4);
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "34 567,89", format(1234567.89, nf));
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "0 034,56", format(34.56, nf));
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRounding() {
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1,0", formatFrWithPattern(1.25, "0.5"));
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "2,0", formatFrWithPattern(1.75, "0.5"));
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "-1,0", formatFrWithPattern(-1.25, "0.5"));
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "-02,0", formatFrWithPattern(-1.75, "00.5"));
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "0", formatFrWithPattern(2.0, "4"));
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "8", formatFrWithPattern(6.0, "4"));
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "8", formatFrWithPattern(10.0, "4"));
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "99,90", formatFrWithPattern(99.0, "2.70"));
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "273,00", formatFrWithPattern(272.0, "2.73"));
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 03,60", formatFrWithPattern(104.0, "#,#3.70"));
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSignificantDigits() {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1230", formatFrWithPattern(1234.0, "@@@"));
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234", formatFrWithPattern(1234.0, "@,@@@"));
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 235 000", formatFrWithPattern(1234567.0, "@,@@@"));
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234 567", formatFrWithPattern(1234567.0, "@@@@,@@@"));
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12 34 567,00", formatFrWithPattern(1234567.0, "@@@@,@@,@@@"));
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12 34 567,0", formatFrWithPattern(1234567.0, "@@@@,@@,@@#"));
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12 34 567", formatFrWithPattern(1234567.0, "@@@@,@@,@##"));
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12 34 567", formatFrWithPattern(1234567.001, "@@@@,@@,@##"));
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12 34 567", formatFrWithPattern(1234567.001, "@@@@,@@,###"));
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 200", formatFrWithPattern(1234.0, "#,#@@"));
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientificNotation() {
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1,23E4", formatFrWithPattern(12345.0, "0.00E0"));
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "123,00E2", formatFrWithPattern(12300.0, "000.00E0"));
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "123,0E2", formatFrWithPattern(12300.0, "000.0#E0"));
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "123,0E2", formatFrWithPattern(12300.1, "000.0#E0"));
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "123,01E2", formatFrWithPattern(12301.0, "000.0#E0"));
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "123,01E+02", formatFrWithPattern(12301.0, "000.0#E+00"));
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12,3E3", formatFrWithPattern(12345.0, "##0.00E0"));
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12,300E3", formatFrWithPattern(12300.1, "##0.0000E0"));
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12,30E3", formatFrWithPattern(12300.1, "##0.000#E0"));
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "12,301E3", formatFrWithPattern(12301.0, "##0.000#E0"));
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!logKnownIssue("11020", "Rounding does not work with scientific notation.")) {
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("", "170,0E-3", formatFrWithPattern(0.17, "##0.000#E0"));
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPercent() {
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "57,3%", formatFrWithPattern(0.573, "0.0%"));
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "%57,3", formatFrWithPattern(0.573, "%0.0"));
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "p%p57,3", formatFrWithPattern(0.573, "p%p0.0"));
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "p%p0,6", formatFrWithPattern(0.573, "p'%'p0.0"));
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "%3,260", formatFrWithPattern(0.0326, "%@@@@"));
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "%1 540", formatFrWithPattern(15.43, "%#,@@@"));
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "%1 656,4", formatFrWithPattern(16.55, "%#,##4.1"));
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "%16,3E3", formatFrWithPattern(162.55, "%##0.00E0"));
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPerMilli() {
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "573,0‰", formatFrWithPattern(0.573, "0.0‰"));
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "‰573,0", formatFrWithPattern(0.573, "‰0.0"));
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "p‰p573,0", formatFrWithPattern(0.573, "p‰p0.0"));
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "p‰p0,6", formatFrWithPattern(0.573, "p'‰'p0.0"));
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "‰32,60", formatFrWithPattern(0.0326, "‰@@@@"));
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "‰15 400", formatFrWithPattern(15.43, "‰#,@@@"));
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "‰16 551,7", formatFrWithPattern(16.55, "‰#,##4.1"));
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "‰163E3", formatFrWithPattern(162.55, "‰##0.00E0"));
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPadding() {
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "$***1 234", formatFrWithPattern(1234, "$**####,##0"));
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "xxx$1 234", formatFrWithPattern(1234, "*x$####,##0"));
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234xxx$", formatFrWithPattern(1234, "####,##0*x$"));
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "1 234$xxx", formatFrWithPattern(1234, "####,##0$*x"));
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "ne1 234nx", formatFrWithPattern(-1234, "####,##0$*x;ne#n"));
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "n1 234*xx", formatFrWithPattern(-1234, "####,##0$*x;n#'*'"));
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "yyyy%432,6", formatFrWithPattern(4.33, "*y%4.2######"));
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!logKnownIssue("11025", "Padding broken when used with currencies")) {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("", "EUR *433,00", formatFrWithPattern(433.0, "¤¤ **####0.00"));
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("", "EUR *433,00", formatFrWithPattern(433.0, "¤¤ **#######0"));
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat("¤¤ **#######0", sym);
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.setCurrency(Currency.getInstance("JPY"));
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!logKnownIssue("11025", "Padding broken when used with currencies")) {
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("", "JPY ****433", fmt.format(433.22));
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.US);
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat("¤¤ **#######0;¤¤ (#)", sym);
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("", "USD (433.22)", fmt.format(-433.22));
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "QU***43,3E-1", formatFrWithPattern(4.33, "QU**00.#####E0"));
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sym.setExponentSeparator("EE");
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat("QU**00.#####E0", sym);
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("", "QU**43,3EE-1", fmt.format(4.33));
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // padding cannot work as intended with scientific notation.
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "QU**43,32E-1", formatFrWithPattern(4.332, "QU**00.#####E0"));
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String formatFrWithPattern(double d, String pattern) {
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pattern, sym);
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return fmt.format(d).replace('\u00a0', ' ');
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static NumberFormat nfWithPattern(String pattern) {
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new DecimalFormat(pattern, sym);
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String format(double d, NumberFormat nf) {
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return nf.format(d).replace('\u00a0', ' ');
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
164