17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2001-2012, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From: ICU4C v1.8.1 : format : NumberFormatRegressionTest 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/numrgts.cpp 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat; 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat; 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Performs regression test for MessageFormat 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk { 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static void main(String[] args) throws Exception{ 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new NumberFormatRegressionTest().run(args); 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * alphaWorks upgrade 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4161100() { 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(Locale.US); 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMinimumFractionDigits(1); 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMaximumFractionDigits(1); 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double a = -0.09; 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = nf.format(a); 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(a + " x " + 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ((DecimalFormat) nf).toPattern() + " = " + s); 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals("-0.1")) { 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL"); 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * DateFormat should call setIntegerParseOnly(TRUE) on adopted 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * NumberFormat objects. 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJ691() { 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale loc = new Locale("fr", "CH"); 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // set up the input date string & expected output 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String udt = "11.10.2000"; 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exp = "11.10.00"; 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // create a Calendar for this locale 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(loc); 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // create a NumberFormat for this locale 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(loc); 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // *** Here's the key: We don't want to have to do THIS: 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //nf.setParseIntegerOnly(true); 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // create the DateFormat 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc); 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setCalendar(cal); 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setNumberFormat(nf); 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // set parsing to lenient & parse 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date ulocdat = new Date(); 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setLenient(true); 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ulocdat = df.parse(udt); 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (java.text.ParseException pe) { 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(pe.getMessage()); 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format back to a string 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String outString = df.format(ulocdat); 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!outString.equals(exp)) { 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + udt + " => " + outString); 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test getIntegerInstance(); 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4408066() { 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf1 = NumberFormat.getIntegerInstance(); 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf2 = NumberFormat.getIntegerInstance(Locale.CHINA); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //test isParseIntegerOnly 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!nf1.isParseIntegerOnly() || !nf2.isParseIntegerOnly()) { 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed : Integer Number Format Instance should set setParseIntegerOnly(true)"); 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //Test format 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double[] data = { 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -3.75, -2.5, -1.5, 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -1.25, 0, 1.0, 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.25, 1.5, 2.5, 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3.75, 10.0, 255.5 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] expected = { 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-4", "-2", "-2", 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-1", "0", "1", 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1", "2", "2", 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "4", "10", "256" 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < data.length; ++i) { 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result = nf1.format(data[i]); 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!result.equals(expected[i])) { 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed => Source: " + Double.toString(data[i]) 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ";Formatted : " + result 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ";but expectted: " + expected[i]); 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //Test parse, Parsing should stop at "." 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String data[] = { 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-3.75", "-2.5", "-1.5", 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-1.25", "0", "1.0", 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.25", "1.5", "2.5", 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "3.75", "10.0", "255.5" 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long[] expected = { 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -3, -2, -1, 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -1, 0, 1, 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 2, 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3, 10, 255 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < data.length; ++i) { 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = null; 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n = nf1.parse(data[i]); 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: " + e.getMessage()); 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof Long) || (n instanceof Integer)) { 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: Integer Number Format should parse string to Long/Integer"); 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n.longValue() != expected[i]) { 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed=> Source: " + data[i] 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ";result : " + n.toString() 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ";expected :" + Long.toString(expected[i])); 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //Test New serialized DecimalFormat(2.0) read old serialized forms of DecimalFormat(1.3.1.1) 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSerialization() throws IOException{ 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert byte[][] contents = NumberFormatSerialTestData.getContent(); 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double data = 1234.56; 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] expected = { 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234.56", "$1,234.56", "123,456%", "1.23456E3"}; 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 4; ++i) { 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(contents[i])); 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat format = (NumberFormat) ois.readObject(); 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result = format.format(data); 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (result.equals(expected[i])) { 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Deserialized bogus NumberFormat(new version read old version)"); 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: the test data formats are not euqal"); 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert warnln("FAIL: " + e.getMessage()); 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test case for JB#5509, strict parsing issue 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB5509() { 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] data = { 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,2", 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.2", 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,2.5", 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,23.5", 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234.5", 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234", 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,567", 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,567.8", 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,5", 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,5.6", 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,56.7" 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean[] expected = { // false for expected parse failure 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert true, 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert true, 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert true, 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert true, 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert true, 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false, 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert false 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat("#,##0.###", new DecimalFormatSymbols(new ULocale("en_US"))); 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setParseStrict(true); 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < data.length; i++) { 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.parse(data[i]); 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!expected[i]) { 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: ParseException must be thrown for string " + data[i]); 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (expected[i]) { 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: ParseException must not be thrown for string " + data[i]); 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test case for ticket#5698 - parsing extremely large/small values 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT5698() { 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String[] data = { 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345679E66666666666666666", 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-12345679E66666666666666666", 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".1E2147483648", // exponent > max int 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".1E2147483647", // exponent == max int 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".1E-2147483648", // exponent == min int 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".1E-2147483649", // exponent < min int 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.23E350", // value > max double 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.23E300", // value < max double 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-1.23E350", // value < min double 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-1.23E300", // value > min double 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "4.9E-324", // value = smallest non-zero double 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.0E-325", // 0 < value < smallest non-zero positive double0 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-1.0E-325", // 0 > value > largest non-zero negative double 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final double[] expected = { 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.POSITIVE_INFINITY, 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.NEGATIVE_INFINITY, 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.POSITIVE_INFINITY, 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.POSITIVE_INFINITY, 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0, 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0, 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.POSITIVE_INFINITY, 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.23e300d, 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.NEGATIVE_INFINITY, 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -1.23e300d, 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4.9e-324d, 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0, 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -0.0, 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getInstance(); 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < data.length; i++) { 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nfmt.parse(data[i]); 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (expected[i] != n.doubleValue()) { 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: Parsed result for " + data[i] + ": " 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + n.doubleValue() + " / expected: " + expected[i]); 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: ParseException is thrown for " + data[i]); 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSurrogatesParsing() { // Test parsing of numbers that use digits from the supplemental planes. 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String[] data = { 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1\ud801\udca2,3\ud801\udca45.67", // 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\ud801\udca1\ud801\udca2,\ud801\udca3\ud801\udca4\ud801\udca5.\ud801\udca6\ud801\udca7\ud801\udca8", // 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\ud835\udfd2.\ud835\udfd7E-\ud835\udfd1", 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\ud835\udfd3.8E-0\ud835\udfd0" 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final double[] expected = { 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12345.67, 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12345.678, 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0049, 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.058 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getInstance(); 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < data.length; i++) { 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nfmt.parse(data[i]); 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (expected[i] != n.doubleValue()) { 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: Parsed result for " + data[i] + ": " 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + n.doubleValue() + " / expected: " + expected[i]); 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failed: ParseException is thrown for " + data[i]); 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void checkNBSPPatternRtNum(String testcase, NumberFormat nf, double myNumber) { 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String myString = nf.format(myNumber); 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double aNumber; 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert aNumber = nf.parse(myString).doubleValue(); 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // TODO Auto-generated catch block 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + testcase +" - failed to parse. " + e.toString()); 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(Math.abs(aNumber-myNumber)>.001) { 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n"); 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n"); 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void checkNBSPPatternRT(String testcase, NumberFormat nf) { 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNBSPPatternRtNum(testcase, nf, 12345.); 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNBSPPatternRtNum(testcase, nf, -12345.); 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNBSPInPattern() { 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = null; 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String testcase; 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testcase="ar_AE UNUM_CURRENCY"; 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getCurrencyInstance(new ULocale("ar_AE")); 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNBSPPatternRT(testcase, nf); 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // if we don't have CLDR 1.6 data, bring out the problem anyways 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String SPECIAL_PATTERN = "\u00A4\u00A4'\u062f.\u0625.\u200f\u00a0'###0.00"; 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testcase = "ar_AE special pattern: " + SPECIAL_PATTERN; 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = new DecimalFormat(); 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ((DecimalFormat)nf).applyPattern(SPECIAL_PATTERN); 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNBSPPatternRT(testcase, nf); 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test case for #9293 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Parsing currency in strict mode 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT9293() { 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(); 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(true); 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int val = 123456; 3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String txt = fmt.format(123456); 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = fmt.parse(txt, pos); 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getErrorIndex() >= 0) { 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Parsing " + txt + " - error index: " + pos.getErrorIndex()); 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (val != num.intValue()) { 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Parsed result: " + num + " - expected: " + val); 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 379