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