2 *******************************************************************************
\r
3 * Copyright (C) 2001-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
9 * Port From: ICU4C v1.8.1 : format : NumberFormatRegressionTest
\r
10 * Source File: $ICU4CRoot/source/test/intltest/numrgts.cpp
\r
13 package com.ibm.icu.dev.test.format;
\r
15 import java.io.ByteArrayInputStream;
\r
16 import java.io.IOException;
\r
17 import java.io.ObjectInputStream;
\r
18 import java.text.ParseException;
\r
19 import java.util.Date;
\r
20 import java.util.Locale;
\r
22 import com.ibm.icu.text.DateFormat;
\r
23 import com.ibm.icu.text.DecimalFormat;
\r
24 import com.ibm.icu.text.DecimalFormatSymbols;
\r
25 import com.ibm.icu.text.NumberFormat;
\r
26 import com.ibm.icu.util.Calendar;
\r
27 import com.ibm.icu.util.ULocale;
\r
30 * Performs regression test for MessageFormat
\r
32 public class NumberFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk {
\r
34 public static void main(String[] args) throws Exception{
\r
35 new NumberFormatRegressionTest().run(args);
\r
39 * alphaWorks upgrade
\r
41 public void Test4161100() {
\r
42 NumberFormat nf = NumberFormat.getInstance(Locale.US);
\r
43 nf.setMinimumFractionDigits(1);
\r
44 nf.setMaximumFractionDigits(1);
\r
46 String s = nf.format(a);
\r
48 ((DecimalFormat) nf).toPattern() + " = " + s);
\r
49 if (!s.equals("-0.1")) {
\r
55 * DateFormat should call setIntegerParseOnly(TRUE) on adopted
\r
56 * NumberFormat objects.
\r
58 public void TestJ691() {
\r
60 Locale loc = new Locale("fr", "CH");
\r
62 // set up the input date string & expected output
\r
63 String udt = "11.10.2000";
\r
64 String exp = "11.10.00";
\r
66 // create a Calendar for this locale
\r
67 Calendar cal = Calendar.getInstance(loc);
\r
69 // create a NumberFormat for this locale
\r
70 NumberFormat nf = NumberFormat.getInstance(loc);
\r
72 // *** Here's the key: We don't want to have to do THIS:
\r
73 //nf.setParseIntegerOnly(true);
\r
75 // create the DateFormat
\r
76 DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc);
\r
78 df.setCalendar(cal);
\r
79 df.setNumberFormat(nf);
\r
81 // set parsing to lenient & parse
\r
82 Date ulocdat = new Date();
\r
83 df.setLenient(true);
\r
85 ulocdat = df.parse(udt);
\r
86 } catch (java.text.ParseException pe) {
\r
87 errln(pe.getMessage());
\r
89 // format back to a string
\r
90 String outString = df.format(ulocdat);
\r
92 if (!outString.equals(exp)) {
\r
93 errln("FAIL: " + udt + " => " + outString);
\r
98 * Test getIntegerInstance();
\r
100 public void Test4408066() {
\r
102 NumberFormat nf1 = NumberFormat.getIntegerInstance();
\r
103 NumberFormat nf2 = NumberFormat.getIntegerInstance(Locale.CHINA);
\r
105 //test isParseIntegerOnly
\r
106 if (!nf1.isParseIntegerOnly() || !nf2.isParseIntegerOnly()) {
\r
107 errln("Failed : Integer Number Format Instance should set setParseIntegerOnly(true)");
\r
113 -3.75, -2.5, -1.5,
\r
118 String[] expected = {
\r
125 for (int i = 0; i < data.length; ++i) {
\r
126 String result = nf1.format(data[i]);
\r
127 if (!result.equals(expected[i])) {
\r
128 errln("Failed => Source: " + Double.toString(data[i])
\r
129 + ";Formatted : " + result
\r
130 + ";but expectted: " + expected[i]);
\r
134 //Test parse, Parsing should stop at "."
\r
137 "-3.75", "-2.5", "-1.5",
\r
138 "-1.25", "0", "1.0",
\r
139 "1.25", "1.5", "2.5",
\r
140 "3.75", "10.0", "255.5"
\r
142 long[] expected = {
\r
149 for (int i = 0; i < data.length; ++i) {
\r
152 n = nf1.parse(data[i]);
\r
153 } catch (ParseException e) {
\r
154 errln("Failed: " + e.getMessage());
\r
156 if (!(n instanceof Long) || (n instanceof Integer)) {
\r
157 errln("Failed: Integer Number Format should parse string to Long/Integer");
\r
159 if (n.longValue() != expected[i]) {
\r
160 errln("Failed=> Source: " + data[i]
\r
161 + ";result : " + n.toString()
\r
162 + ";expected :" + Long.toString(expected[i]));
\r
168 //Test New serialized DecimalFormat(2.0) read old serialized forms of DecimalFormat(1.3.1.1)
\r
169 public void TestSerialization() throws IOException{
\r
170 byte[][] contents = NumberFormatSerialTestData.getContent();
\r
171 double data = 1234.56;
\r
172 String[] expected = {
\r
173 "1,234.56", "$1,234.56", "123,456%", "1.23456E3"};
\r
174 for (int i = 0; i < 4; ++i) {
\r
175 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(contents[i]));
\r
177 NumberFormat format = (NumberFormat) ois.readObject();
\r
178 String result = format.format(data);
\r
179 if (result.equals(expected[i])) {
\r
180 logln("OK: Deserialized bogus NumberFormat(new version read old version)");
\r
182 errln("FAIL: the test data formats are not euqal");
\r
184 } catch (Exception e) {
\r
185 warnln("FAIL: " + e.getMessage());
\r
191 * Test case for JB#5509, strict parsing issue
\r
193 public void TestJB5509() {
\r
207 boolean[] expected = { // false for expected parse failure
\r
222 DecimalFormat df = new DecimalFormat("#,##0.###", new DecimalFormatSymbols(new ULocale("en_US")));
\r
223 df.setParseStrict(true);
\r
224 for (int i = 0; i < data.length; i++) {
\r
227 if (!expected[i]) {
\r
228 errln("Failed: ParseException must be thrown for string " + data[i]);
\r
230 } catch (ParseException pe) {
\r
232 errln("Failed: ParseException must not be thrown for string " + data[i]);
\r
239 * Test case for ticket#5698 - parsing extremely large/small values
\r
241 public void TestT5698() {
\r
242 final String[] data = {
\r
243 "12345679E66666666666666666",
\r
244 "-12345679E66666666666666666",
\r
245 ".1E2147483648", // exponent > max int
\r
246 ".1E2147483647", // exponent == max int
\r
247 ".1E-2147483648", // exponent == min int
\r
248 ".1E-2147483649", // exponent < min int
\r
249 "1.23E350", // value > max double
\r
250 "1.23E300", // value < max double
\r
251 "-1.23E350", // value < min double
\r
252 "-1.23E300", // value > min double
\r
253 "4.9E-324", // value = smallest non-zero double
\r
254 "1.0E-325", // 0 < value < smallest non-zero positive double0
\r
255 "-1.0E-325", // 0 > value > largest non-zero negative double
\r
257 final double[] expected = {
\r
258 Double.POSITIVE_INFINITY,
\r
259 Double.NEGATIVE_INFINITY,
\r
260 Double.POSITIVE_INFINITY,
\r
261 Double.POSITIVE_INFINITY,
\r
264 Double.POSITIVE_INFINITY,
\r
266 Double.NEGATIVE_INFINITY,
\r
273 NumberFormat nfmt = NumberFormat.getInstance();
\r
275 for (int i = 0; i < data.length; i++) {
\r
277 Number n = nfmt.parse(data[i]);
\r
278 if (expected[i] != n.doubleValue()) {
\r
279 errln("Failed: Parsed result for " + data[i] + ": "
\r
280 + n.doubleValue() + " / expected: " + expected[i]);
\r
282 } catch (ParseException pe) {
\r
283 errln("Failed: ParseException is thrown for " + data[i]);
\r
288 void checkNBSPPatternRtNum(String testcase, NumberFormat nf, double myNumber) {
\r
289 String myString = nf.format(myNumber);
\r
293 aNumber = nf.parse(myString).doubleValue();
\r
294 } catch (ParseException e) {
\r
295 // TODO Auto-generated catch block
\r
296 errln("FAIL: " + testcase +" - failed to parse. " + e.toString());
\r
299 if(Math.abs(aNumber-myNumber)>.001) {
\r
300 errln("FAIL: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");
\r
302 logln("PASS: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");
\r
306 void checkNBSPPatternRT(String testcase, NumberFormat nf) {
\r
307 checkNBSPPatternRtNum(testcase, nf, 12345.);
\r
308 checkNBSPPatternRtNum(testcase, nf, -12345.);
\r
311 public void TestNBSPInPattern() {
\r
312 NumberFormat nf = null;
\r
316 testcase="ar_AE UNUM_CURRENCY";
\r
317 nf = NumberFormat.getCurrencyInstance(new ULocale("ar_AE"));
\r
318 checkNBSPPatternRT(testcase, nf);
\r
319 // if we don't have CLDR 1.6 data, bring out the problem anyways
\r
321 String SPECIAL_PATTERN = "\u00A4\u00A4'\u062f.\u0625.\u200f\u00a0'###0.00";
\r
322 testcase = "ar_AE special pattern: " + SPECIAL_PATTERN;
\r
323 nf = new DecimalFormat();
\r
324 ((DecimalFormat)nf).applyPattern(SPECIAL_PATTERN);
\r
325 checkNBSPPatternRT(testcase, nf);
\r