OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 1997-2015, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 | |
7 #include "unicode/utypes.h" | |
8 | |
9 #if !UCONFIG_NO_FORMATTING | |
10 | |
11 #include "dcfmapts.h" | |
12 | |
13 #include "unicode/currpinf.h" | |
14 #include "unicode/dcfmtsym.h" | |
15 #include "unicode/decimfmt.h" | |
16 #include "unicode/fmtable.h" | |
17 #include "unicode/localpointer.h" | |
18 #include "unicode/parseerr.h" | |
19 #include "unicode/stringpiece.h" | |
20 | |
21 #include "putilimp.h" | |
22 #include "plurrule_impl.h" | |
23 #include <stdio.h> | |
24 | |
25 // This is an API test, not a unit test. It doesn't test very many cases, and d
oesn't | |
26 // try to test the full functionality. It just calls each function in the class
and | |
27 // verifies that it works on a basic level. | |
28 | |
29 void IntlTestDecimalFormatAPI::runIndexedTest( int32_t index, UBool exec, const
char* &name, char* /*par*/ ) | |
30 { | |
31 if (exec) logln((UnicodeString)"TestSuite DecimalFormatAPI"); | |
32 switch (index) { | |
33 case 0: name = "DecimalFormat API test"; | |
34 if (exec) { | |
35 logln((UnicodeString)"DecimalFormat API test---"); logln((Un
icodeString)""); | |
36 UErrorCode status = U_ZERO_ERROR; | |
37 Locale saveLocale; | |
38 Locale::setDefault(Locale::getEnglish(), status); | |
39 if(U_FAILURE(status)) { | |
40 errln((UnicodeString)"ERROR: Could not set default local
e, test may not give correct results"); | |
41 } | |
42 testAPI(/*par*/); | |
43 Locale::setDefault(saveLocale, status); | |
44 } | |
45 break; | |
46 case 1: name = "Rounding test"; | |
47 if(exec) { | |
48 logln((UnicodeString)"DecimalFormat Rounding test---"); | |
49 testRounding(/*par*/); | |
50 } | |
51 break; | |
52 case 2: name = "Test6354"; | |
53 if(exec) { | |
54 logln((UnicodeString)"DecimalFormat Rounding Increment test---"); | |
55 testRoundingInc(/*par*/); | |
56 } | |
57 break; | |
58 case 3: name = "TestCurrencyPluralInfo"; | |
59 if(exec) { | |
60 logln((UnicodeString)"CurrencyPluralInfo API test---"); | |
61 TestCurrencyPluralInfo(); | |
62 } | |
63 break; | |
64 case 4: name = "TestScale"; | |
65 if(exec) { | |
66 logln((UnicodeString)"Scale test---"); | |
67 TestScale(); | |
68 } | |
69 break; | |
70 case 5: name = "TestFixedDecimal"; | |
71 if(exec) { | |
72 logln((UnicodeString)"TestFixedDecimal ---"); | |
73 TestFixedDecimal(); | |
74 } | |
75 break; | |
76 case 6: name = "TestBadFastpath"; | |
77 if(exec) { | |
78 logln((UnicodeString)"TestBadFastpath ---"); | |
79 TestBadFastpath(); | |
80 } | |
81 break; | |
82 case 7: name = "TestRequiredDecimalPoint"; | |
83 if(exec) { | |
84 logln((UnicodeString)"TestRequiredDecimalPoint ---"); | |
85 TestRequiredDecimalPoint(); | |
86 } | |
87 break; | |
88 default: name = ""; break; | |
89 } | |
90 } | |
91 | |
92 /** | |
93 * This test checks various generic API methods in DecimalFormat to achieve 100% | |
94 * API coverage. | |
95 */ | |
96 void IntlTestDecimalFormatAPI::testAPI(/*char *par*/) | |
97 { | |
98 UErrorCode status = U_ZERO_ERROR; | |
99 | |
100 // ======= Test constructors | |
101 | |
102 logln((UnicodeString)"Testing DecimalFormat constructors"); | |
103 | |
104 DecimalFormat def(status); | |
105 if(U_FAILURE(status)) { | |
106 errcheckln(status, "ERROR: Could not create DecimalFormat (default) - %s
", u_errorName(status)); | |
107 return; | |
108 } | |
109 | |
110 // bug 10864 | |
111 status = U_ZERO_ERROR; | |
112 DecimalFormat noGrouping("###0.##", status); | |
113 if (noGrouping.getGroupingSize() != 0) { | |
114 errln("Grouping size should be 0 for no grouping."); | |
115 } | |
116 noGrouping.setGroupingUsed(TRUE); | |
117 if (noGrouping.getGroupingSize() != 0) { | |
118 errln("Grouping size should still be 0."); | |
119 } | |
120 // end bug 10864 | |
121 | |
122 status = U_ZERO_ERROR; | |
123 const UnicodeString pattern("#,##0.# FF"); | |
124 DecimalFormat pat(pattern, status); | |
125 if(U_FAILURE(status)) { | |
126 errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern)"); | |
127 return; | |
128 } | |
129 | |
130 status = U_ZERO_ERROR; | |
131 DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getFrench()
, status); | |
132 if(U_FAILURE(status)) { | |
133 errln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Fren
ch)"); | |
134 return; | |
135 } | |
136 | |
137 status = U_ZERO_ERROR; | |
138 DecimalFormat cust1(pattern, symbols, status); | |
139 if(U_FAILURE(status)) { | |
140 errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, sy
mbols*)"); | |
141 } | |
142 | |
143 status = U_ZERO_ERROR; | |
144 DecimalFormat cust2(pattern, *symbols, status); | |
145 if(U_FAILURE(status)) { | |
146 errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, sy
mbols)"); | |
147 } | |
148 | |
149 DecimalFormat copy(pat); | |
150 | |
151 // ======= Test clone(), assignment, and equality | |
152 | |
153 logln((UnicodeString)"Testing clone(), assignment and equality operators"); | |
154 | |
155 if( ! (copy == pat) || copy != pat) { | |
156 errln((UnicodeString)"ERROR: Copy constructor or == failed"); | |
157 } | |
158 | |
159 copy = cust1; | |
160 if(copy != cust1) { | |
161 errln((UnicodeString)"ERROR: Assignment (or !=) failed"); | |
162 } | |
163 | |
164 Format *clone = def.clone(); | |
165 if( ! (*clone == def) ) { | |
166 errln((UnicodeString)"ERROR: Clone() failed"); | |
167 } | |
168 delete clone; | |
169 | |
170 // ======= Test various format() methods | |
171 | |
172 logln((UnicodeString)"Testing various format() methods"); | |
173 | |
174 double d = -10456.0037; | |
175 int32_t l = 100000000; | |
176 Formattable fD(d); | |
177 Formattable fL(l); | |
178 | |
179 UnicodeString res1, res2, res3, res4; | |
180 FieldPosition pos1(0), pos2(0), pos3(0), pos4(0); | |
181 | |
182 res1 = def.format(d, res1, pos1); | |
183 logln( (UnicodeString) "" + (int32_t) d + " formatted to " + res1); | |
184 | |
185 res2 = pat.format(l, res2, pos2); | |
186 logln((UnicodeString) "" + (int32_t) l + " formatted to " + res2); | |
187 | |
188 status = U_ZERO_ERROR; | |
189 res3 = cust1.format(fD, res3, pos3, status); | |
190 if(U_FAILURE(status)) { | |
191 errln((UnicodeString)"ERROR: format(Formattable [double]) failed"); | |
192 } | |
193 logln((UnicodeString) "" + (int32_t) fD.getDouble() + " formatted to " + res
3); | |
194 | |
195 status = U_ZERO_ERROR; | |
196 res4 = cust2.format(fL, res4, pos4, status); | |
197 if(U_FAILURE(status)) { | |
198 errln((UnicodeString)"ERROR: format(Formattable [long]) failed"); | |
199 } | |
200 logln((UnicodeString) "" + fL.getLong() + " formatted to " + res4); | |
201 | |
202 // ======= Test parse() | |
203 | |
204 logln((UnicodeString)"Testing parse()"); | |
205 | |
206 UnicodeString text("-10,456.0037"); | |
207 Formattable result1, result2; | |
208 ParsePosition pos(0); | |
209 UnicodeString patt("#,##0.#"); | |
210 status = U_ZERO_ERROR; | |
211 pat.applyPattern(patt, status); | |
212 if(U_FAILURE(status)) { | |
213 errln((UnicodeString)"ERROR: applyPattern() failed"); | |
214 } | |
215 pat.parse(text, result1, pos); | |
216 if(result1.getType() != Formattable::kDouble && result1.getDouble() != d) { | |
217 errln((UnicodeString)"ERROR: Roundtrip failed (via parse()) for " + text
); | |
218 } | |
219 logln(text + " parsed into " + (int32_t) result1.getDouble()); | |
220 | |
221 status = U_ZERO_ERROR; | |
222 pat.parse(text, result2, status); | |
223 if(U_FAILURE(status)) { | |
224 errln((UnicodeString)"ERROR: parse() failed"); | |
225 } | |
226 if(result2.getType() != Formattable::kDouble && result2.getDouble() != d) { | |
227 errln((UnicodeString)"ERROR: Roundtrip failed (via parse()) for " + text
); | |
228 } | |
229 logln(text + " parsed into " + (int32_t) result2.getDouble()); | |
230 | |
231 // ======= Test getters and setters | |
232 | |
233 logln((UnicodeString)"Testing getters and setters"); | |
234 | |
235 const DecimalFormatSymbols *syms = pat.getDecimalFormatSymbols(); | |
236 DecimalFormatSymbols *newSyms = new DecimalFormatSymbols(*syms); | |
237 def.setDecimalFormatSymbols(*newSyms); | |
238 def.adoptDecimalFormatSymbols(newSyms); // don't use newSyms after this | |
239 if( *(pat.getDecimalFormatSymbols()) != *(def.getDecimalFormatSymbols())) { | |
240 errln((UnicodeString)"ERROR: adopt or set DecimalFormatSymbols() failed"
); | |
241 } | |
242 | |
243 UnicodeString posPrefix; | |
244 pat.setPositivePrefix("+"); | |
245 posPrefix = pat.getPositivePrefix(posPrefix); | |
246 logln((UnicodeString)"Positive prefix (should be +): " + posPrefix); | |
247 if(posPrefix != "+") { | |
248 errln((UnicodeString)"ERROR: setPositivePrefix() failed"); | |
249 } | |
250 | |
251 UnicodeString negPrefix; | |
252 pat.setNegativePrefix("-"); | |
253 negPrefix = pat.getNegativePrefix(negPrefix); | |
254 logln((UnicodeString)"Negative prefix (should be -): " + negPrefix); | |
255 if(negPrefix != "-") { | |
256 errln((UnicodeString)"ERROR: setNegativePrefix() failed"); | |
257 } | |
258 | |
259 UnicodeString posSuffix; | |
260 pat.setPositiveSuffix("_"); | |
261 posSuffix = pat.getPositiveSuffix(posSuffix); | |
262 logln((UnicodeString)"Positive suffix (should be _): " + posSuffix); | |
263 if(posSuffix != "_") { | |
264 errln((UnicodeString)"ERROR: setPositiveSuffix() failed"); | |
265 } | |
266 | |
267 UnicodeString negSuffix; | |
268 pat.setNegativeSuffix("~"); | |
269 negSuffix = pat.getNegativeSuffix(negSuffix); | |
270 logln((UnicodeString)"Negative suffix (should be ~): " + negSuffix); | |
271 if(negSuffix != "~") { | |
272 errln((UnicodeString)"ERROR: setNegativeSuffix() failed"); | |
273 } | |
274 | |
275 int32_t multiplier = 0; | |
276 pat.setMultiplier(8); | |
277 multiplier = pat.getMultiplier(); | |
278 logln((UnicodeString)"Multiplier (should be 8): " + multiplier); | |
279 if(multiplier != 8) { | |
280 errln((UnicodeString)"ERROR: setMultiplier() failed"); | |
281 } | |
282 | |
283 int32_t groupingSize = 0; | |
284 pat.setGroupingSize(2); | |
285 groupingSize = pat.getGroupingSize(); | |
286 logln((UnicodeString)"Grouping size (should be 2): " + (int32_t) groupingSiz
e); | |
287 if(groupingSize != 2) { | |
288 errln((UnicodeString)"ERROR: setGroupingSize() failed"); | |
289 } | |
290 | |
291 pat.setDecimalSeparatorAlwaysShown(TRUE); | |
292 UBool tf = pat.isDecimalSeparatorAlwaysShown(); | |
293 logln((UnicodeString)"DecimalSeparatorIsAlwaysShown (should be TRUE) is " +
(UnicodeString) (tf ? "TRUE" : "FALSE")); | |
294 if(tf != TRUE) { | |
295 errln((UnicodeString)"ERROR: setDecimalSeparatorAlwaysShown() failed"); | |
296 } | |
297 // Added by Ken Liu testing set/isExponentSignAlwaysShown | |
298 pat.setExponentSignAlwaysShown(TRUE); | |
299 UBool esas = pat.isExponentSignAlwaysShown(); | |
300 logln((UnicodeString)"ExponentSignAlwaysShown (should be TRUE) is " + (Unico
deString) (esas ? "TRUE" : "FALSE")); | |
301 if(esas != TRUE) { | |
302 errln((UnicodeString)"ERROR: ExponentSignAlwaysShown() failed"); | |
303 } | |
304 | |
305 // Added by Ken Liu testing set/isScientificNotation | |
306 pat.setScientificNotation(TRUE); | |
307 UBool sn = pat.isScientificNotation(); | |
308 logln((UnicodeString)"isScientificNotation (should be TRUE) is " + (UnicodeS
tring) (sn ? "TRUE" : "FALSE")); | |
309 if(sn != TRUE) { | |
310 errln((UnicodeString)"ERROR: setScientificNotation() failed"); | |
311 } | |
312 | |
313 // Added by Ken Liu testing set/getMinimumExponentDigits | |
314 int8_t MinimumExponentDigits = 0; | |
315 pat.setMinimumExponentDigits(2); | |
316 MinimumExponentDigits = pat.getMinimumExponentDigits(); | |
317 logln((UnicodeString)"MinimumExponentDigits (should be 2) is " + (int8_t) Mi
nimumExponentDigits); | |
318 if(MinimumExponentDigits != 2) { | |
319 errln((UnicodeString)"ERROR: setMinimumExponentDigits() failed"); | |
320 } | |
321 | |
322 // Added by Ken Liu testing set/getRoundingIncrement | |
323 double RoundingIncrement = 0.0; | |
324 pat.setRoundingIncrement(2.0); | |
325 RoundingIncrement = pat.getRoundingIncrement(); | |
326 logln((UnicodeString)"RoundingIncrement (should be 2.0) is " + (double) Roun
dingIncrement); | |
327 if(RoundingIncrement != 2.0) { | |
328 errln((UnicodeString)"ERROR: setRoundingIncrement() failed"); | |
329 } | |
330 //end of Ken's Adding | |
331 | |
332 UnicodeString funkyPat; | |
333 funkyPat = pat.toPattern(funkyPat); | |
334 logln((UnicodeString)"Pattern is " + funkyPat); | |
335 | |
336 UnicodeString locPat; | |
337 locPat = pat.toLocalizedPattern(locPat); | |
338 logln((UnicodeString)"Localized pattern is " + locPat); | |
339 | |
340 // ======= Test applyPattern() | |
341 | |
342 logln((UnicodeString)"Testing applyPattern()"); | |
343 | |
344 UnicodeString p1("#,##0.0#;(#,##0.0#)"); | |
345 logln((UnicodeString)"Applying pattern " + p1); | |
346 status = U_ZERO_ERROR; | |
347 pat.applyPattern(p1, status); | |
348 if(U_FAILURE(status)) { | |
349 errln((UnicodeString)"ERROR: applyPattern() failed with " + (int32_t) st
atus); | |
350 } | |
351 UnicodeString s2; | |
352 s2 = pat.toPattern(s2); | |
353 logln((UnicodeString)"Extracted pattern is " + s2); | |
354 if(s2 != p1) { | |
355 errln((UnicodeString)"ERROR: toPattern() result did not match pattern ap
plied"); | |
356 } | |
357 | |
358 if(pat.getSecondaryGroupingSize() != 0) { | |
359 errln("FAIL: Secondary Grouping Size should be 0, not %d\n", pat.getSeco
ndaryGroupingSize()); | |
360 } | |
361 | |
362 if(pat.getGroupingSize() != 3) { | |
363 errln("FAIL: Primary Grouping Size should be 3, not %d\n", pat.getGroupi
ngSize()); | |
364 } | |
365 | |
366 UnicodeString p2("#,##,##0.0# FF;(#,##,##0.0# FF)"); | |
367 logln((UnicodeString)"Applying pattern " + p2); | |
368 status = U_ZERO_ERROR; | |
369 pat.applyLocalizedPattern(p2, status); | |
370 if(U_FAILURE(status)) { | |
371 errln((UnicodeString)"ERROR: applyPattern() failed with " + (int32_t) st
atus); | |
372 } | |
373 UnicodeString s3; | |
374 s3 = pat.toLocalizedPattern(s3); | |
375 logln((UnicodeString)"Extracted pattern is " + s3); | |
376 if(s3 != p2) { | |
377 errln((UnicodeString)"ERROR: toLocalizedPattern() result did not match p
attern applied"); | |
378 } | |
379 | |
380 status = U_ZERO_ERROR; | |
381 UParseError pe; | |
382 pat.applyLocalizedPattern(p2, pe, status); | |
383 if(U_FAILURE(status)) { | |
384 errln((UnicodeString)"ERROR: applyPattern((with ParseError)) failed with
" + (int32_t) status); | |
385 } | |
386 UnicodeString s4; | |
387 s4 = pat.toLocalizedPattern(s3); | |
388 logln((UnicodeString)"Extracted pattern is " + s4); | |
389 if(s4 != p2) { | |
390 errln((UnicodeString)"ERROR: toLocalizedPattern(with ParseErr) result di
d not match pattern applied"); | |
391 } | |
392 | |
393 if(pat.getSecondaryGroupingSize() != 2) { | |
394 errln("FAIL: Secondary Grouping Size should be 2, not %d\n", pat.getSeco
ndaryGroupingSize()); | |
395 } | |
396 | |
397 if(pat.getGroupingSize() != 3) { | |
398 errln("FAIL: Primary Grouping Size should be 3, not %d\n", pat.getGroupi
ngSize()); | |
399 } | |
400 | |
401 // ======= Test getStaticClassID() | |
402 | |
403 logln((UnicodeString)"Testing getStaticClassID()"); | |
404 | |
405 status = U_ZERO_ERROR; | |
406 NumberFormat *test = new DecimalFormat(status); | |
407 if(U_FAILURE(status)) { | |
408 errln((UnicodeString)"ERROR: Couldn't create a DecimalFormat"); | |
409 } | |
410 | |
411 if(test->getDynamicClassID() != DecimalFormat::getStaticClassID()) { | |
412 errln((UnicodeString)"ERROR: getDynamicClassID() didn't return the expec
ted value"); | |
413 } | |
414 | |
415 delete test; | |
416 } | |
417 | |
418 void IntlTestDecimalFormatAPI::TestCurrencyPluralInfo(){ | |
419 UErrorCode status = U_ZERO_ERROR; | |
420 | |
421 CurrencyPluralInfo *cpi = new CurrencyPluralInfo(status); | |
422 if(U_FAILURE(status)) { | |
423 errln((UnicodeString)"ERROR: CurrencyPluralInfo(UErrorCode) could not be
created"); | |
424 } | |
425 | |
426 CurrencyPluralInfo cpi1 = *cpi; | |
427 | |
428 if(cpi->getDynamicClassID() != CurrencyPluralInfo::getStaticClassID()){ | |
429 errln((UnicodeString)"ERROR: CurrencyPluralInfo::getDynamicClassID() did
n't return the expected value"); | |
430 } | |
431 | |
432 cpi->setCurrencyPluralPattern("","",status); | |
433 if(U_FAILURE(status)) { | |
434 errln((UnicodeString)"ERROR: CurrencyPluralInfo::setCurrencyPluralPatter
n"); | |
435 } | |
436 | |
437 cpi->setLocale(Locale::getCanada(), status); | |
438 if(U_FAILURE(status)) { | |
439 errln((UnicodeString)"ERROR: CurrencyPluralInfo::setLocale"); | |
440 } | |
441 | |
442 cpi->setPluralRules("",status); | |
443 if(U_FAILURE(status)) { | |
444 errln((UnicodeString)"ERROR: CurrencyPluralInfo::setPluralRules"); | |
445 } | |
446 | |
447 DecimalFormat *df = new DecimalFormat(status); | |
448 if(U_FAILURE(status)) { | |
449 errcheckln(status, "ERROR: Could not create DecimalFormat - %s", u_error
Name(status)); | |
450 return; | |
451 } | |
452 | |
453 df->adoptCurrencyPluralInfo(cpi); | |
454 | |
455 df->getCurrencyPluralInfo(); | |
456 | |
457 df->setCurrencyPluralInfo(cpi1); | |
458 | |
459 delete df; | |
460 } | |
461 | |
462 void IntlTestDecimalFormatAPI::testRounding(/*char *par*/) | |
463 { | |
464 UErrorCode status = U_ZERO_ERROR; | |
465 double Roundingnumber = 2.55; | |
466 double Roundingnumber1 = -2.55; | |
467 //+2.55 results -2.55 results | |
468 double result[]={ 3.0, -2.0, // kRoundCeiling 0, | |
469 2.0, -3.0, // kRoundFloor 1, | |
470 2.0, -2.0, // kRoundDown 2, | |
471 3.0, -3.0, // kRoundUp 3, | |
472 3.0, -3.0, // kRoundHalfEven 4, | |
473 3.0, -3.0, // kRoundHalfDown 5, | |
474 3.0, -3.0 // kRoundHalfUp 6 | |
475 }; | |
476 DecimalFormat pat(status); | |
477 if(U_FAILURE(status)) { | |
478 errcheckln(status, "ERROR: Could not create DecimalFormat (default) - %s",
u_errorName(status)); | |
479 return; | |
480 } | |
481 uint16_t mode; | |
482 uint16_t i=0; | |
483 UnicodeString message; | |
484 UnicodeString resultStr; | |
485 for(mode=0;mode < 7;mode++){ | |
486 pat.setRoundingMode((DecimalFormat::ERoundingMode)mode); | |
487 if(pat.getRoundingMode() != (DecimalFormat::ERoundingMode)mode){ | |
488 errln((UnicodeString)"SetRoundingMode or GetRoundingMode failed for
mode=" + mode); | |
489 } | |
490 | |
491 | |
492 //for +2.55 with RoundingIncrement=1.0 | |
493 pat.setRoundingIncrement(1.0); | |
494 pat.format(Roundingnumber, resultStr); | |
495 message= (UnicodeString)"Round() failed: round(" + (double)Roundingnumb
er + UnicodeString(",") + mode + UnicodeString(",FALSE) with RoundingIncrement=1
.0==>"); | |
496 verify(message, resultStr, result[i++]); | |
497 message.remove(); | |
498 resultStr.remove(); | |
499 | |
500 //for -2.55 with RoundingIncrement=1.0 | |
501 pat.format(Roundingnumber1, resultStr); | |
502 message= (UnicodeString)"Round() failed: round(" + (double)Roundingnumb
er1 + UnicodeString(",") + mode + UnicodeString(",FALSE) with RoundingIncrement=
1.0==>"); | |
503 verify(message, resultStr, result[i++]); | |
504 message.remove(); | |
505 resultStr.remove(); | |
506 } | |
507 | |
508 } | |
509 void IntlTestDecimalFormatAPI::verify(const UnicodeString& message, const Unicod
eString& got, double expected){ | |
510 logln((UnicodeString)message + got + (UnicodeString)" Expected : " + expecte
d); | |
511 UnicodeString expectedStr(""); | |
512 expectedStr=expectedStr + expected; | |
513 if(got != expectedStr ) { | |
514 errln((UnicodeString)"ERROR: " + message + got + (UnicodeString)" E
xpected : " + expectedStr); | |
515 } | |
516 } | |
517 | |
518 void IntlTestDecimalFormatAPI::verifyString(const UnicodeString& message, const
UnicodeString& got, UnicodeString& expected){ | |
519 logln((UnicodeString)message + got + (UnicodeString)" Expected : " + expecte
d); | |
520 if(got != expected ) { | |
521 errln((UnicodeString)"ERROR: " + message + got + (UnicodeString)" E
xpected : " + expected); | |
522 } | |
523 } | |
524 | |
525 void IntlTestDecimalFormatAPI::testRoundingInc(/*char *par*/) | |
526 { | |
527 UErrorCode status = U_ZERO_ERROR; | |
528 DecimalFormat pat(UnicodeString("#,##0.00"),status); | |
529 if(U_FAILURE(status)) { | |
530 errcheckln(status, "ERROR: Could not create DecimalFormat (default) - %s",
u_errorName(status)); | |
531 return; | |
532 } | |
533 | |
534 // get default rounding increment | |
535 double roundingInc = pat.getRoundingIncrement(); | |
536 if (roundingInc != 0.0) { | |
537 errln((UnicodeString)"ERROR: Rounding increment not zero"); | |
538 return; | |
539 } | |
540 | |
541 // With rounding now being handled by decNumber, we no longer | |
542 // set a rounding increment to enable non-default mode rounding, | |
543 // checking of which was the original point of this test. | |
544 | |
545 // set rounding mode with zero increment. Rounding | |
546 // increment should not be set by this operation | |
547 pat.setRoundingMode((DecimalFormat::ERoundingMode)0); | |
548 roundingInc = pat.getRoundingIncrement(); | |
549 if (roundingInc != 0.0) { | |
550 errln((UnicodeString)"ERROR: Rounding increment not zero after setRounding
Mode"); | |
551 return; | |
552 } | |
553 } | |
554 | |
555 void IntlTestDecimalFormatAPI::TestScale() | |
556 { | |
557 typedef struct TestData { | |
558 double inputValue; | |
559 int inputScale; | |
560 const char *expectedOutput; | |
561 } TestData; | |
562 | |
563 static TestData testData[] = { | |
564 { 100.0, 3, "100,000" }, | |
565 { 10034.0, -2, "100.34" }, | |
566 { 0.86, -3, "0.0009" }, | |
567 { -0.000455, 1, "-0%" }, | |
568 { -0.000555, 1, "-1%" }, | |
569 { 0.000455, 1, "0%" }, | |
570 { 0.000555, 1, "1%" }, | |
571 }; | |
572 | |
573 UErrorCode status = U_ZERO_ERROR; | |
574 DecimalFormat pat(status); | |
575 if(U_FAILURE(status)) { | |
576 errcheckln(status, "ERROR: Could not create DecimalFormat (default) - %s",
u_errorName(status)); | |
577 return; | |
578 } | |
579 | |
580 UnicodeString message; | |
581 UnicodeString resultStr; | |
582 UnicodeString exp; | |
583 UnicodeString percentPattern("#,##0%"); | |
584 pat.setMaximumFractionDigits(4); | |
585 | |
586 for(int32_t i=0; i < UPRV_LENGTHOF(testData); i++) { | |
587 if ( i > 2 ) { | |
588 pat.applyPattern(percentPattern,status); | |
589 } | |
590 pat.setAttribute(UNUM_SCALE,testData[i].inputScale,status); | |
591 pat.format(testData[i].inputValue, resultStr); | |
592 message = UnicodeString("Unexpected output for ") + testData[i].inputVal
ue + UnicodeString(" and scale ") + | |
593 testData[i].inputScale + UnicodeString(". Got: "); | |
594 exp = testData[i].expectedOutput; | |
595 verifyString(message, resultStr, exp); | |
596 message.remove(); | |
597 resultStr.remove(); | |
598 exp.remove(); | |
599 } | |
600 } | |
601 | |
602 | |
603 #define ASSERT_EQUAL(expect, actual) { char tmp[200]; sprintf(tmp, "(%g==%g)", (
double)(expect), (double)(actual)); \ | |
604 assertTrue(tmp, ((expect)==(actual)), FALSE, TRUE, __FILE__, __LINE__); } | |
605 | |
606 void IntlTestDecimalFormatAPI::TestFixedDecimal() { | |
607 UErrorCode status = U_ZERO_ERROR; | |
608 | |
609 LocalPointer<DecimalFormat> df(new DecimalFormat("###", status), status); | |
610 TEST_ASSERT_STATUS(status); | |
611 if (status == U_MISSING_RESOURCE_ERROR) { | |
612 return; | |
613 } | |
614 FixedDecimal fd = df->getFixedDecimal(44, status); | |
615 TEST_ASSERT_STATUS(status); | |
616 ASSERT_EQUAL(44, fd.source); | |
617 ASSERT_EQUAL(0, fd.visibleDecimalDigitCount); | |
618 ASSERT_EQUAL(FALSE, fd.isNegative); | |
619 | |
620 fd = df->getFixedDecimal(-44, status); | |
621 TEST_ASSERT_STATUS(status); | |
622 ASSERT_EQUAL(44, fd.source); | |
623 ASSERT_EQUAL(0, fd.visibleDecimalDigitCount); | |
624 ASSERT_EQUAL(TRUE, fd.isNegative); | |
625 | |
626 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.00##", status), stat
us); | |
627 TEST_ASSERT_STATUS(status); | |
628 fd = df->getFixedDecimal(123.456, status); | |
629 TEST_ASSERT_STATUS(status); | |
630 ASSERT_EQUAL(3, fd.visibleDecimalDigitCount); // v | |
631 ASSERT_EQUAL(456, fd.decimalDigits); // f | |
632 ASSERT_EQUAL(456, fd.decimalDigitsWithoutTrailingZeros); // t | |
633 ASSERT_EQUAL(123, fd.intValue); // i | |
634 ASSERT_EQUAL(123.456, fd.source); // n | |
635 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
636 ASSERT_EQUAL(FALSE, fd.isNegative); | |
637 | |
638 fd = df->getFixedDecimal(-123.456, status); | |
639 TEST_ASSERT_STATUS(status); | |
640 ASSERT_EQUAL(3, fd.visibleDecimalDigitCount); // v | |
641 ASSERT_EQUAL(456, fd.decimalDigits); // f | |
642 ASSERT_EQUAL(456, fd.decimalDigitsWithoutTrailingZeros); // t | |
643 ASSERT_EQUAL(123, fd.intValue); // i | |
644 ASSERT_EQUAL(123.456, fd.source); // n | |
645 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
646 ASSERT_EQUAL(TRUE, fd.isNegative); | |
647 | |
648 // test max int digits | |
649 df->setMaximumIntegerDigits(2); | |
650 fd = df->getFixedDecimal(123.456, status); | |
651 TEST_ASSERT_STATUS(status); | |
652 ASSERT_EQUAL(3, fd.visibleDecimalDigitCount); // v | |
653 ASSERT_EQUAL(456, fd.decimalDigits); // f | |
654 ASSERT_EQUAL(456, fd.decimalDigitsWithoutTrailingZeros); // t | |
655 ASSERT_EQUAL(23, fd.intValue); // i | |
656 ASSERT_EQUAL(23.456, fd.source); // n | |
657 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
658 ASSERT_EQUAL(FALSE, fd.isNegative); | |
659 | |
660 fd = df->getFixedDecimal(-123.456, status); | |
661 TEST_ASSERT_STATUS(status); | |
662 ASSERT_EQUAL(3, fd.visibleDecimalDigitCount); // v | |
663 ASSERT_EQUAL(456, fd.decimalDigits); // f | |
664 ASSERT_EQUAL(456, fd.decimalDigitsWithoutTrailingZeros); // t | |
665 ASSERT_EQUAL(23, fd.intValue); // i | |
666 ASSERT_EQUAL(23.456, fd.source); // n | |
667 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
668 ASSERT_EQUAL(TRUE, fd.isNegative); | |
669 | |
670 // test max fraction digits | |
671 df->setMaximumIntegerDigits(2000000000); | |
672 df->setMaximumFractionDigits(2); | |
673 fd = df->getFixedDecimal(123.456, status); | |
674 TEST_ASSERT_STATUS(status); | |
675 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); // v | |
676 ASSERT_EQUAL(46, fd.decimalDigits); // f | |
677 ASSERT_EQUAL(46, fd.decimalDigitsWithoutTrailingZeros); // t | |
678 ASSERT_EQUAL(123, fd.intValue); // i | |
679 ASSERT_EQUAL(123.46, fd.source); // n | |
680 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
681 ASSERT_EQUAL(FALSE, fd.isNegative); | |
682 | |
683 fd = df->getFixedDecimal(-123.456, status); | |
684 TEST_ASSERT_STATUS(status); | |
685 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); // v | |
686 ASSERT_EQUAL(46, fd.decimalDigits); // f | |
687 ASSERT_EQUAL(46, fd.decimalDigitsWithoutTrailingZeros); // t | |
688 ASSERT_EQUAL(123, fd.intValue); // i | |
689 ASSERT_EQUAL(123.46, fd.source); // n | |
690 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
691 ASSERT_EQUAL(TRUE, fd.isNegative); | |
692 | |
693 // test esoteric rounding | |
694 df->setMaximumFractionDigits(6); | |
695 df->setRoundingIncrement(7.3); | |
696 | |
697 fd = df->getFixedDecimal(30.0, status); | |
698 TEST_ASSERT_STATUS(status); | |
699 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); // v | |
700 ASSERT_EQUAL(20, fd.decimalDigits); // f | |
701 ASSERT_EQUAL(2, fd.decimalDigitsWithoutTrailingZeros); // t | |
702 ASSERT_EQUAL(29, fd.intValue); // i | |
703 ASSERT_EQUAL(29.2, fd.source); // n | |
704 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
705 ASSERT_EQUAL(FALSE, fd.isNegative); | |
706 | |
707 fd = df->getFixedDecimal(-30.0, status); | |
708 TEST_ASSERT_STATUS(status); | |
709 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); // v | |
710 ASSERT_EQUAL(20, fd.decimalDigits); // f | |
711 ASSERT_EQUAL(2, fd.decimalDigitsWithoutTrailingZeros); // t | |
712 ASSERT_EQUAL(29, fd.intValue); // i | |
713 ASSERT_EQUAL(29.2, fd.source); // n | |
714 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
715 ASSERT_EQUAL(TRUE, fd.isNegative); | |
716 | |
717 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###", status), status); | |
718 TEST_ASSERT_STATUS(status); | |
719 fd = df->getFixedDecimal(123.456, status); | |
720 TEST_ASSERT_STATUS(status); | |
721 ASSERT_EQUAL(0, fd.visibleDecimalDigitCount); | |
722 ASSERT_EQUAL(0, fd.decimalDigits); | |
723 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
724 ASSERT_EQUAL(123, fd.intValue); | |
725 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
726 ASSERT_EQUAL(FALSE, fd.isNegative); | |
727 | |
728 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.0", status), status)
; | |
729 TEST_ASSERT_STATUS(status); | |
730 fd = df->getFixedDecimal(123.01, status); | |
731 TEST_ASSERT_STATUS(status); | |
732 ASSERT_EQUAL(1, fd.visibleDecimalDigitCount); | |
733 ASSERT_EQUAL(0, fd.decimalDigits); | |
734 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
735 ASSERT_EQUAL(123, fd.intValue); | |
736 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
737 ASSERT_EQUAL(FALSE, fd.isNegative); | |
738 | |
739 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.0", status), status)
; | |
740 TEST_ASSERT_STATUS(status); | |
741 fd = df->getFixedDecimal(123.06, status); | |
742 TEST_ASSERT_STATUS(status); | |
743 ASSERT_EQUAL(1, fd.visibleDecimalDigitCount); | |
744 ASSERT_EQUAL(1, fd.decimalDigits); | |
745 ASSERT_EQUAL(1, fd.decimalDigitsWithoutTrailingZeros); | |
746 ASSERT_EQUAL(123, fd.intValue); | |
747 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
748 ASSERT_EQUAL(FALSE, fd.isNegative); | |
749 | |
750 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("@@@@@", status), status)
; // Significant Digits | |
751 TEST_ASSERT_STATUS(status); | |
752 fd = df->getFixedDecimal(123, status); | |
753 TEST_ASSERT_STATUS(status); | |
754 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
755 ASSERT_EQUAL(0, fd.decimalDigits); | |
756 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
757 ASSERT_EQUAL(123, fd.intValue); | |
758 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
759 ASSERT_EQUAL(FALSE, fd.isNegative); | |
760 | |
761 df.adoptInsteadAndCheckErrorCode(new DecimalFormat("@@@@@", status), status)
; // Significant Digits | |
762 TEST_ASSERT_STATUS(status); | |
763 fd = df->getFixedDecimal(1.23, status); | |
764 TEST_ASSERT_STATUS(status); | |
765 ASSERT_EQUAL(4, fd.visibleDecimalDigitCount); | |
766 ASSERT_EQUAL(2300, fd.decimalDigits); | |
767 ASSERT_EQUAL(23, fd.decimalDigitsWithoutTrailingZeros); | |
768 ASSERT_EQUAL(1, fd.intValue); | |
769 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
770 ASSERT_EQUAL(FALSE, fd.isNegative); | |
771 | |
772 fd = df->getFixedDecimal(uprv_getInfinity(), status); | |
773 TEST_ASSERT_STATUS(status); | |
774 ASSERT_EQUAL(TRUE, fd.isNanOrInfinity); | |
775 fd = df->getFixedDecimal(0.0, status); | |
776 ASSERT_EQUAL(FALSE, fd.isNanOrInfinity); | |
777 fd = df->getFixedDecimal(uprv_getNaN(), status); | |
778 ASSERT_EQUAL(TRUE, fd.isNanOrInfinity); | |
779 TEST_ASSERT_STATUS(status); | |
780 | |
781 // Test Big Decimal input. | |
782 // 22 digits before and after decimal, will exceed the precision of a double | |
783 // and force DecimalFormat::getFixedDecimal() to work with a digit list. | |
784 df.adoptInsteadAndCheckErrorCode( | |
785 new DecimalFormat("#####################0.00####################", statu
s), status); | |
786 TEST_ASSERT_STATUS(status); | |
787 Formattable fable("12.34", status); | |
788 TEST_ASSERT_STATUS(status); | |
789 fd = df->getFixedDecimal(fable, status); | |
790 TEST_ASSERT_STATUS(status); | |
791 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
792 ASSERT_EQUAL(34, fd.decimalDigits); | |
793 ASSERT_EQUAL(34, fd.decimalDigitsWithoutTrailingZeros); | |
794 ASSERT_EQUAL(12, fd.intValue); | |
795 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
796 ASSERT_EQUAL(FALSE, fd.isNegative); | |
797 | |
798 fable.setDecimalNumber("12.345678901234567890123456789", status); | |
799 TEST_ASSERT_STATUS(status); | |
800 fd = df->getFixedDecimal(fable, status); | |
801 TEST_ASSERT_STATUS(status); | |
802 ASSERT_EQUAL(22, fd.visibleDecimalDigitCount); | |
803 ASSERT_EQUAL(345678901234567890LL, fd.decimalDigits); | |
804 ASSERT_EQUAL(34567890123456789LL, fd.decimalDigitsWithoutTrailingZeros); | |
805 ASSERT_EQUAL(12, fd.intValue); | |
806 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
807 ASSERT_EQUAL(FALSE, fd.isNegative); | |
808 | |
809 // On field overflow, Integer part is truncated on the left, fraction part o
n the right. | |
810 fable.setDecimalNumber("123456789012345678901234567890.123456789012345678901
234567890", status); | |
811 TEST_ASSERT_STATUS(status); | |
812 fd = df->getFixedDecimal(fable, status); | |
813 TEST_ASSERT_STATUS(status); | |
814 ASSERT_EQUAL(22, fd.visibleDecimalDigitCount); | |
815 ASSERT_EQUAL(123456789012345678LL, fd.decimalDigits); | |
816 ASSERT_EQUAL(123456789012345678LL, fd.decimalDigitsWithoutTrailingZeros); | |
817 ASSERT_EQUAL(345678901234567890LL, fd.intValue); | |
818 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
819 ASSERT_EQUAL(FALSE, fd.isNegative); | |
820 | |
821 // Digits way to the right of the decimal but within the format's precision
aren't truncated | |
822 fable.setDecimalNumber("1.0000000000000000000012", status); | |
823 TEST_ASSERT_STATUS(status); | |
824 fd = df->getFixedDecimal(fable, status); | |
825 TEST_ASSERT_STATUS(status); | |
826 ASSERT_EQUAL(22, fd.visibleDecimalDigitCount); | |
827 ASSERT_EQUAL(12, fd.decimalDigits); | |
828 ASSERT_EQUAL(12, fd.decimalDigitsWithoutTrailingZeros); | |
829 ASSERT_EQUAL(1, fd.intValue); | |
830 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
831 ASSERT_EQUAL(FALSE, fd.isNegative); | |
832 | |
833 // Digits beyond the precision of the format are rounded away | |
834 fable.setDecimalNumber("1.000000000000000000000012", status); | |
835 TEST_ASSERT_STATUS(status); | |
836 fd = df->getFixedDecimal(fable, status); | |
837 TEST_ASSERT_STATUS(status); | |
838 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
839 ASSERT_EQUAL(0, fd.decimalDigits); | |
840 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
841 ASSERT_EQUAL(1, fd.intValue); | |
842 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
843 ASSERT_EQUAL(FALSE, fd.isNegative); | |
844 | |
845 // Negative numbers come through | |
846 fable.setDecimalNumber("-1.0000000000000000000012", status); | |
847 TEST_ASSERT_STATUS(status); | |
848 fd = df->getFixedDecimal(fable, status); | |
849 TEST_ASSERT_STATUS(status); | |
850 ASSERT_EQUAL(22, fd.visibleDecimalDigitCount); | |
851 ASSERT_EQUAL(12, fd.decimalDigits); | |
852 ASSERT_EQUAL(12, fd.decimalDigitsWithoutTrailingZeros); | |
853 ASSERT_EQUAL(1, fd.intValue); | |
854 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
855 ASSERT_EQUAL(TRUE, fd.isNegative); | |
856 | |
857 // MinFractionDigits from format larger than from number. | |
858 fable.setDecimalNumber("1000000000000000000000.3", status); | |
859 TEST_ASSERT_STATUS(status); | |
860 fd = df->getFixedDecimal(fable, status); | |
861 TEST_ASSERT_STATUS(status); | |
862 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
863 ASSERT_EQUAL(30, fd.decimalDigits); | |
864 ASSERT_EQUAL(3, fd.decimalDigitsWithoutTrailingZeros); | |
865 ASSERT_EQUAL(100000000000000000LL, fd.intValue); | |
866 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
867 ASSERT_EQUAL(FALSE, fd.isNegative); | |
868 | |
869 fable.setDecimalNumber("1000000000000000050000.3", status); | |
870 TEST_ASSERT_STATUS(status); | |
871 fd = df->getFixedDecimal(fable, status); | |
872 TEST_ASSERT_STATUS(status); | |
873 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
874 ASSERT_EQUAL(30, fd.decimalDigits); | |
875 ASSERT_EQUAL(3, fd.decimalDigitsWithoutTrailingZeros); | |
876 ASSERT_EQUAL(50000LL, fd.intValue); | |
877 ASSERT_EQUAL(FALSE, fd.hasIntegerValue); | |
878 ASSERT_EQUAL(FALSE, fd.isNegative); | |
879 | |
880 // Test some int64_t values that are out of the range of a double | |
881 fable.setInt64(4503599627370496LL); | |
882 TEST_ASSERT_STATUS(status); | |
883 fd = df->getFixedDecimal(fable, status); | |
884 TEST_ASSERT_STATUS(status); | |
885 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
886 ASSERT_EQUAL(0, fd.decimalDigits); | |
887 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
888 ASSERT_EQUAL(4503599627370496LL, fd.intValue); | |
889 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
890 ASSERT_EQUAL(FALSE, fd.isNegative); | |
891 | |
892 fable.setInt64(4503599627370497LL); | |
893 TEST_ASSERT_STATUS(status); | |
894 fd = df->getFixedDecimal(fable, status); | |
895 TEST_ASSERT_STATUS(status); | |
896 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
897 ASSERT_EQUAL(0, fd.decimalDigits); | |
898 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
899 ASSERT_EQUAL(4503599627370497LL, fd.intValue); | |
900 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
901 ASSERT_EQUAL(FALSE, fd.isNegative); | |
902 | |
903 fable.setInt64(9223372036854775807LL); | |
904 TEST_ASSERT_STATUS(status); | |
905 fd = df->getFixedDecimal(fable, status); | |
906 TEST_ASSERT_STATUS(status); | |
907 ASSERT_EQUAL(2, fd.visibleDecimalDigitCount); | |
908 ASSERT_EQUAL(0, fd.decimalDigits); | |
909 ASSERT_EQUAL(0, fd.decimalDigitsWithoutTrailingZeros); | |
910 // note: going through DigitList path to FixedDecimal, which is trimming | |
911 // int64_t fields to 18 digits. See ticket Ticket #10374 | |
912 // ASSERT_EQUAL(223372036854775807LL, fd.intValue); | |
913 if (!(fd.intValue == 223372036854775807LL || fd.intValue == 9223372036854775
807LL)) { | |
914 dataerrln("File %s, Line %d, fd.intValue = %lld", __FILE__, __LINE__, fd
.intValue); | |
915 } | |
916 ASSERT_EQUAL(TRUE, fd.hasIntegerValue); | |
917 ASSERT_EQUAL(FALSE, fd.isNegative); | |
918 | |
919 } | |
920 | |
921 void IntlTestDecimalFormatAPI::TestBadFastpath() { | |
922 UErrorCode status = U_ZERO_ERROR; | |
923 | |
924 LocalPointer<DecimalFormat> df(new DecimalFormat("###", status), status); | |
925 if (U_FAILURE(status)) { | |
926 dataerrln("Error creating new DecimalFormat - %s", u_errorName(status)); | |
927 return; | |
928 } | |
929 | |
930 UnicodeString fmt; | |
931 fmt.remove(); | |
932 assertEquals("Format 1234", "1234", df->format(1234, fmt)); | |
933 df->setGroupingUsed(FALSE); | |
934 fmt.remove(); | |
935 assertEquals("Format 1234", "1234", df->format(1234, fmt)); | |
936 df->setGroupingUsed(TRUE); | |
937 df->setGroupingSize(3); | |
938 fmt.remove(); | |
939 assertEquals("Format 1234 w/ grouping", "1,234", df->format(1234, fmt)); | |
940 } | |
941 | |
942 void IntlTestDecimalFormatAPI::TestRequiredDecimalPoint() { | |
943 UErrorCode status = U_ZERO_ERROR; | |
944 UnicodeString text("99"); | |
945 Formattable result1; | |
946 UnicodeString pat1("##.0000"); | |
947 UnicodeString pat2("00.0"); | |
948 | |
949 LocalPointer<DecimalFormat> df(new DecimalFormat(pat1, status), status); | |
950 if (U_FAILURE(status)) { | |
951 dataerrln("Error creating new DecimalFormat - %s", u_errorName(status)); | |
952 return; | |
953 } | |
954 | |
955 status = U_ZERO_ERROR; | |
956 df->applyPattern(pat1, status); | |
957 if(U_FAILURE(status)) { | |
958 errln((UnicodeString)"ERROR: applyPattern() failed"); | |
959 } | |
960 df->parse(text, result1, status); | |
961 if(U_FAILURE(status)) { | |
962 errln((UnicodeString)"ERROR: parse() failed"); | |
963 } | |
964 df->setDecimalPatternMatchRequired(TRUE); | |
965 df->parse(text, result1, status); | |
966 if(U_SUCCESS(status)) { | |
967 errln((UnicodeString)"ERROR: unexpected parse()"); | |
968 } | |
969 | |
970 | |
971 status = U_ZERO_ERROR; | |
972 df->applyPattern(pat2, status); | |
973 df->setDecimalPatternMatchRequired(FALSE); | |
974 if(U_FAILURE(status)) { | |
975 errln((UnicodeString)"ERROR: applyPattern(2) failed"); | |
976 } | |
977 df->parse(text, result1, status); | |
978 if(U_FAILURE(status)) { | |
979 errln((UnicodeString)"ERROR: parse(2) failed - " + u_errorName(status)); | |
980 } | |
981 df->setDecimalPatternMatchRequired(TRUE); | |
982 df->parse(text, result1, status); | |
983 if(U_SUCCESS(status)) { | |
984 errln((UnicodeString)"ERROR: unexpected parse(2)"); | |
985 } | |
986 } | |
987 | |
988 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
OLD | NEW |