1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2015, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ********************************************************************/ 6 /* Modification History: 7 * Date Name Description 8 * 07/15/99 helena Ported to HPUX 10/11 CC. 9 */ 10 11 #include "unicode/utypes.h" 12 13 #if !UCONFIG_NO_FORMATTING 14 15 #include "numfmtst.h" 16 #include "unicode/dcfmtsym.h" 17 #include "unicode/decimfmt.h" 18 #include "unicode/localpointer.h" 19 #include "unicode/ucurr.h" 20 #include "unicode/ustring.h" 21 #include "unicode/measfmt.h" 22 #include "unicode/curramt.h" 23 #include "digitlst.h" 24 #include "textfile.h" 25 #include "tokiter.h" 26 #include "charstr.h" 27 #include "putilimp.h" 28 #include "winnmtst.h" 29 #include <float.h> 30 #include <string.h> 31 #include <stdlib.h> 32 #include "cstring.h" 33 #include "unicode/numsys.h" 34 #include "fmtableimp.h" 35 36 //#define NUMFMTST_CACHE_DEBUG 1 37 #include "stdio.h" /* for sprintf */ 38 // #include "iostream" // for cout 39 40 //#define NUMFMTST_DEBUG 1 41 42 static const UChar EUR[] = {69,85,82,0}; // "EUR" 43 static const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD" 44 45 46 // ***************************************************************************** 47 // class NumberFormatTest 48 // ***************************************************************************** 49 50 #define CHECK(status,str) if (U_FAILURE(status)) { errcheckln(status, UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; } 51 #define CHECK_DATA(status,str) if (U_FAILURE(status)) { dataerrln(UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; } 52 53 void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 54 { 55 TESTCASE_AUTO_BEGIN; 56 TESTCASE_AUTO(TestCurrencySign); 57 TESTCASE_AUTO(TestCurrency); 58 TESTCASE_AUTO(TestParse); 59 TESTCASE_AUTO(TestRounding487); 60 TESTCASE_AUTO(TestQuotes); 61 TESTCASE_AUTO(TestExponential); 62 TESTCASE_AUTO(TestPatterns); 63 64 // Upgrade to alphaWorks - liu 5/99 65 TESTCASE_AUTO(TestExponent); 66 TESTCASE_AUTO(TestScientific); 67 TESTCASE_AUTO(TestPad); 68 TESTCASE_AUTO(TestPatterns2); 69 TESTCASE_AUTO(TestSecondaryGrouping); 70 TESTCASE_AUTO(TestSurrogateSupport); 71 TESTCASE_AUTO(TestAPI); 72 73 TESTCASE_AUTO(TestCurrencyObject); 74 TESTCASE_AUTO(TestCurrencyPatterns); 75 //TESTCASE_AUTO(TestDigitList); 76 TESTCASE_AUTO(TestWhiteSpaceParsing); 77 TESTCASE_AUTO(TestComplexCurrency); // This test removed because CLDR no longer uses choice formats in currency symbols. 78 TESTCASE_AUTO(TestRegCurrency); 79 TESTCASE_AUTO(TestSymbolsWithBadLocale); 80 TESTCASE_AUTO(TestAdoptDecimalFormatSymbols); 81 82 TESTCASE_AUTO(TestScientific2); 83 TESTCASE_AUTO(TestScientificGrouping); 84 TESTCASE_AUTO(TestInt64); 85 86 TESTCASE_AUTO(TestPerMill); 87 TESTCASE_AUTO(TestIllegalPatterns); 88 TESTCASE_AUTO(TestCases); 89 90 TESTCASE_AUTO(TestCurrencyNames); 91 TESTCASE_AUTO(TestCurrencyAmount); 92 TESTCASE_AUTO(TestCurrencyUnit); 93 TESTCASE_AUTO(TestCoverage); 94 TESTCASE_AUTO(TestJB3832); 95 TESTCASE_AUTO(TestHost); 96 TESTCASE_AUTO(TestHostClone); 97 TESTCASE_AUTO(TestCurrencyFormat); 98 TESTCASE_AUTO(TestRounding); 99 TESTCASE_AUTO(TestNonpositiveMultiplier); 100 TESTCASE_AUTO(TestNumberingSystems); 101 TESTCASE_AUTO(TestSpaceParsing); 102 TESTCASE_AUTO(TestMultiCurrencySign); 103 TESTCASE_AUTO(TestCurrencyFormatForMixParsing); 104 TESTCASE_AUTO(TestDecimalFormatCurrencyParse); 105 TESTCASE_AUTO(TestCurrencyIsoPluralFormat); 106 TESTCASE_AUTO(TestCurrencyParsing); 107 TESTCASE_AUTO(TestParseCurrencyInUCurr); 108 TESTCASE_AUTO(TestFormatAttributes); 109 TESTCASE_AUTO(TestFieldPositionIterator); 110 TESTCASE_AUTO(TestDecimal); 111 TESTCASE_AUTO(TestCurrencyFractionDigits); 112 TESTCASE_AUTO(TestExponentParse); 113 TESTCASE_AUTO(TestExplicitParents); 114 TESTCASE_AUTO(TestLenientParse); 115 TESTCASE_AUTO(TestAvailableNumberingSystems); 116 TESTCASE_AUTO(TestRoundingPattern); 117 TESTCASE_AUTO(Test9087); 118 TESTCASE_AUTO(TestFormatFastpaths); 119 TESTCASE_AUTO(TestFormattableSize); 120 TESTCASE_AUTO(TestUFormattable); 121 TESTCASE_AUTO(TestSignificantDigits); 122 TESTCASE_AUTO(TestShowZero); 123 TESTCASE_AUTO(TestCompatibleCurrencies); 124 TESTCASE_AUTO(TestBug9936); 125 TESTCASE_AUTO(TestParseNegativeWithFaLocale); 126 TESTCASE_AUTO(TestParseNegativeWithAlternateMinusSign); 127 TESTCASE_AUTO(TestCustomCurrencySignAndSeparator); 128 TESTCASE_AUTO(TestParseSignsAndMarks); 129 TESTCASE_AUTO(Test10419RoundingWith0FractionDigits); 130 TESTCASE_AUTO(Test10468ApplyPattern); 131 TESTCASE_AUTO(TestRoundingScientific10542); 132 TESTCASE_AUTO(TestZeroScientific10547); 133 TESTCASE_AUTO(TestAccountingCurrency); 134 TESTCASE_AUTO(TestEquality); 135 TESTCASE_AUTO(TestCurrencyUsage); 136 TESTCASE_AUTO(TestDoubleLimit11439); 137 TESTCASE_AUTO(TestFastPathConsistent11524); 138 TESTCASE_AUTO_END; 139 } 140 141 // ------------------------------------- 142 143 // Test API (increase code coverage) 144 void 145 NumberFormatTest::TestAPI(void) 146 { 147 logln("Test API"); 148 UErrorCode status = U_ZERO_ERROR; 149 NumberFormat *test = NumberFormat::createInstance("root", status); 150 if(U_FAILURE(status)) { 151 dataerrln("unable to create format object - %s", u_errorName(status)); 152 } 153 if(test != NULL) { 154 test->setMinimumIntegerDigits(10); 155 test->setMaximumIntegerDigits(2); 156 157 test->setMinimumFractionDigits(10); 158 test->setMaximumFractionDigits(2); 159 160 UnicodeString result; 161 FieldPosition pos; 162 Formattable bla("Paja Patak"); // Donald Duck for non Serbian speakers 163 test->format(bla, result, pos, status); 164 if(U_SUCCESS(status)) { 165 errln("Yuck... Formatted a duck... As a number!"); 166 } else { 167 status = U_ZERO_ERROR; 168 } 169 170 result.remove(); 171 int64_t ll = 12; 172 test->format(ll, result); 173 if (result != "12.00"){ 174 errln("format int64_t error"); 175 } 176 177 ParsePosition ppos; 178 LocalPointer<CurrencyAmount> currAmt(test->parseCurrency("",ppos)); 179 // old test for (U_FAILURE(status)) was bogus here, method does not set status! 180 if (ppos.getIndex()) { 181 errln("Parsed empty string as currency"); 182 } 183 184 delete test; 185 } 186 } 187 188 class StubNumberFormat :public NumberFormat{ 189 public: 190 StubNumberFormat(){}; 191 virtual UnicodeString& format(double ,UnicodeString& appendTo,FieldPosition& ) const { 192 return appendTo; 193 } 194 virtual UnicodeString& format(int32_t ,UnicodeString& appendTo,FieldPosition& ) const { 195 return appendTo.append((UChar)0x0033); 196 } 197 virtual UnicodeString& format(int64_t number,UnicodeString& appendTo,FieldPosition& pos) const { 198 return NumberFormat::format(number, appendTo, pos); 199 } 200 virtual UnicodeString& format(const Formattable& , UnicodeString& appendTo, FieldPosition& , UErrorCode& ) const { 201 return appendTo; 202 } 203 virtual void parse(const UnicodeString& , 204 Formattable& , 205 ParsePosition& ) const {} 206 virtual void parse( const UnicodeString& , 207 Formattable& , 208 UErrorCode& ) const {} 209 virtual UClassID getDynamicClassID(void) const { 210 static char classID = 0; 211 return (UClassID)&classID; 212 } 213 virtual Format* clone() const {return NULL;} 214 }; 215 216 void 217 NumberFormatTest::TestCoverage(void){ 218 StubNumberFormat stub; 219 UnicodeString agent("agent"); 220 FieldPosition pos; 221 int64_t num = 4; 222 if (stub.format(num, agent, pos) != UnicodeString("agent3")){ 223 errln("NumberFormat::format(int64, UnicodString&, FieldPosition&) should delegate to (int32, ,)"); 224 }; 225 } 226 227 // Test various patterns 228 void 229 NumberFormatTest::TestPatterns(void) 230 { 231 UErrorCode status = U_ZERO_ERROR; 232 DecimalFormatSymbols sym(Locale::getUS(), status); 233 if (U_FAILURE(status)) { errcheckln(status, "FAIL: Could not construct DecimalFormatSymbols - %s", u_errorName(status)); return; } 234 235 const char* pat[] = { "#.#", "#.", ".#", "#" }; 236 int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); 237 const char* newpat[] = { "#0.#", "#0.", "#.0", "#" }; 238 const char* num[] = { "0", "0.", ".0", "0" }; 239 for (int32_t i=0; i<pat_length; ++i) 240 { 241 status = U_ZERO_ERROR; 242 DecimalFormat fmt(pat[i], sym, status); 243 if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: DecimalFormat constructor failed for " + pat[i]); continue; } 244 UnicodeString newp; fmt.toPattern(newp); 245 if (!(newp == newpat[i])) 246 errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] + 247 "; " + newp + " seen instead"); 248 249 UnicodeString s; (*(NumberFormat*)&fmt).format((int32_t)0, s); 250 if (!(s == num[i])) 251 { 252 errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should format zero as " + num[i] + 253 "; " + s + " seen instead"); 254 logln((UnicodeString)"Min integer digits = " + fmt.getMinimumIntegerDigits()); 255 } 256 } 257 } 258 259 /* 260 icu_2_4::DigitList::operator== 0 0 2 icuuc24d.dll digitlst.cpp Doug 261 icu_2_4::DigitList::append 0 0 4 icuin24d.dll digitlst.h Doug 262 icu_2_4::DigitList::operator!= 0 0 1 icuuc24d.dll digitlst.h Doug 263 */ 264 /* 265 void 266 NumberFormatTest::TestDigitList(void) 267 { 268 // API coverage for DigitList 269 DigitList list1; 270 list1.append('1'); 271 list1.fDecimalAt = 1; 272 DigitList list2; 273 list2.set((int32_t)1); 274 if (list1 != list2) { 275 errln("digitlist append, operator!= or set failed "); 276 } 277 if (!(list1 == list2)) { 278 errln("digitlist append, operator== or set failed "); 279 } 280 } 281 */ 282 283 // ------------------------------------- 284 285 // Test exponential pattern 286 void 287 NumberFormatTest::TestExponential(void) 288 { 289 UErrorCode status = U_ZERO_ERROR; 290 DecimalFormatSymbols sym(Locale::getUS(), status); 291 if (U_FAILURE(status)) { errcheckln(status, "FAIL: Bad status returned by DecimalFormatSymbols ct - %s", u_errorName(status)); return; } 292 const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; 293 int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); 294 295 // The following #if statements allow this test to be built and run on 296 // platforms that do not have standard IEEE numerics. For example, 297 // S/390 doubles have an exponent range of -78 to +75. For the 298 // following #if statements to work, float.h must define 299 // DBL_MAX_10_EXP to be a compile-time constant. 300 301 // This section may be expanded as needed. 302 303 #if DBL_MAX_10_EXP > 300 304 double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; 305 int32_t val_length = (int32_t)(sizeof(val) / sizeof(val[0])); 306 const char* valFormat[] = 307 { 308 // 0.####E0 309 "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", 310 // 00.000E00 311 "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", 312 // ##0.######E000 313 "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", 314 // 0.###E0;[0.###E0] 315 "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" 316 }; 317 double valParse[] = 318 { 319 0.01234, 123460000, 1.23E300, -3.1416E-271, 320 0.01234, 123460000, 1.23E300, -3.1416E-271, 321 0.01234, 123456800, 1.23E300, -3.141593E-271, 322 0.01234, 123500000, 1.23E300, -3.142E-271, 323 }; 324 #elif DBL_MAX_10_EXP > 70 325 double val[] = { 0.01234, 123456789, 1.23e70, -3.141592653e-71 }; 326 int32_t val_length = sizeof(val) / sizeof(val[0]); 327 char* valFormat[] = 328 { 329 // 0.####E0 330 "1.234E-2", "1.2346E8", "1.23E70", "-3.1416E-71", 331 // 00.000E00 332 "12.340E-03", "12.346E07", "12.300E69", "-31.416E-72", 333 // ##0.######E000 334 "12.34E-003", "123.4568E006", "12.3E069", "-31.41593E-072", 335 // 0.###E0;[0.###E0] 336 "1.234E-2", "1.235E8", "1.23E70", "[3.142E-71]" 337 }; 338 double valParse[] = 339 { 340 0.01234, 123460000, 1.23E70, -3.1416E-71, 341 0.01234, 123460000, 1.23E70, -3.1416E-71, 342 0.01234, 123456800, 1.23E70, -3.141593E-71, 343 0.01234, 123500000, 1.23E70, -3.142E-71, 344 }; 345 #else 346 // Don't test double conversion 347 double* val = 0; 348 int32_t val_length = 0; 349 char** valFormat = 0; 350 double* valParse = 0; 351 logln("Warning: Skipping double conversion tests"); 352 #endif 353 354 int32_t lval[] = { 0, -1, 1, 123456789 }; 355 int32_t lval_length = (int32_t)(sizeof(lval) / sizeof(lval[0])); 356 const char* lvalFormat[] = 357 { 358 // 0.####E0 359 "0E0", "-1E0", "1E0", "1.2346E8", 360 // 00.000E00 361 "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", 362 // ##0.######E000 363 "0E000", "-1E000", "1E000", "123.4568E006", 364 // 0.###E0;[0.###E0] 365 "0E0", "[1E0]", "1E0", "1.235E8" 366 }; 367 int32_t lvalParse[] = 368 { 369 0, -1, 1, 123460000, 370 0, -1, 1, 123460000, 371 0, -1, 1, 123456800, 372 0, -1, 1, 123500000, 373 }; 374 int32_t ival = 0, ilval = 0; 375 for (int32_t p=0; p<pat_length; ++p) 376 { 377 DecimalFormat fmt(pat[p], sym, status); 378 if (U_FAILURE(status)) { errln("FAIL: Bad status returned by DecimalFormat ct"); continue; } 379 UnicodeString pattern; 380 logln((UnicodeString)"Pattern \"" + pat[p] + "\" -toPattern-> \"" + 381 fmt.toPattern(pattern) + "\""); 382 int32_t v; 383 for (v=0; v<val_length; ++v) 384 { 385 UnicodeString s; (*(NumberFormat*)&fmt).format(val[v], s); 386 logln((UnicodeString)" " + val[v] + " -format-> " + s); 387 if (s != valFormat[v+ival]) 388 errln((UnicodeString)"FAIL: Expected " + valFormat[v+ival]); 389 390 ParsePosition pos(0); 391 Formattable af; 392 fmt.parse(s, af, pos); 393 double a; 394 UBool useEpsilon = FALSE; 395 if (af.getType() == Formattable::kLong) 396 a = af.getLong(); 397 else if (af.getType() == Formattable::kDouble) { 398 a = af.getDouble(); 399 #if U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400 400 // S/390 will show a failure like this: 401 //| -3.141592652999999e-271 -format-> -3.1416E-271 402 //| -parse-> -3.1416e-271 403 //| FAIL: Expected -3.141599999999999e-271 404 // To compensate, we use an epsilon-based equality 405 // test on S/390 only. We don't want to do this in 406 // general because it's less exacting. 407 useEpsilon = TRUE; 408 #endif 409 } 410 else { 411 errln((UnicodeString)"FAIL: Non-numeric Formattable returned"); 412 continue; 413 } 414 if (pos.getIndex() == s.length()) 415 { 416 logln((UnicodeString)" -parse-> " + a); 417 // Use epsilon comparison as necessary 418 if ((useEpsilon && 419 (uprv_fabs(a - valParse[v+ival]) / a > (2*DBL_EPSILON))) || 420 (!useEpsilon && a != valParse[v+ival])) 421 { 422 errln((UnicodeString)"FAIL: Expected " + valParse[v+ival]); 423 } 424 } 425 else { 426 errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); 427 errln((UnicodeString)" should be (" + s.length() + " chars) -> " + valParse[v+ival]); 428 } 429 } 430 for (v=0; v<lval_length; ++v) 431 { 432 UnicodeString s; 433 (*(NumberFormat*)&fmt).format(lval[v], s); 434 logln((UnicodeString)" " + lval[v] + "L -format-> " + s); 435 if (s != lvalFormat[v+ilval]) 436 errln((UnicodeString)"ERROR: Expected " + lvalFormat[v+ilval] + " Got: " + s); 437 438 ParsePosition pos(0); 439 Formattable af; 440 fmt.parse(s, af, pos); 441 if (af.getType() == Formattable::kLong || 442 af.getType() == Formattable::kInt64) { 443 UErrorCode status = U_ZERO_ERROR; 444 int32_t a = af.getLong(status); 445 if (pos.getIndex() == s.length()) 446 { 447 logln((UnicodeString)" -parse-> " + a); 448 if (a != lvalParse[v+ilval]) 449 errln((UnicodeString)"FAIL: Expected " + lvalParse[v+ilval]); 450 } 451 else 452 errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); 453 } 454 else 455 errln((UnicodeString)"FAIL: Non-long Formattable returned for " + s 456 + " Double: " + af.getDouble() 457 + ", Long: " + af.getLong()); 458 } 459 ival += val_length; 460 ilval += lval_length; 461 } 462 } 463 464 void 465 NumberFormatTest::TestScientific2() { 466 // jb 2552 467 UErrorCode status = U_ZERO_ERROR; 468 DecimalFormat* fmt = (DecimalFormat*)NumberFormat::createCurrencyInstance("en_US", status); 469 if (U_SUCCESS(status)) { 470 double num = 12.34; 471 expect(*fmt, num, "$12.34"); 472 fmt->setScientificNotation(TRUE); 473 expect(*fmt, num, "$1.23E1"); 474 fmt->setScientificNotation(FALSE); 475 expect(*fmt, num, "$12.34"); 476 } 477 delete fmt; 478 } 479 480 void 481 NumberFormatTest::TestScientificGrouping() { 482 // jb 2552 483 UErrorCode status = U_ZERO_ERROR; 484 DecimalFormat fmt("##0.00E0",status); 485 if (U_SUCCESS(status)) { 486 expect(fmt, .01234, "12.3E-3"); 487 expect(fmt, .1234, "123E-3"); 488 expect(fmt, 1.234, "1.23E0"); 489 expect(fmt, 12.34, "12.3E0"); 490 expect(fmt, 123.4, "123E0"); 491 expect(fmt, 1234., "1.23E3"); 492 } 493 } 494 495 /*static void setFromString(DigitList& dl, const char* str) { 496 char c; 497 UBool decimalSet = FALSE; 498 dl.clear(); 499 while ((c = *str++)) { 500 if (c == '-') { 501 dl.fIsPositive = FALSE; 502 } else if (c == '+') { 503 dl.fIsPositive = TRUE; 504 } else if (c == '.') { 505 dl.fDecimalAt = dl.fCount; 506 decimalSet = TRUE; 507 } else { 508 dl.append(c); 509 } 510 } 511 if (!decimalSet) { 512 dl.fDecimalAt = dl.fCount; 513 } 514 }*/ 515 516 void 517 NumberFormatTest::TestInt64() { 518 UErrorCode status = U_ZERO_ERROR; 519 DecimalFormat fmt("#.#E0",status); 520 fmt.setMaximumFractionDigits(20); 521 if (U_SUCCESS(status)) { 522 expect(fmt, (Formattable)(int64_t)0, "0E0"); 523 expect(fmt, (Formattable)(int64_t)-1, "-1E0"); 524 expect(fmt, (Formattable)(int64_t)1, "1E0"); 525 expect(fmt, (Formattable)(int64_t)2147483647, "2.147483647E9"); 526 expect(fmt, (Formattable)((int64_t)-2147483647-1), "-2.147483648E9"); 527 expect(fmt, (Formattable)(int64_t)U_INT64_MAX, "9.223372036854775807E18"); 528 expect(fmt, (Formattable)(int64_t)U_INT64_MIN, "-9.223372036854775808E18"); 529 } 530 531 // also test digitlist 532 /* int64_t int64max = U_INT64_MAX; 533 int64_t int64min = U_INT64_MIN; 534 const char* int64maxstr = "9223372036854775807"; 535 const char* int64minstr = "-9223372036854775808"; 536 UnicodeString fail("fail: "); 537 538 // test max int64 value 539 DigitList dl; 540 setFromString(dl, int64maxstr); 541 { 542 if (!dl.fitsIntoInt64(FALSE)) { 543 errln(fail + int64maxstr + " didn't fit"); 544 } 545 int64_t int64Value = dl.getInt64(); 546 if (int64Value != int64max) { 547 errln(fail + int64maxstr); 548 } 549 dl.set(int64Value); 550 int64Value = dl.getInt64(); 551 if (int64Value != int64max) { 552 errln(fail + int64maxstr); 553 } 554 } 555 // test negative of max int64 value (1 shy of min int64 value) 556 dl.fIsPositive = FALSE; 557 { 558 if (!dl.fitsIntoInt64(FALSE)) { 559 errln(fail + "-" + int64maxstr + " didn't fit"); 560 } 561 int64_t int64Value = dl.getInt64(); 562 if (int64Value != -int64max) { 563 errln(fail + "-" + int64maxstr); 564 } 565 dl.set(int64Value); 566 int64Value = dl.getInt64(); 567 if (int64Value != -int64max) { 568 errln(fail + "-" + int64maxstr); 569 } 570 } 571 // test min int64 value 572 setFromString(dl, int64minstr); 573 { 574 if (!dl.fitsIntoInt64(FALSE)) { 575 errln(fail + "-" + int64minstr + " didn't fit"); 576 } 577 int64_t int64Value = dl.getInt64(); 578 if (int64Value != int64min) { 579 errln(fail + int64minstr); 580 } 581 dl.set(int64Value); 582 int64Value = dl.getInt64(); 583 if (int64Value != int64min) { 584 errln(fail + int64minstr); 585 } 586 } 587 // test negative of min int 64 value (1 more than max int64 value) 588 dl.fIsPositive = TRUE; // won't fit 589 { 590 if (dl.fitsIntoInt64(FALSE)) { 591 errln(fail + "-(" + int64minstr + ") didn't fit"); 592 } 593 }*/ 594 } 595 596 // ------------------------------------- 597 598 // Test the handling of quotes 599 void 600 NumberFormatTest::TestQuotes(void) 601 { 602 UErrorCode status = U_ZERO_ERROR; 603 UnicodeString *pat; 604 DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), status); 605 if (U_FAILURE(status)) { 606 errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status)); 607 delete sym; 608 return; 609 } 610 pat = new UnicodeString("a'fo''o'b#"); 611 DecimalFormat *fmt = new DecimalFormat(*pat, *sym, status); 612 UnicodeString s; 613 ((NumberFormat*)fmt)->format((int32_t)123, s); 614 logln((UnicodeString)"Pattern \"" + *pat + "\""); 615 logln((UnicodeString)" Format 123 -> " + escape(s)); 616 if (!(s=="afo'ob123")) 617 errln((UnicodeString)"FAIL: Expected afo'ob123"); 618 619 s.truncate(0); 620 delete fmt; 621 delete pat; 622 623 pat = new UnicodeString("a''b#"); 624 fmt = new DecimalFormat(*pat, *sym, status); 625 ((NumberFormat*)fmt)->format((int32_t)123, s); 626 logln((UnicodeString)"Pattern \"" + *pat + "\""); 627 logln((UnicodeString)" Format 123 -> " + escape(s)); 628 if (!(s=="a'b123")) 629 errln((UnicodeString)"FAIL: Expected a'b123"); 630 delete fmt; 631 delete pat; 632 delete sym; 633 } 634 635 /** 636 * Test the handling of the currency symbol in patterns. 637 */ 638 void 639 NumberFormatTest::TestCurrencySign(void) 640 { 641 UErrorCode status = U_ZERO_ERROR; 642 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale::getUS(), status); 643 UnicodeString pat; 644 UChar currency = 0x00A4; 645 if (U_FAILURE(status)) { 646 errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status)); 647 delete sym; 648 return; 649 } 650 // "\xA4#,##0.00;-\xA4#,##0.00" 651 pat.append(currency).append("#,##0.00;-"). 652 append(currency).append("#,##0.00"); 653 DecimalFormat *fmt = new DecimalFormat(pat, *sym, status); 654 UnicodeString s; ((NumberFormat*)fmt)->format(1234.56, s); 655 pat.truncate(0); 656 logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); 657 logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); 658 if (s != "$1,234.56") dataerrln((UnicodeString)"FAIL: Expected $1,234.56"); 659 s.truncate(0); 660 ((NumberFormat*)fmt)->format(- 1234.56, s); 661 logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); 662 if (s != "-$1,234.56") dataerrln((UnicodeString)"FAIL: Expected -$1,234.56"); 663 delete fmt; 664 pat.truncate(0); 665 // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00" 666 pat.append(currency).append(currency). 667 append(" #,##0.00;"). 668 append(currency).append(currency). 669 append(" -#,##0.00"); 670 fmt = new DecimalFormat(pat, *sym, status); 671 s.truncate(0); 672 ((NumberFormat*)fmt)->format(1234.56, s); 673 logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); 674 logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); 675 if (s != "USD 1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD 1,234.56"); 676 s.truncate(0); 677 ((NumberFormat*)fmt)->format(-1234.56, s); 678 logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); 679 if (s != "USD -1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD -1,234.56"); 680 delete fmt; 681 delete sym; 682 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + u_errorName(status)); 683 } 684 685 // ------------------------------------- 686 687 static UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); } 688 689 UnicodeString& 690 NumberFormatTest::escape(UnicodeString& s) 691 { 692 UnicodeString buf; 693 for (int32_t i=0; i<s.length(); ++i) 694 { 695 UChar c = s[(int32_t)i]; 696 if (c <= (UChar)0x7F) buf += c; 697 else { 698 buf += (UChar)0x5c; buf += (UChar)0x55; 699 buf += toHexString((c & 0xF000) >> 12); 700 buf += toHexString((c & 0x0F00) >> 8); 701 buf += toHexString((c & 0x00F0) >> 4); 702 buf += toHexString(c & 0x000F); 703 } 704 } 705 return (s = buf); 706 } 707 708 709 // ------------------------------------- 710 static const char* testCases[][2]= { 711 /* locale ID */ /* expected */ 712 {"ca_ES_PREEURO", "\\u20A7\\u00A01.150" }, 713 {"de_LU_PREEURO", "1,150\\u00A0F" }, 714 {"el_GR_PREEURO", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" }, 715 {"en_BE_PREEURO", "1.150,50\\u00A0BEF" }, 716 {"es_ES_PREEURO", "1.150\\u00A0\\u20A7" }, 717 {"eu_ES_PREEURO", "\\u20A7\\u00A01.150" }, 718 {"gl_ES_PREEURO", "1.150\\u00A0\\u20A7" }, 719 {"it_IT_PREEURO", "ITL\\u00A01.150" }, 720 {"pt_PT_PREEURO", "1,150$50\\u00A0\\u200B"}, // per cldrbug 7670 721 {"en_US@currency=JPY", "\\u00A51,150"}, 722 {"en_US@currency=jpy", "\\u00A51,150"}, 723 {"en-US-u-cu-jpy", "\\u00A51,150"} 724 }; 725 /** 726 * Test localized currency patterns. 727 */ 728 void 729 NumberFormatTest::TestCurrency(void) 730 { 731 UErrorCode status = U_ZERO_ERROR; 732 NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status); 733 if (U_FAILURE(status)) { 734 dataerrln("Error calling NumberFormat::createCurrencyInstance()"); 735 return; 736 } 737 738 UnicodeString s; currencyFmt->format(1.50, s); 739 logln((UnicodeString)"Un pauvre ici a..........." + s); 740 if (!(s==CharsToUnicodeString("1,50\\u00A0$"))) 741 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>$"); 742 delete currencyFmt; 743 s.truncate(0); 744 char loc[256]={0}; 745 int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); 746 (void)len; // Suppress unused variable warning. 747 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status); 748 currencyFmt->format(1.50, s); 749 logln((UnicodeString)"Un pauvre en Allemagne a.." + s); 750 if (!(s==CharsToUnicodeString("1,50\\u00A0DM"))) 751 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>DM"); 752 delete currencyFmt; 753 s.truncate(0); 754 len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); 755 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); 756 currencyFmt->format(1.50, s); 757 logln((UnicodeString)"Un pauvre en France a....." + s); 758 if (!(s==CharsToUnicodeString("1,50\\u00A0F"))) 759 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>F"); 760 delete currencyFmt; 761 if (U_FAILURE(status)) 762 errln((UnicodeString)"FAIL: Status " + (int32_t)status); 763 764 for(int i=0; i < (int)(sizeof(testCases)/sizeof(testCases[i])); i++){ 765 status = U_ZERO_ERROR; 766 const char *localeID = testCases[i][0]; 767 UnicodeString expected(testCases[i][1], -1, US_INV); 768 expected = expected.unescape(); 769 s.truncate(0); 770 char loc[256]={0}; 771 uloc_canonicalize(localeID, loc, 256, &status); 772 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); 773 if(U_FAILURE(status)){ 774 errln("Could not create currency formatter for locale %s",localeID); 775 continue; 776 } 777 currencyFmt->format(1150.50, s); 778 if(s!=expected){ 779 errln(UnicodeString("FAIL: Expected: ")+expected 780 + UnicodeString(" Got: ") + s 781 + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); 782 } 783 if (U_FAILURE(status)){ 784 errln((UnicodeString)"FAIL: Status " + (int32_t)status); 785 } 786 delete currencyFmt; 787 } 788 } 789 790 // ------------------------------------- 791 792 /** 793 * Test the Currency object handling, new as of ICU 2.2. 794 */ 795 void NumberFormatTest::TestCurrencyObject() { 796 UErrorCode ec = U_ZERO_ERROR; 797 NumberFormat* fmt = 798 NumberFormat::createCurrencyInstance(Locale::getUS(), ec); 799 800 if (U_FAILURE(ec)) { 801 dataerrln("FAIL: getCurrencyInstance(US) - %s", u_errorName(ec)); 802 delete fmt; 803 return; 804 } 805 806 Locale null("", "", ""); 807 808 expectCurrency(*fmt, null, 1234.56, "$1,234.56"); 809 810 expectCurrency(*fmt, Locale::getFrance(), 811 1234.56, CharsToUnicodeString("\\u20AC1,234.56")); // Euro 812 813 expectCurrency(*fmt, Locale::getJapan(), 814 1234.56, CharsToUnicodeString("\\u00A51,235")); // Yen 815 816 expectCurrency(*fmt, Locale("fr", "CH", ""), 817 1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548 818 819 expectCurrency(*fmt, Locale::getUS(), 820 1234.56, "$1,234.56"); 821 822 delete fmt; 823 fmt = NumberFormat::createCurrencyInstance(Locale::getFrance(), ec); 824 825 if (U_FAILURE(ec)) { 826 errln("FAIL: getCurrencyInstance(FRANCE)"); 827 delete fmt; 828 return; 829 } 830 831 expectCurrency(*fmt, null, 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); 832 833 expectCurrency(*fmt, Locale::getJapan(), 834 1234.56, CharsToUnicodeString("1 235 JPY")); // Yen 835 836 expectCurrency(*fmt, Locale("fr", "CH", ""), 837 1234.56, "1 234,56 CHF"); // no more 0.05 rounding here, see cldrbug 5548 838 839 expectCurrency(*fmt, Locale::getUS(), 840 1234.56, "1 234,56 $US"); 841 842 expectCurrency(*fmt, Locale::getFrance(), 843 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); // Euro 844 845 delete fmt; 846 } 847 848 // ------------------------------------- 849 850 /** 851 * Do rudimentary testing of parsing. 852 */ 853 void 854 NumberFormatTest::TestParse(void) 855 { 856 UErrorCode status = U_ZERO_ERROR; 857 UnicodeString arg("0"); 858 DecimalFormat* format = new DecimalFormat("00", status); 859 //try { 860 Formattable n; format->parse(arg, n, status); 861 logln((UnicodeString)"parse(" + arg + ") = " + n.getLong()); 862 if (n.getType() != Formattable::kLong || 863 n.getLong() != 0) errln((UnicodeString)"FAIL: Expected 0"); 864 delete format; 865 if (U_FAILURE(status)) errcheckln(status, (UnicodeString)"FAIL: Status " + u_errorName(status)); 866 //} 867 //catch(Exception e) { 868 // errln((UnicodeString)"Exception caught: " + e); 869 //} 870 } 871 872 // ------------------------------------- 873 874 static const char *lenientAffixTestCases[] = { 875 "(1)", 876 "( 1)", 877 "(1 )", 878 "( 1 )" 879 }; 880 881 static const char *lenientMinusTestCases[] = { 882 "-5", 883 "\\u22125", 884 "\\u20105" 885 }; 886 887 static const char *lenientCurrencyTestCases[] = { 888 "$1,000", 889 "$ 1,000", 890 "$1000", 891 "$ 1000", 892 "$1 000.00", 893 "$ 1 000.00", 894 "$ 1\\u00A0000.00", 895 "1000.00" 896 }; 897 898 // changed from () to - per cldrbug 5674 899 static const char *lenientNegativeCurrencyTestCases[] = { 900 "-$1,000", 901 "-$ 1,000", 902 "-$1000", 903 "-$ 1000", 904 "-$1 000.00", 905 "-$ 1 000.00", 906 "- $ 1,000.00 ", 907 "-$ 1\\u00A0000.00", 908 "-1000.00" 909 }; 910 911 static const char *lenientPercentTestCases[] = { 912 "25%", 913 " 25%", 914 " 25 %", 915 "25 %", 916 "25\\u00A0%", 917 "25" 918 }; 919 920 static const char *lenientNegativePercentTestCases[] = { 921 "-25%", 922 " -25%", 923 " - 25%", 924 "- 25 %", 925 " - 25 %", 926 "-25 %", 927 "-25\\u00A0%", 928 "-25", 929 "- 25" 930 }; 931 932 static const char *strictFailureTestCases[] = { 933 " 1000", 934 "10,00", 935 "1,000,.0" 936 }; 937 938 #define ARRAY_SIZE(array) ((int32_t) (sizeof (array) / sizeof(array[0]))) 939 940 /** 941 * Test lenient parsing. 942 */ 943 void 944 NumberFormatTest::TestLenientParse(void) 945 { 946 UErrorCode status = U_ZERO_ERROR; 947 DecimalFormat *format = new DecimalFormat("(#,##0)", status); 948 Formattable n; 949 950 if (format == NULL || U_FAILURE(status)) { 951 dataerrln("Unable to create DecimalFormat (#,##0) - %s", u_errorName(status)); 952 } else { 953 format->setLenient(TRUE); 954 for (int32_t t = 0; t < ARRAY_SIZE (lenientAffixTestCases); t += 1) { 955 UnicodeString testCase = ctou(lenientAffixTestCases[t]); 956 957 format->parse(testCase, n, status); 958 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 959 960 if (U_FAILURE(status) || n.getType() != Formattable::kLong || 961 n.getLong() != 1) { 962 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientAffixTestCases[t] + (UnicodeString) "\""); 963 status = U_ZERO_ERROR; 964 } 965 } 966 delete format; 967 } 968 969 Locale en_US("en_US"); 970 Locale sv_SE("sv_SE"); 971 972 NumberFormat *mFormat = NumberFormat::createInstance(sv_SE, UNUM_DECIMAL, status); 973 974 if (mFormat == NULL || U_FAILURE(status)) { 975 dataerrln("Unable to create NumberFormat (sv_SE, UNUM_DECIMAL) - %s", u_errorName(status)); 976 } else { 977 mFormat->setLenient(TRUE); 978 for (int32_t t = 0; t < ARRAY_SIZE(lenientMinusTestCases); t += 1) { 979 UnicodeString testCase = ctou(lenientMinusTestCases[t]); 980 981 mFormat->parse(testCase, n, status); 982 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 983 984 if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) { 985 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\""); 986 status = U_ZERO_ERROR; 987 } 988 } 989 delete mFormat; 990 } 991 992 mFormat = NumberFormat::createInstance(en_US, UNUM_DECIMAL, status); 993 994 if (mFormat == NULL || U_FAILURE(status)) { 995 dataerrln("Unable to create NumberFormat (en_US, UNUM_DECIMAL) - %s", u_errorName(status)); 996 } else { 997 mFormat->setLenient(TRUE); 998 for (int32_t t = 0; t < ARRAY_SIZE(lenientMinusTestCases); t += 1) { 999 UnicodeString testCase = ctou(lenientMinusTestCases[t]); 1000 1001 mFormat->parse(testCase, n, status); 1002 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 1003 1004 if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) { 1005 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\""); 1006 status = U_ZERO_ERROR; 1007 } 1008 } 1009 delete mFormat; 1010 } 1011 1012 NumberFormat *cFormat = NumberFormat::createInstance(en_US, UNUM_CURRENCY, status); 1013 1014 if (cFormat == NULL || U_FAILURE(status)) { 1015 dataerrln("Unable to create NumberFormat (en_US, UNUM_CURRENCY) - %s", u_errorName(status)); 1016 } else { 1017 cFormat->setLenient(TRUE); 1018 for (int32_t t = 0; t < ARRAY_SIZE (lenientCurrencyTestCases); t += 1) { 1019 UnicodeString testCase = ctou(lenientCurrencyTestCases[t]); 1020 1021 cFormat->parse(testCase, n, status); 1022 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 1023 1024 if (U_FAILURE(status) ||n.getType() != Formattable::kLong || 1025 n.getLong() != 1000) { 1026 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientCurrencyTestCases[t] + (UnicodeString) "\""); 1027 status = U_ZERO_ERROR; 1028 } 1029 } 1030 1031 for (int32_t t = 0; t < ARRAY_SIZE (lenientNegativeCurrencyTestCases); t += 1) { 1032 UnicodeString testCase = ctou(lenientNegativeCurrencyTestCases[t]); 1033 1034 cFormat->parse(testCase, n, status); 1035 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 1036 1037 if (U_FAILURE(status) ||n.getType() != Formattable::kLong || 1038 n.getLong() != -1000) { 1039 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientNegativeCurrencyTestCases[t] + (UnicodeString) "\""); 1040 status = U_ZERO_ERROR; 1041 } 1042 } 1043 1044 delete cFormat; 1045 } 1046 1047 NumberFormat *pFormat = NumberFormat::createPercentInstance(en_US, status); 1048 1049 if (pFormat == NULL || U_FAILURE(status)) { 1050 dataerrln("Unable to create NumberFormat::createPercentInstance (en_US) - %s", u_errorName(status)); 1051 } else { 1052 pFormat->setLenient(TRUE); 1053 for (int32_t t = 0; t < ARRAY_SIZE (lenientPercentTestCases); t += 1) { 1054 UnicodeString testCase = ctou(lenientPercentTestCases[t]); 1055 1056 pFormat->parse(testCase, n, status); 1057 logln((UnicodeString)"parse(" + testCase + ") = " + n.getDouble()); 1058 1059 if (U_FAILURE(status) ||n.getType() != Formattable::kDouble || 1060 n.getDouble() != 0.25) { 1061 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientPercentTestCases[t] + (UnicodeString) "\""); 1062 status = U_ZERO_ERROR; 1063 } 1064 } 1065 1066 for (int32_t t = 0; t < ARRAY_SIZE (lenientNegativePercentTestCases); t += 1) { 1067 UnicodeString testCase = ctou(lenientNegativePercentTestCases[t]); 1068 1069 pFormat->parse(testCase, n, status); 1070 logln((UnicodeString)"parse(" + testCase + ") = " + n.getDouble()); 1071 1072 if (U_FAILURE(status) ||n.getType() != Formattable::kDouble || 1073 n.getDouble() != -0.25) { 1074 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientNegativePercentTestCases[t] + (UnicodeString) "\""); 1075 status = U_ZERO_ERROR; 1076 } 1077 } 1078 1079 delete pFormat; 1080 } 1081 1082 // Test cases that should fail with a strict parse and pass with a 1083 // lenient parse. 1084 NumberFormat *nFormat = NumberFormat::createInstance(en_US, status); 1085 1086 if (nFormat == NULL || U_FAILURE(status)) { 1087 dataerrln("Unable to create NumberFormat (en_US) - %s", u_errorName(status)); 1088 } else { 1089 // first, make sure that they fail with a strict parse 1090 for (int32_t t = 0; t < ARRAY_SIZE(strictFailureTestCases); t += 1) { 1091 UnicodeString testCase = ctou(strictFailureTestCases[t]); 1092 1093 nFormat->parse(testCase, n, status); 1094 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 1095 1096 if (! U_FAILURE(status)) { 1097 errln((UnicodeString)"Strict Parse succeeded for \"" + (UnicodeString) strictFailureTestCases[t] + (UnicodeString) "\""); 1098 } 1099 1100 status = U_ZERO_ERROR; 1101 } 1102 1103 // then, make sure that they pass with a lenient parse 1104 nFormat->setLenient(TRUE); 1105 for (int32_t t = 0; t < ARRAY_SIZE(strictFailureTestCases); t += 1) { 1106 UnicodeString testCase = ctou(strictFailureTestCases[t]); 1107 1108 nFormat->parse(testCase, n, status); 1109 logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong()); 1110 1111 if (U_FAILURE(status) ||n.getType() != Formattable::kLong || 1112 n.getLong() != 1000) { 1113 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) strictFailureTestCases[t] + (UnicodeString) "\""); 1114 status = U_ZERO_ERROR; 1115 } 1116 } 1117 1118 delete nFormat; 1119 } 1120 } 1121 1122 // ------------------------------------- 1123 1124 /** 1125 * Test proper rounding by the format method. 1126 */ 1127 void 1128 NumberFormatTest::TestRounding487(void) 1129 { 1130 UErrorCode status = U_ZERO_ERROR; 1131 NumberFormat *nf = NumberFormat::createInstance(status); 1132 if (U_FAILURE(status)) { 1133 dataerrln("Error calling NumberFormat::createInstance()"); 1134 return; 1135 } 1136 1137 roundingTest(*nf, 0.00159999, 4, "0.0016"); 1138 roundingTest(*nf, 0.00995, 4, "0.01"); 1139 1140 roundingTest(*nf, 12.3995, 3, "12.4"); 1141 1142 roundingTest(*nf, 12.4999, 0, "12"); 1143 roundingTest(*nf, - 19.5, 0, "-20"); 1144 delete nf; 1145 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)status); 1146 } 1147 1148 /** 1149 * Test the functioning of the secondary grouping value. 1150 */ 1151 void NumberFormatTest::TestSecondaryGrouping(void) { 1152 UErrorCode status = U_ZERO_ERROR; 1153 DecimalFormatSymbols US(Locale::getUS(), status); 1154 CHECK(status, "DecimalFormatSymbols ct"); 1155 1156 DecimalFormat f("#,##,###", US, status); 1157 CHECK(status, "DecimalFormat ct"); 1158 1159 expect2(f, (int32_t)123456789L, "12,34,56,789"); 1160 expectPat(f, "#,##,###"); 1161 f.applyPattern("#,###", status); 1162 CHECK(status, "applyPattern"); 1163 1164 f.setSecondaryGroupingSize(4); 1165 expect2(f, (int32_t)123456789L, "12,3456,789"); 1166 expectPat(f, "#,####,###"); 1167 NumberFormat *g = NumberFormat::createInstance(Locale("hi", "IN"), status); 1168 CHECK_DATA(status, "createInstance(hi_IN)"); 1169 1170 UnicodeString out; 1171 int32_t l = (int32_t)1876543210L; 1172 g->format(l, out); 1173 delete g; 1174 // expect "1,87,65,43,210", but with Hindi digits 1175 // 01234567890123 1176 UBool ok = TRUE; 1177 if (out.length() != 14) { 1178 ok = FALSE; 1179 } else { 1180 for (int32_t i=0; i<out.length(); ++i) { 1181 UBool expectGroup = FALSE; 1182 switch (i) { 1183 case 1: 1184 case 4: 1185 case 7: 1186 case 10: 1187 expectGroup = TRUE; 1188 break; 1189 } 1190 // Later -- fix this to get the actual grouping 1191 // character from the resource bundle. 1192 UBool isGroup = (out.charAt(i) == 0x002C); 1193 if (isGroup != expectGroup) { 1194 ok = FALSE; 1195 break; 1196 } 1197 } 1198 } 1199 if (!ok) { 1200 errln((UnicodeString)"FAIL Expected " + l + 1201 " x hi_IN -> \"1,87,65,43,210\" (with Hindi digits), got \"" + 1202 escape(out) + "\""); 1203 } else { 1204 logln((UnicodeString)"Ok " + l + 1205 " x hi_IN -> \"" + 1206 escape(out) + "\""); 1207 } 1208 } 1209 1210 void NumberFormatTest::TestWhiteSpaceParsing(void) { 1211 UErrorCode ec = U_ZERO_ERROR; 1212 DecimalFormatSymbols US(Locale::getUS(), ec); 1213 DecimalFormat fmt("a b#0c ", US, ec); 1214 if (U_FAILURE(ec)) { 1215 errcheckln(ec, "FAIL: Constructor - %s", u_errorName(ec)); 1216 return; 1217 } 1218 int32_t n = 1234; 1219 expect(fmt, "a b1234c ", n); 1220 expect(fmt, "a b1234c ", n); 1221 } 1222 1223 /** 1224 * Test currencies whose display name is a ChoiceFormat. 1225 */ 1226 void NumberFormatTest::TestComplexCurrency() { 1227 1228 // UErrorCode ec = U_ZERO_ERROR; 1229 // Locale loc("kn", "IN", ""); 1230 // NumberFormat* fmt = NumberFormat::createCurrencyInstance(loc, ec); 1231 // if (U_SUCCESS(ec)) { 1232 // expect2(*fmt, 1.0, CharsToUnicodeString("Re.\\u00A01.00")); 1233 // Use .00392625 because that's 2^-8. Any value less than 0.005 is fine. 1234 // expect(*fmt, 1.00390625, CharsToUnicodeString("Re.\\u00A01.00")); // tricky 1235 // expect2(*fmt, 12345678.0, CharsToUnicodeString("Rs.\\u00A01,23,45,678.00")); 1236 // expect2(*fmt, 0.5, CharsToUnicodeString("Rs.\\u00A00.50")); 1237 // expect2(*fmt, -1.0, CharsToUnicodeString("-Re.\\u00A01.00")); 1238 // expect2(*fmt, -10.0, CharsToUnicodeString("-Rs.\\u00A010.00")); 1239 // } else { 1240 // errln("FAIL: getCurrencyInstance(kn_IN)"); 1241 // } 1242 // delete fmt; 1243 1244 } 1245 1246 // ------------------------------------- 1247 1248 void 1249 NumberFormatTest::roundingTest(NumberFormat& nf, double x, int32_t maxFractionDigits, const char* expected) 1250 { 1251 nf.setMaximumFractionDigits(maxFractionDigits); 1252 UnicodeString out; nf.format(x, out); 1253 logln((UnicodeString)"" + x + " formats with " + maxFractionDigits + " fractional digits to " + out); 1254 if (!(out==expected)) errln((UnicodeString)"FAIL: Expected " + expected); 1255 } 1256 1257 /** 1258 * Upgrade to alphaWorks 1259 */ 1260 void NumberFormatTest::TestExponent(void) { 1261 UErrorCode status = U_ZERO_ERROR; 1262 DecimalFormatSymbols US(Locale::getUS(), status); 1263 CHECK(status, "DecimalFormatSymbols constructor"); 1264 DecimalFormat fmt1(UnicodeString("0.###E0"), US, status); 1265 CHECK(status, "DecimalFormat(0.###E0)"); 1266 DecimalFormat fmt2(UnicodeString("0.###E+0"), US, status); 1267 CHECK(status, "DecimalFormat(0.###E+0)"); 1268 int32_t n = 1234; 1269 expect2(fmt1, n, "1.234E3"); 1270 expect2(fmt2, n, "1.234E+3"); 1271 expect(fmt1, "1.234E+3", n); // Either format should parse "E+3" 1272 } 1273 1274 /** 1275 * Upgrade to alphaWorks 1276 */ 1277 void NumberFormatTest::TestScientific(void) { 1278 UErrorCode status = U_ZERO_ERROR; 1279 DecimalFormatSymbols US(Locale::getUS(), status); 1280 CHECK(status, "DecimalFormatSymbols constructor"); 1281 1282 // Test pattern round-trip 1283 const char* PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", 1284 "0.###E0;[0.###E0]" }; 1285 int32_t PAT_length = (int32_t)(sizeof(PAT) / sizeof(PAT[0])); 1286 int32_t DIGITS[] = { 1287 // min int, max int, min frac, max frac 1288 0, 1, 0, 0, // "#E0" 1289 1, 1, 0, 4, // "0.####E0" 1290 2, 2, 3, 3, // "00.000E00" 1291 1, 3, 0, 4, // "##0.####E000" 1292 1, 1, 0, 3, // "0.###E0;[0.###E0]" 1293 }; 1294 for (int32_t i=0; i<PAT_length; ++i) { 1295 UnicodeString pat(PAT[i]); 1296 DecimalFormat df(pat, US, status); 1297 CHECK(status, "DecimalFormat constructor"); 1298 UnicodeString pat2; 1299 df.toPattern(pat2); 1300 if (pat == pat2) { 1301 logln(UnicodeString("Ok Pattern rt \"") + 1302 pat + "\" -> \"" + 1303 pat2 + "\""); 1304 } else { 1305 errln(UnicodeString("FAIL Pattern rt \"") + 1306 pat + "\" -> \"" + 1307 pat2 + "\""); 1308 } 1309 // Make sure digit counts match what we expect 1310 if (df.getMinimumIntegerDigits() != DIGITS[4*i] || 1311 df.getMaximumIntegerDigits() != DIGITS[4*i+1] || 1312 df.getMinimumFractionDigits() != DIGITS[4*i+2] || 1313 df.getMaximumFractionDigits() != DIGITS[4*i+3]) { 1314 errln(UnicodeString("FAIL \"" + pat + 1315 "\" min/max int; min/max frac = ") + 1316 df.getMinimumIntegerDigits() + "/" + 1317 df.getMaximumIntegerDigits() + ";" + 1318 df.getMinimumFractionDigits() + "/" + 1319 df.getMaximumFractionDigits() + ", expect " + 1320 DIGITS[4*i] + "/" + 1321 DIGITS[4*i+1] + ";" + 1322 DIGITS[4*i+2] + "/" + 1323 DIGITS[4*i+3]); 1324 } 1325 } 1326 1327 1328 // Test the constructor for default locale. We have to 1329 // manually set the default locale, as there is no 1330 // guarantee that the default locale has the same 1331 // scientific format. 1332 Locale def = Locale::getDefault(); 1333 Locale::setDefault(Locale::getUS(), status); 1334 expect2(NumberFormat::createScientificInstance(status), 1335 12345.678901, 1336 "1.2345678901E4", status); 1337 Locale::setDefault(def, status); 1338 1339 expect2(new DecimalFormat("#E0", US, status), 1340 12345.0, 1341 "1.2345E4", status); 1342 expect(new DecimalFormat("0E0", US, status), 1343 12345.0, 1344 "1E4", status); 1345 expect2(NumberFormat::createScientificInstance(Locale::getUS(), status), 1346 12345.678901, 1347 "1.2345678901E4", status); 1348 expect(new DecimalFormat("##0.###E0", US, status), 1349 12345.0, 1350 "12.34E3", status); 1351 expect(new DecimalFormat("##0.###E0", US, status), 1352 12345.00001, 1353 "12.35E3", status); 1354 expect2(new DecimalFormat("##0.####E0", US, status), 1355 (int32_t) 12345, 1356 "12.345E3", status); 1357 expect2(NumberFormat::createScientificInstance(Locale::getFrance(), status), 1358 12345.678901, 1359 "1,2345678901E4", status); 1360 expect(new DecimalFormat("##0.####E0", US, status), 1361 789.12345e-9, 1362 "789.12E-9", status); 1363 expect2(new DecimalFormat("##0.####E0", US, status), 1364 780.e-9, 1365 "780E-9", status); 1366 expect(new DecimalFormat(".###E0", US, status), 1367 45678.0, 1368 ".457E5", status); 1369 expect2(new DecimalFormat(".###E0", US, status), 1370 (int32_t) 0, 1371 ".0E0", status); 1372 /* 1373 expect(new DecimalFormat[] { new DecimalFormat("#E0", US), 1374 new DecimalFormat("##E0", US), 1375 new DecimalFormat("####E0", US), 1376 new DecimalFormat("0E0", US), 1377 new DecimalFormat("00E0", US), 1378 new DecimalFormat("000E0", US), 1379 }, 1380 new Long(45678000), 1381 new String[] { "4.5678E7", 1382 "45.678E6", 1383 "4567.8E4", 1384 "5E7", 1385 "46E6", 1386 "457E5", 1387 } 1388 ); 1389 ! 1390 ! Unroll this test into individual tests below... 1391 ! 1392 */ 1393 expect2(new DecimalFormat("#E0", US, status), 1394 (int32_t) 45678000, "4.5678E7", status); 1395 expect2(new DecimalFormat("##E0", US, status), 1396 (int32_t) 45678000, "45.678E6", status); 1397 expect2(new DecimalFormat("####E0", US, status), 1398 (int32_t) 45678000, "4567.8E4", status); 1399 expect(new DecimalFormat("0E0", US, status), 1400 (int32_t) 45678000, "5E7", status); 1401 expect(new DecimalFormat("00E0", US, status), 1402 (int32_t) 45678000, "46E6", status); 1403 expect(new DecimalFormat("000E0", US, status), 1404 (int32_t) 45678000, "457E5", status); 1405 /* 1406 expect(new DecimalFormat("###E0", US, status), 1407 new Object[] { new Double(0.0000123), "12.3E-6", 1408 new Double(0.000123), "123E-6", 1409 new Double(0.00123), "1.23E-3", 1410 new Double(0.0123), "12.3E-3", 1411 new Double(0.123), "123E-3", 1412 new Double(1.23), "1.23E0", 1413 new Double(12.3), "12.3E0", 1414 new Double(123), "123E0", 1415 new Double(1230), "1.23E3", 1416 }); 1417 ! 1418 ! Unroll this test into individual tests below... 1419 ! 1420 */ 1421 expect2(new DecimalFormat("###E0", US, status), 1422 0.0000123, "12.3E-6", status); 1423 expect2(new DecimalFormat("###E0", US, status), 1424 0.000123, "123E-6", status); 1425 expect2(new DecimalFormat("###E0", US, status), 1426 0.00123, "1.23E-3", status); 1427 expect2(new DecimalFormat("###E0", US, status), 1428 0.0123, "12.3E-3", status); 1429 expect2(new DecimalFormat("###E0", US, status), 1430 0.123, "123E-3", status); 1431 expect2(new DecimalFormat("###E0", US, status), 1432 1.23, "1.23E0", status); 1433 expect2(new DecimalFormat("###E0", US, status), 1434 12.3, "12.3E0", status); 1435 expect2(new DecimalFormat("###E0", US, status), 1436 123.0, "123E0", status); 1437 expect2(new DecimalFormat("###E0", US, status), 1438 1230.0, "1.23E3", status); 1439 /* 1440 expect(new DecimalFormat("0.#E+00", US, status), 1441 new Object[] { new Double(0.00012), "1.2E-04", 1442 new Long(12000), "1.2E+04", 1443 }); 1444 ! 1445 ! Unroll this test into individual tests below... 1446 ! 1447 */ 1448 expect2(new DecimalFormat("0.#E+00", US, status), 1449 0.00012, "1.2E-04", status); 1450 expect2(new DecimalFormat("0.#E+00", US, status), 1451 (int32_t) 12000, "1.2E+04", status); 1452 } 1453 1454 /** 1455 * Upgrade to alphaWorks 1456 */ 1457 void NumberFormatTest::TestPad(void) { 1458 UErrorCode status = U_ZERO_ERROR; 1459 DecimalFormatSymbols US(Locale::getUS(), status); 1460 CHECK(status, "DecimalFormatSymbols constructor"); 1461 1462 expect2(new DecimalFormat("*^##.##", US, status), 1463 int32_t(0), "^^^^0", status); 1464 expect2(new DecimalFormat("*^##.##", US, status), 1465 -1.3, "^-1.3", status); 1466 expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), 1467 int32_t(0), "0.0E0______ g-m/s^2", status); 1468 expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), 1469 1.0/3, "333.333E-3_ g-m/s^2", status); 1470 expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), 1471 int32_t(0), "0.0______ g-m/s^2", status); 1472 expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), 1473 1.0/3, "0.33333__ g-m/s^2", status); 1474 1475 // Test padding before a sign 1476 const char *formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)"; 1477 expect2(new DecimalFormat(formatStr, US, status), 1478 int32_t(-10), "xxxxxxxxxx(10.0)", status); 1479 expect2(new DecimalFormat(formatStr, US, status), 1480 int32_t(-1000),"xxxxxxx(1,000.0)", status); 1481 expect2(new DecimalFormat(formatStr, US, status), 1482 int32_t(-1000000),"xxx(1,000,000.0)", status); 1483 expect2(new DecimalFormat(formatStr, US, status), 1484 -100.37, "xxxxxxxx(100.37)", status); 1485 expect2(new DecimalFormat(formatStr, US, status), 1486 -10456.37, "xxxxx(10,456.37)", status); 1487 expect2(new DecimalFormat(formatStr, US, status), 1488 -1120456.37, "xx(1,120,456.37)", status); 1489 expect2(new DecimalFormat(formatStr, US, status), 1490 -112045600.37, "(112,045,600.37)", status); 1491 expect2(new DecimalFormat(formatStr, US, status), 1492 -1252045600.37,"(1,252,045,600.37)", status); 1493 1494 expect2(new DecimalFormat(formatStr, US, status), 1495 int32_t(10), "xxxxxxxxxxxx10.0", status); 1496 expect2(new DecimalFormat(formatStr, US, status), 1497 int32_t(1000),"xxxxxxxxx1,000.0", status); 1498 expect2(new DecimalFormat(formatStr, US, status), 1499 int32_t(1000000),"xxxxx1,000,000.0", status); 1500 expect2(new DecimalFormat(formatStr, US, status), 1501 100.37, "xxxxxxxxxx100.37", status); 1502 expect2(new DecimalFormat(formatStr, US, status), 1503 10456.37, "xxxxxxx10,456.37", status); 1504 expect2(new DecimalFormat(formatStr, US, status), 1505 1120456.37, "xxxx1,120,456.37", status); 1506 expect2(new DecimalFormat(formatStr, US, status), 1507 112045600.37, "xx112,045,600.37", status); 1508 expect2(new DecimalFormat(formatStr, US, status), 1509 10252045600.37,"10,252,045,600.37", status); 1510 1511 1512 // Test padding between a sign and a number 1513 const char *formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)"; 1514 expect2(new DecimalFormat(formatStr2, US, status), 1515 int32_t(-10), "(10.0xxxxxxxxxx)", status); 1516 expect2(new DecimalFormat(formatStr2, US, status), 1517 int32_t(-1000),"(1,000.0xxxxxxx)", status); 1518 expect2(new DecimalFormat(formatStr2, US, status), 1519 int32_t(-1000000),"(1,000,000.0xxx)", status); 1520 expect2(new DecimalFormat(formatStr2, US, status), 1521 -100.37, "(100.37xxxxxxxx)", status); 1522 expect2(new DecimalFormat(formatStr2, US, status), 1523 -10456.37, "(10,456.37xxxxx)", status); 1524 expect2(new DecimalFormat(formatStr2, US, status), 1525 -1120456.37, "(1,120,456.37xx)", status); 1526 expect2(new DecimalFormat(formatStr2, US, status), 1527 -112045600.37, "(112,045,600.37)", status); 1528 expect2(new DecimalFormat(formatStr2, US, status), 1529 -1252045600.37,"(1,252,045,600.37)", status); 1530 1531 expect2(new DecimalFormat(formatStr2, US, status), 1532 int32_t(10), "10.0xxxxxxxxxxxx", status); 1533 expect2(new DecimalFormat(formatStr2, US, status), 1534 int32_t(1000),"1,000.0xxxxxxxxx", status); 1535 expect2(new DecimalFormat(formatStr2, US, status), 1536 int32_t(1000000),"1,000,000.0xxxxx", status); 1537 expect2(new DecimalFormat(formatStr2, US, status), 1538 100.37, "100.37xxxxxxxxxx", status); 1539 expect2(new DecimalFormat(formatStr2, US, status), 1540 10456.37, "10,456.37xxxxxxx", status); 1541 expect2(new DecimalFormat(formatStr2, US, status), 1542 1120456.37, "1,120,456.37xxxx", status); 1543 expect2(new DecimalFormat(formatStr2, US, status), 1544 112045600.37, "112,045,600.37xx", status); 1545 expect2(new DecimalFormat(formatStr2, US, status), 1546 10252045600.37,"10,252,045,600.37", status); 1547 1548 //testing the setPadCharacter(UnicodeString) and getPadCharacterString() 1549 DecimalFormat fmt("#", US, status); 1550 CHECK(status, "DecimalFormat constructor"); 1551 UnicodeString padString("P"); 1552 fmt.setPadCharacter(padString); 1553 expectPad(fmt, "*P##.##", DecimalFormat::kPadBeforePrefix, 5, padString); 1554 fmt.setPadCharacter((UnicodeString)"^"); 1555 expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, (UnicodeString)"^"); 1556 //commented untill implementation is complete 1557 /* fmt.setPadCharacter((UnicodeString)"^^^"); 1558 expectPad(fmt, "*^^^#", DecimalFormat::kPadBeforePrefix, 3, (UnicodeString)"^^^"); 1559 padString.remove(); 1560 padString.append((UChar)0x0061); 1561 padString.append((UChar)0x0302); 1562 fmt.setPadCharacter(padString); 1563 UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000}; 1564 UnicodeString pattern(patternChars); 1565 expectPad(fmt, pattern , DecimalFormat::kPadBeforePrefix, 4, padString); 1566 */ 1567 1568 } 1569 1570 /** 1571 * Upgrade to alphaWorks 1572 */ 1573 void NumberFormatTest::TestPatterns2(void) { 1574 UErrorCode status = U_ZERO_ERROR; 1575 DecimalFormatSymbols US(Locale::getUS(), status); 1576 CHECK(status, "DecimalFormatSymbols constructor"); 1577 1578 DecimalFormat fmt("#", US, status); 1579 CHECK(status, "DecimalFormat constructor"); 1580 1581 UChar hat = 0x005E; /*^*/ 1582 1583 expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, hat); 1584 expectPad(fmt, "$*^#", DecimalFormat::kPadAfterPrefix, 2, hat); 1585 expectPad(fmt, "#*^", DecimalFormat::kPadBeforeSuffix, 1, hat); 1586 expectPad(fmt, "#$*^", DecimalFormat::kPadAfterSuffix, 2, hat); 1587 expectPad(fmt, "$*^$#", ILLEGAL); 1588 expectPad(fmt, "#$*^$", ILLEGAL); 1589 expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat::kPadBeforeSuffix, 1590 12, (UChar)0x0078 /*x*/); 1591 expectPad(fmt, "''#0*x", DecimalFormat::kPadBeforeSuffix, 1592 3, (UChar)0x0078 /*x*/); 1593 expectPad(fmt, "'I''ll'*a###.##", DecimalFormat::kPadAfterPrefix, 1594 10, (UChar)0x0061 /*a*/); 1595 1596 fmt.applyPattern("AA#,##0.00ZZ", status); 1597 CHECK(status, "applyPattern"); 1598 fmt.setPadCharacter(hat); 1599 1600 fmt.setFormatWidth(10); 1601 1602 fmt.setPadPosition(DecimalFormat::kPadBeforePrefix); 1603 expectPat(fmt, "*^AA#,##0.00ZZ"); 1604 1605 fmt.setPadPosition(DecimalFormat::kPadBeforeSuffix); 1606 expectPat(fmt, "AA#,##0.00*^ZZ"); 1607 1608 fmt.setPadPosition(DecimalFormat::kPadAfterSuffix); 1609 expectPat(fmt, "AA#,##0.00ZZ*^"); 1610 1611 // 12 3456789012 1612 UnicodeString exp("AA*^#,##0.00ZZ", ""); 1613 fmt.setFormatWidth(12); 1614 fmt.setPadPosition(DecimalFormat::kPadAfterPrefix); 1615 expectPat(fmt, exp); 1616 1617 fmt.setFormatWidth(13); 1618 // 12 34567890123 1619 expectPat(fmt, "AA*^##,##0.00ZZ"); 1620 1621 fmt.setFormatWidth(14); 1622 // 12 345678901234 1623 expectPat(fmt, "AA*^###,##0.00ZZ"); 1624 1625 fmt.setFormatWidth(15); 1626 // 12 3456789012345 1627 expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case 1628 1629 fmt.setFormatWidth(16); 1630 // 12 34567890123456 1631 expectPat(fmt, "AA*^#,###,##0.00ZZ"); 1632 } 1633 1634 void NumberFormatTest::TestSurrogateSupport(void) { 1635 UErrorCode status = U_ZERO_ERROR; 1636 DecimalFormatSymbols custom(Locale::getUS(), status); 1637 CHECK(status, "DecimalFormatSymbols constructor"); 1638 1639 custom.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, "decimal"); 1640 custom.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, "plus"); 1641 custom.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, " minus "); 1642 custom.setSymbol(DecimalFormatSymbols::kExponentialSymbol, "exponent"); 1643 1644 UnicodeString patternStr("*\\U00010000##.##", ""); 1645 patternStr = patternStr.unescape(); 1646 UnicodeString expStr("\\U00010000\\U00010000\\U00010000\\U000100000", ""); 1647 expStr = expStr.unescape(); 1648 expect2(new DecimalFormat(patternStr, custom, status), 1649 int32_t(0), expStr, status); 1650 1651 status = U_ZERO_ERROR; 1652 expect2(new DecimalFormat("*^##.##", custom, status), 1653 int32_t(0), "^^^^0", status); 1654 status = U_ZERO_ERROR; 1655 expect2(new DecimalFormat("##.##", custom, status), 1656 -1.3, " minus 1decimal3", status); 1657 status = U_ZERO_ERROR; 1658 expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), 1659 int32_t(0), "0decimal0exponent0 g-m/s^2", status); 1660 status = U_ZERO_ERROR; 1661 expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), 1662 1.0/3, "333decimal333exponent minus 3 g-m/s^2", status); 1663 status = U_ZERO_ERROR; 1664 expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), 1665 int32_t(0), "0decimal0 g-m/s^2", status); 1666 status = U_ZERO_ERROR; 1667 expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), 1668 1.0/3, "0decimal33333 g-m/s^2", status); 1669 1670 UnicodeString zero((UChar32)0x10000); 1671 UnicodeString one((UChar32)0x10001); 1672 UnicodeString two((UChar32)0x10002); 1673 UnicodeString five((UChar32)0x10005); 1674 custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero); 1675 custom.setSymbol(DecimalFormatSymbols::kOneDigitSymbol, one); 1676 custom.setSymbol(DecimalFormatSymbols::kTwoDigitSymbol, two); 1677 custom.setSymbol(DecimalFormatSymbols::kFiveDigitSymbol, five); 1678 expStr = UnicodeString("\\U00010001decimal\\U00010002\\U00010005\\U00010000", ""); 1679 expStr = expStr.unescape(); 1680 status = U_ZERO_ERROR; 1681 expect2(new DecimalFormat("##0.000", custom, status), 1682 1.25, expStr, status); 1683 1684 custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, (UChar)0x30); 1685 custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "units of money"); 1686 custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, "money separator"); 1687 patternStr = UNICODE_STRING_SIMPLE("0.00 \\u00A4' in your bank account'"); 1688 patternStr = patternStr.unescape(); 1689 expStr = UnicodeString(" minus 20money separator00 units of money in your bank account", ""); 1690 status = U_ZERO_ERROR; 1691 expect2(new DecimalFormat(patternStr, custom, status), 1692 int32_t(-20), expStr, status); 1693 1694 custom.setSymbol(DecimalFormatSymbols::kPercentSymbol, "percent"); 1695 patternStr = "'You''ve lost ' -0.00 %' of your money today'"; 1696 patternStr = patternStr.unescape(); 1697 expStr = UnicodeString(" minus You've lost minus 2000decimal00 percent of your money today", ""); 1698 status = U_ZERO_ERROR; 1699 expect2(new DecimalFormat(patternStr, custom, status), 1700 int32_t(-20), expStr, status); 1701 } 1702 1703 void NumberFormatTest::TestCurrencyPatterns(void) { 1704 int32_t i, locCount; 1705 const Locale* locs = NumberFormat::getAvailableLocales(locCount); 1706 for (i=0; i<locCount; ++i) { 1707 UErrorCode ec = U_ZERO_ERROR; 1708 NumberFormat* nf = NumberFormat::createCurrencyInstance(locs[i], ec); 1709 if (U_FAILURE(ec)) { 1710 errln("FAIL: Can't create NumberFormat(%s) - %s", locs[i].getName(), u_errorName(ec)); 1711 } else { 1712 // Make sure currency formats do not have a variable number 1713 // of fraction digits 1714 int32_t min = nf->getMinimumFractionDigits(); 1715 int32_t max = nf->getMaximumFractionDigits(); 1716 if (min != max) { 1717 UnicodeString a, b; 1718 nf->format(1.0, a); 1719 nf->format(1.125, b); 1720 errln((UnicodeString)"FAIL: " + locs[i].getName() + 1721 " min fraction digits != max fraction digits; " 1722 "x 1.0 => " + escape(a) + 1723 "; x 1.125 => " + escape(b)); 1724 } 1725 1726 // Make sure EURO currency formats have exactly 2 fraction digits 1727 DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf); 1728 if (df != NULL) { 1729 if (u_strcmp(EUR, df->getCurrency()) == 0) { 1730 if (min != 2 || max != 2) { 1731 UnicodeString a; 1732 nf->format(1.0, a); 1733 errln((UnicodeString)"FAIL: " + locs[i].getName() + 1734 " is a EURO format but it does not have 2 fraction digits; " 1735 "x 1.0 => " + 1736 escape(a)); 1737 } 1738 } 1739 } 1740 } 1741 delete nf; 1742 } 1743 } 1744 1745 void NumberFormatTest::TestRegCurrency(void) { 1746 #if !UCONFIG_NO_SERVICE 1747 UErrorCode status = U_ZERO_ERROR; 1748 UChar USD[4]; 1749 ucurr_forLocale("en_US", USD, 4, &status); 1750 UChar YEN[4]; 1751 ucurr_forLocale("ja_JP", YEN, 4, &status); 1752 UChar TMP[4]; 1753 static const UChar QQQ[] = {0x51, 0x51, 0x51, 0}; 1754 if(U_FAILURE(status)) { 1755 errcheckln(status, "Unable to get currency for locale, error %s", u_errorName(status)); 1756 return; 1757 } 1758 1759 UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status); 1760 UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status); 1761 1762 ucurr_forLocale("en_US", TMP, 4, &status); 1763 if (u_strcmp(YEN, TMP) != 0) { 1764 errln("FAIL: didn't return YEN registered for en_US"); 1765 } 1766 1767 ucurr_forLocale("en_US_EURO", TMP, 4, &status); 1768 if (u_strcmp(QQQ, TMP) != 0) { 1769 errln("FAIL: didn't return QQQ for en_US_EURO"); 1770 } 1771 1772 int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status); 1773 if (fallbackLen) { 1774 errln("FAIL: tried to fallback en_XX_BAR"); 1775 } 1776 status = U_ZERO_ERROR; // reset 1777 1778 if (!ucurr_unregister(enkey, &status)) { 1779 errln("FAIL: couldn't unregister enkey"); 1780 } 1781 1782 ucurr_forLocale("en_US", TMP, 4, &status); 1783 if (u_strcmp(USD, TMP) != 0) { 1784 errln("FAIL: didn't return USD for en_US after unregister of en_US"); 1785 } 1786 status = U_ZERO_ERROR; // reset 1787 1788 ucurr_forLocale("en_US_EURO", TMP, 4, &status); 1789 if (u_strcmp(QQQ, TMP) != 0) { 1790 errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US"); 1791 } 1792 1793 ucurr_forLocale("en_US_BLAH", TMP, 4, &status); 1794 if (u_strcmp(USD, TMP) != 0) { 1795 errln("FAIL: could not find USD for en_US_BLAH after unregister of en"); 1796 } 1797 status = U_ZERO_ERROR; // reset 1798 1799 if (!ucurr_unregister(enUSEUROkey, &status)) { 1800 errln("FAIL: couldn't unregister enUSEUROkey"); 1801 } 1802 1803 ucurr_forLocale("en_US_EURO", TMP, 4, &status); 1804 if (u_strcmp(EUR, TMP) != 0) { 1805 errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_EURO"); 1806 } 1807 status = U_ZERO_ERROR; // reset 1808 #endif 1809 } 1810 1811 void NumberFormatTest::TestCurrencyNames(void) { 1812 // Do a basic check of getName() 1813 // USD { "US$", "US Dollar" } // 04/04/1792- 1814 UErrorCode ec = U_ZERO_ERROR; 1815 static const UChar USD[] = {0x55, 0x53, 0x44, 0}; /*USD*/ 1816 static const UChar USX[] = {0x55, 0x53, 0x58, 0}; /*USX*/ 1817 static const UChar CAD[] = {0x43, 0x41, 0x44, 0}; /*CAD*/ 1818 static const UChar ITL[] = {0x49, 0x54, 0x4C, 0}; /*ITL*/ 1819 UBool isChoiceFormat; 1820 int32_t len; 1821 const UBool possibleDataError = TRUE; 1822 // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK 1823 // THE LOCALE DATA before diving into the code. 1824 assertEquals("USD.getName(SYMBOL_NAME)", 1825 UnicodeString("$"), 1826 UnicodeString(ucurr_getName(USD, "en", 1827 UCURR_SYMBOL_NAME, 1828 &isChoiceFormat, &len, &ec)), 1829 possibleDataError); 1830 assertEquals("USD.getName(LONG_NAME)", 1831 UnicodeString("US Dollar"), 1832 UnicodeString(ucurr_getName(USD, "en", 1833 UCURR_LONG_NAME, 1834 &isChoiceFormat, &len, &ec)), 1835 possibleDataError); 1836 assertEquals("CAD.getName(SYMBOL_NAME)", 1837 UnicodeString("CA$"), 1838 UnicodeString(ucurr_getName(CAD, "en", 1839 UCURR_SYMBOL_NAME, 1840 &isChoiceFormat, &len, &ec)), 1841 possibleDataError); 1842 assertEquals("CAD.getName(SYMBOL_NAME)", 1843 UnicodeString("$"), 1844 UnicodeString(ucurr_getName(CAD, "en_CA", 1845 UCURR_SYMBOL_NAME, 1846 &isChoiceFormat, &len, &ec)), 1847 possibleDataError); 1848 assertEquals("USD.getName(SYMBOL_NAME) in en_AU", 1849 UnicodeString("US$"), 1850 UnicodeString(ucurr_getName(USD, "en_AU", 1851 UCURR_SYMBOL_NAME, 1852 &isChoiceFormat, &len, &ec)), 1853 possibleDataError); 1854 assertEquals("CAD.getName(SYMBOL_NAME)", 1855 UnicodeString("CA$"), 1856 UnicodeString(ucurr_getName(CAD, "en_AU", 1857 UCURR_SYMBOL_NAME, 1858 &isChoiceFormat, &len, &ec)), 1859 possibleDataError); 1860 assertEquals("USX.getName(LONG_NAME)", 1861 UnicodeString("USX"), 1862 UnicodeString(ucurr_getName(USX, "en_US", 1863 UCURR_LONG_NAME, 1864 &isChoiceFormat, &len, &ec)), 1865 possibleDataError); 1866 assertSuccess("ucurr_getName", ec); 1867 1868 ec = U_ZERO_ERROR; 1869 1870 // Test that a default or fallback warning is being returned. JB 4239. 1871 ucurr_getName(CAD, "es_ES", UCURR_LONG_NAME, &isChoiceFormat, 1872 &len, &ec); 1873 assertTrue("ucurr_getName (es_ES fallback)", 1874 U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); 1875 1876 ucurr_getName(CAD, "zh_TW", UCURR_LONG_NAME, &isChoiceFormat, 1877 &len, &ec); 1878 assertTrue("ucurr_getName (zh_TW fallback)", 1879 U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); 1880 1881 ucurr_getName(CAD, "en_US", UCURR_LONG_NAME, &isChoiceFormat, 1882 &len, &ec); 1883 assertTrue("ucurr_getName (en_US default)", 1884 U_USING_DEFAULT_WARNING == ec || U_USING_FALLBACK_WARNING == ec, TRUE); 1885 1886 ucurr_getName(CAD, "ti", UCURR_LONG_NAME, &isChoiceFormat, 1887 &len, &ec); 1888 assertTrue("ucurr_getName (ti default)", 1889 U_USING_DEFAULT_WARNING == ec, TRUE); 1890 1891 // Test that a default warning is being returned when falling back to root. JB 4536. 1892 ucurr_getName(ITL, "cy", UCURR_LONG_NAME, &isChoiceFormat, 1893 &len, &ec); 1894 assertTrue("ucurr_getName (cy default to root)", 1895 U_USING_DEFAULT_WARNING == ec, TRUE); 1896 1897 // TODO add more tests later 1898 } 1899 1900 void NumberFormatTest::TestCurrencyUnit(void){ 1901 UErrorCode ec = U_ZERO_ERROR; 1902 static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ 1903 static const UChar BAD[] = {63, 63, 63, 0}; /*???*/ 1904 static const UChar BAD2[] = {63, 63, 65, 0}; /*???*/ 1905 CurrencyUnit cu(USD, ec); 1906 assertSuccess("CurrencyUnit", ec); 1907 1908 const UChar * r = cu.getISOCurrency(); // who is the buffer owner ? 1909 assertEquals("getISOCurrency()", USD, r); 1910 1911 CurrencyUnit cu2(cu); 1912 if (!(cu2 == cu)){ 1913 errln("CurrencyUnit copy constructed object should be same"); 1914 } 1915 1916 CurrencyUnit * cu3 = (CurrencyUnit *)cu.clone(); 1917 if (!(*cu3 == cu)){ 1918 errln("CurrencyUnit cloned object should be same"); 1919 } 1920 CurrencyUnit bad(BAD, ec); 1921 assertSuccess("CurrencyUnit", ec); 1922 if (cu.getIndex() == bad.getIndex()) { 1923 errln("Indexes of different currencies should differ."); 1924 } 1925 CurrencyUnit bad2(BAD2, ec); 1926 assertSuccess("CurrencyUnit", ec); 1927 if (bad2.getIndex() != bad.getIndex()) { 1928 errln("Indexes of unrecognized currencies should be the same."); 1929 } 1930 if (bad == bad2) { 1931 errln("Different unrecognized currencies should not be equal."); 1932 } 1933 bad = bad2; 1934 if (bad != bad2) { 1935 errln("Currency unit assignment should be the same."); 1936 } 1937 delete cu3; 1938 } 1939 1940 void NumberFormatTest::TestCurrencyAmount(void){ 1941 UErrorCode ec = U_ZERO_ERROR; 1942 static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ 1943 CurrencyAmount ca(9, USD, ec); 1944 assertSuccess("CurrencyAmount", ec); 1945 1946 CurrencyAmount ca2(ca); 1947 if (!(ca2 == ca)){ 1948 errln("CurrencyAmount copy constructed object should be same"); 1949 } 1950 1951 ca2=ca; 1952 if (!(ca2 == ca)){ 1953 errln("CurrencyAmount assigned object should be same"); 1954 } 1955 1956 CurrencyAmount *ca3 = (CurrencyAmount *)ca.clone(); 1957 if (!(*ca3 == ca)){ 1958 errln("CurrencyAmount cloned object should be same"); 1959 } 1960 delete ca3; 1961 } 1962 1963 void NumberFormatTest::TestSymbolsWithBadLocale(void) { 1964 Locale locDefault; 1965 static const char *badLocales[] = { 1966 // length < ULOC_FULLNAME_CAPACITY 1967 "x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_VARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME", 1968 1969 // length > ULOC_FULLNAME_CAPACITY 1970 "x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_VARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME" 1971 }; // expect U_USING_DEFAULT_WARNING for both 1972 1973 unsigned int i; 1974 for (i = 0; i < sizeof(badLocales) / sizeof(char*); i++) { 1975 const char *localeName = badLocales[i]; 1976 Locale locBad(localeName); 1977 UErrorCode status = U_ZERO_ERROR; 1978 UnicodeString intlCurrencySymbol((UChar)0xa4); 1979 1980 intlCurrencySymbol.append((UChar)0xa4); 1981 1982 logln("Current locale is %s", Locale::getDefault().getName()); 1983 Locale::setDefault(locBad, status); 1984 logln("Current locale is %s", Locale::getDefault().getName()); 1985 DecimalFormatSymbols mySymbols(status); 1986 if (status != U_USING_DEFAULT_WARNING) { 1987 errln("DecimalFormatSymbols should return U_USING_DEFAULT_WARNING."); 1988 } 1989 if (strcmp(mySymbols.getLocale().getName(), locBad.getName()) != 0) { 1990 errln("DecimalFormatSymbols does not have the right locale.", locBad.getName()); 1991 } 1992 int symbolEnum = (int)DecimalFormatSymbols::kDecimalSeparatorSymbol; 1993 for (; symbolEnum < (int)DecimalFormatSymbols::kFormatSymbolCount; symbolEnum++) { 1994 UnicodeString symbolString = mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum); 1995 logln(UnicodeString("DecimalFormatSymbols[") + symbolEnum + UnicodeString("] = ") + prettify(symbolString)); 1996 if (symbolString.length() == 0 1997 && symbolEnum != (int)DecimalFormatSymbols::kGroupingSeparatorSymbol 1998 && symbolEnum != (int)DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol) 1999 { 2000 errln("DecimalFormatSymbols has an empty string at index %d.", symbolEnum); 2001 } 2002 } 2003 2004 status = U_ZERO_ERROR; 2005 Locale::setDefault(locDefault, status); 2006 logln("Current locale is %s", Locale::getDefault().getName()); 2007 } 2008 } 2009 2010 /** 2011 * Check that adoptDecimalFormatSymbols and setDecimalFormatSymbols 2012 * behave the same, except for memory ownership semantics. (No 2013 * version of this test on Java, since Java has only one method.) 2014 */ 2015 void NumberFormatTest::TestAdoptDecimalFormatSymbols(void) { 2016 UErrorCode ec = U_ZERO_ERROR; 2017 DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), ec); 2018 if (U_FAILURE(ec)) { 2019 errcheckln(ec, "Fail: DecimalFormatSymbols constructor - %s", u_errorName(ec)); 2020 delete sym; 2021 return; 2022 } 2023 UnicodeString pat(" #,##0.00"); 2024 pat.insert(0, (UChar)0x00A4); 2025 DecimalFormat fmt(pat, sym, ec); 2026 if (U_FAILURE(ec)) { 2027 errln("Fail: DecimalFormat constructor"); 2028 return; 2029 } 2030 2031 UnicodeString str; 2032 fmt.format(2350.75, str); 2033 if (str == "$ 2,350.75") { 2034 logln(str); 2035 } else { 2036 dataerrln("Fail: " + str + ", expected $ 2,350.75"); 2037 } 2038 2039 sym = new DecimalFormatSymbols(Locale::getUS(), ec); 2040 if (U_FAILURE(ec)) { 2041 errln("Fail: DecimalFormatSymbols constructor"); 2042 delete sym; 2043 return; 2044 } 2045 sym->setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); 2046 fmt.adoptDecimalFormatSymbols(sym); 2047 2048 str.truncate(0); 2049 fmt.format(2350.75, str); 2050 if (str == "Q 2,350.75") { 2051 logln(str); 2052 } else { 2053 dataerrln("Fail: adoptDecimalFormatSymbols -> " + str + ", expected Q 2,350.75"); 2054 } 2055 2056 sym = new DecimalFormatSymbols(Locale::getUS(), ec); 2057 if (U_FAILURE(ec)) { 2058 errln("Fail: DecimalFormatSymbols constructor"); 2059 delete sym; 2060 return; 2061 } 2062 DecimalFormat fmt2(pat, sym, ec); 2063 if (U_FAILURE(ec)) { 2064 errln("Fail: DecimalFormat constructor"); 2065 return; 2066 } 2067 2068 DecimalFormatSymbols sym2(Locale::getUS(), ec); 2069 if (U_FAILURE(ec)) { 2070 errln("Fail: DecimalFormatSymbols constructor"); 2071 return; 2072 } 2073 sym2.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); 2074 fmt2.setDecimalFormatSymbols(sym2); 2075 2076 str.truncate(0); 2077 fmt2.format(2350.75, str); 2078 if (str == "Q 2,350.75") { 2079 logln(str); 2080 } else { 2081 dataerrln("Fail: setDecimalFormatSymbols -> " + str + ", expected Q 2,350.75"); 2082 } 2083 } 2084 2085 void NumberFormatTest::TestPerMill() { 2086 UErrorCode ec = U_ZERO_ERROR; 2087 UnicodeString str; 2088 DecimalFormat fmt(ctou("###.###\\u2030"), ec); 2089 if (!assertSuccess("DecimalFormat ct", ec)) return; 2090 assertEquals("0.4857 x ###.###\\u2030", 2091 ctou("485.7\\u2030"), fmt.format(0.4857, str)); 2092 2093 DecimalFormatSymbols sym(Locale::getUS(), ec); 2094 sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, ctou("m")); 2095 DecimalFormat fmt2("", sym, ec); 2096 fmt2.applyLocalizedPattern("###.###m", ec); 2097 if (!assertSuccess("setup", ec)) return; 2098 str.truncate(0); 2099 assertEquals("0.4857 x ###.###m", 2100 "485.7m", fmt2.format(0.4857, str)); 2101 } 2102 2103 /** 2104 * Generic test for patterns that should be legal/illegal. 2105 */ 2106 void NumberFormatTest::TestIllegalPatterns() { 2107 // Test cases: 2108 // Prefix with "-:" for illegal patterns 2109 // Prefix with "+:" for legal patterns 2110 const char* DATA[] = { 2111 // Unquoted special characters in the suffix are illegal 2112 "-:000.000|###", 2113 "+:000.000'|###'", 2114 0 2115 }; 2116 for (int32_t i=0; DATA[i]; ++i) { 2117 const char* pat=DATA[i]; 2118 UBool valid = (*pat) == '+'; 2119 pat += 2; 2120 UErrorCode ec = U_ZERO_ERROR; 2121 DecimalFormat fmt(pat, ec); // locale doesn't matter here 2122 if (U_SUCCESS(ec) == valid) { 2123 logln("Ok: pattern \"%s\": %s", 2124 pat, u_errorName(ec)); 2125 } else { 2126 errcheckln(ec, "FAIL: pattern \"%s\" should have %s; got %s", 2127 pat, (valid?"succeeded":"failed"), 2128 u_errorName(ec)); 2129 } 2130 } 2131 } 2132 2133 //---------------------------------------------------------------------- 2134 2135 static const char* KEYWORDS[] = { 2136 /*0*/ "ref=", // <reference pattern to parse numbers> 2137 /*1*/ "loc=", // <locale for formats> 2138 /*2*/ "f:", // <pattern or '-'> <number> <exp. string> 2139 /*3*/ "fp:", // <pattern or '-'> <number> <exp. string> <exp. number> 2140 /*4*/ "rt:", // <pattern or '-'> <(exp.) number> <(exp.) string> 2141 /*5*/ "p:", // <pattern or '-'> <string> <exp. number> 2142 /*6*/ "perr:", // <pattern or '-'> <invalid string> 2143 /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'> 2144 /*8*/ "fpc:", // <pattern or '-'> <curr.amt> <exp. string> <exp. curr.amt> 2145 0 2146 }; 2147 2148 /** 2149 * Return an integer representing the next token from this 2150 * iterator. The integer will be an index into the given list, or 2151 * -1 if there are no more tokens, or -2 if the token is not on 2152 * the list. 2153 */ 2154 static int32_t keywordIndex(const UnicodeString& tok) { 2155 for (int32_t i=0; KEYWORDS[i]!=0; ++i) { 2156 if (tok==KEYWORDS[i]) { 2157 return i; 2158 } 2159 } 2160 return -1; 2161 } 2162 2163 /** 2164 * Parse a CurrencyAmount using the given NumberFormat, with 2165 * the 'delim' character separating the number and the currency. 2166 */ 2167 static void parseCurrencyAmount(const UnicodeString& str, 2168 const NumberFormat& fmt, 2169 UChar delim, 2170 Formattable& result, 2171 UErrorCode& ec) { 2172 UnicodeString num, cur; 2173 int32_t i = str.indexOf(delim); 2174 str.extractBetween(0, i, num); 2175 str.extractBetween(i+1, INT32_MAX, cur); 2176 Formattable n; 2177 fmt.parse(num, n, ec); 2178 result.adoptObject(new CurrencyAmount(n, cur.getTerminatedBuffer(), ec)); 2179 } 2180 2181 void NumberFormatTest::TestCases() { 2182 UErrorCode ec = U_ZERO_ERROR; 2183 TextFile reader("NumberFormatTestCases.txt", "UTF8", ec); 2184 if (U_FAILURE(ec)) { 2185 dataerrln("Couldn't open NumberFormatTestCases.txt"); 2186 return; 2187 } 2188 TokenIterator tokens(&reader); 2189 2190 Locale loc("en", "US", ""); 2191 DecimalFormat *ref = 0, *fmt = 0; 2192 MeasureFormat *mfmt = 0; 2193 UnicodeString pat, tok, mloc, str, out, where, currAmt; 2194 Formattable n; 2195 2196 for (;;) { 2197 ec = U_ZERO_ERROR; 2198 if (!tokens.next(tok, ec)) { 2199 break; 2200 } 2201 where = UnicodeString("(") + tokens.getLineNumber() + ") "; 2202 int32_t cmd = keywordIndex(tok); 2203 switch (cmd) { 2204 case 0: 2205 // ref= <reference pattern> 2206 if (!tokens.next(tok, ec)) goto error; 2207 delete ref; 2208 ref = new DecimalFormat(tok, 2209 new DecimalFormatSymbols(Locale::getUS(), ec), ec); 2210 if (U_FAILURE(ec)) { 2211 dataerrln("Error constructing DecimalFormat"); 2212 goto error; 2213 } 2214 break; 2215 case 1: 2216 // loc= <locale> 2217 if (!tokens.next(tok, ec)) goto error; 2218 loc = Locale::createFromName(CharString().appendInvariantChars(tok, ec).data()); 2219 break; 2220 case 2: // f: 2221 case 3: // fp: 2222 case 4: // rt: 2223 case 5: // p: 2224 if (!tokens.next(tok, ec)) goto error; 2225 if (tok != "-") { 2226 pat = tok; 2227 delete fmt; 2228 fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc, ec), ec); 2229 if (U_FAILURE(ec)) { 2230 errln("FAIL: " + where + "Pattern \"" + pat + "\": " + u_errorName(ec)); 2231 ec = U_ZERO_ERROR; 2232 if (!tokens.next(tok, ec)) goto error; 2233 if (!tokens.next(tok, ec)) goto error; 2234 if (cmd == 3) { 2235 if (!tokens.next(tok, ec)) goto error; 2236 } 2237 continue; 2238 } 2239 } 2240 if (cmd == 2 || cmd == 3 || cmd == 4) { 2241 // f: <pattern or '-'> <number> <exp. string> 2242 // fp: <pattern or '-'> <number> <exp. string> <exp. number> 2243 // rt: <pattern or '-'> <number> <string> 2244 UnicodeString num; 2245 if (!tokens.next(num, ec)) goto error; 2246 if (!tokens.next(str, ec)) goto error; 2247 ref->parse(num, n, ec); 2248 assertSuccess("parse", ec); 2249 assertEquals(where + "\"" + pat + "\".format(" + num + ")", 2250 str, fmt->format(n, out.remove(), ec)); 2251 assertSuccess("format", ec); 2252 if (cmd == 3) { // fp: 2253 if (!tokens.next(num, ec)) goto error; 2254 ref->parse(num, n, ec); 2255 assertSuccess("parse", ec); 2256 } 2257 if (cmd != 2) { // != f: 2258 Formattable m; 2259 fmt->parse(str, m, ec); 2260 assertSuccess("parse", ec); 2261 assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", 2262 n, m); 2263 } 2264 } 2265 // p: <pattern or '-'> <string to parse> <exp. number> 2266 else { 2267 UnicodeString expstr; 2268 if (!tokens.next(str, ec)) goto error; 2269 if (!tokens.next(expstr, ec)) goto error; 2270 Formattable exp, n; 2271 ref->parse(expstr, exp, ec); 2272 assertSuccess("parse", ec); 2273 fmt->parse(str, n, ec); 2274 assertSuccess("parse", ec); 2275 assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", 2276 exp, n); 2277 } 2278 break; 2279 case 8: // fpc: 2280 if (!tokens.next(tok, ec)) goto error; 2281 if (tok != "-") { 2282 mloc = tok; 2283 delete mfmt; 2284 mfmt = MeasureFormat::createCurrencyFormat( 2285 Locale::createFromName( 2286 CharString().appendInvariantChars(mloc, ec).data()), ec); 2287 if (U_FAILURE(ec)) { 2288 errln("FAIL: " + where + "Loc \"" + mloc + "\": " + u_errorName(ec)); 2289 ec = U_ZERO_ERROR; 2290 if (!tokens.next(tok, ec)) goto error; 2291 if (!tokens.next(tok, ec)) goto error; 2292 if (!tokens.next(tok, ec)) goto error; 2293 continue; 2294 } 2295 } else if (mfmt == NULL) { 2296 errln("FAIL: " + where + "Loc \"" + mloc + "\": skip case using previous locale, no valid MeasureFormat"); 2297 if (!tokens.next(tok, ec)) goto error; 2298 if (!tokens.next(tok, ec)) goto error; 2299 if (!tokens.next(tok, ec)) goto error; 2300 continue; 2301 } 2302 // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> 2303 if (!tokens.next(currAmt, ec)) goto error; 2304 if (!tokens.next(str, ec)) goto error; 2305 parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); 2306 if (assertSuccess("parseCurrencyAmount", ec)) { 2307 assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")", 2308 str, mfmt->format(n, out.remove(), ec)); 2309 assertSuccess("format", ec); 2310 } 2311 if (!tokens.next(currAmt, ec)) goto error; 2312 parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); 2313 if (assertSuccess("parseCurrencyAmount", ec)) { 2314 Formattable m; 2315 2316 mfmt->parseObject(str, m, ec); 2317 if (assertSuccess("parseCurrency", ec)) { 2318 assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", 2319 n, m); 2320 } else { 2321 errln("FAIL: source " + str); 2322 } 2323 } 2324 break; 2325 case 6: 2326 // perr: <pattern or '-'> <invalid string> 2327 errln("FAIL: Under construction"); 2328 goto done; 2329 case 7: { 2330 // pat: <pattern> <exp. toPattern, or '-' or 'err'> 2331 UnicodeString testpat; 2332 UnicodeString exppat; 2333 if (!tokens.next(testpat, ec)) goto error; 2334 if (!tokens.next(exppat, ec)) goto error; 2335 UBool err = exppat == "err"; 2336 UBool existingPat = FALSE; 2337 if (testpat == "-") { 2338 if (err) { 2339 errln("FAIL: " + where + "Invalid command \"pat: - err\""); 2340 continue; 2341 } 2342 existingPat = TRUE; 2343 testpat = pat; 2344 } 2345 if (exppat == "-") exppat = testpat; 2346 DecimalFormat* f = 0; 2347 UErrorCode ec2 = U_ZERO_ERROR; 2348 if (existingPat) { 2349 f = fmt; 2350 } else { 2351 f = new DecimalFormat(testpat, ec2); 2352 } 2353 if (U_SUCCESS(ec2)) { 2354 if (err) { 2355 errln("FAIL: " + where + "Invalid pattern \"" + testpat + 2356 "\" was accepted"); 2357 } else { 2358 UnicodeString pat2; 2359 assertEquals(where + "\"" + testpat + "\".toPattern()", 2360 exppat, f->toPattern(pat2)); 2361 } 2362 } else { 2363 if (err) { 2364 logln("Ok: " + where + "Invalid pattern \"" + testpat + 2365 "\" failed: " + u_errorName(ec2)); 2366 } else { 2367 errln("FAIL: " + where + "Valid pattern \"" + testpat + 2368 "\" failed: " + u_errorName(ec2)); 2369 } 2370 } 2371 if (!existingPat) delete f; 2372 } break; 2373 case -1: 2374 errln("FAIL: " + where + "Unknown command \"" + tok + "\""); 2375 goto done; 2376 } 2377 } 2378 goto done; 2379 2380 error: 2381 if (U_SUCCESS(ec)) { 2382 errln("FAIL: Unexpected EOF"); 2383 } else { 2384 errcheckln(ec, "FAIL: " + where + "Unexpected " + u_errorName(ec)); 2385 } 2386 2387 done: 2388 delete mfmt; 2389 delete fmt; 2390 delete ref; 2391 } 2392 2393 2394 //---------------------------------------------------------------------- 2395 // Support methods 2396 //---------------------------------------------------------------------- 2397 2398 UBool NumberFormatTest::equalValue(const Formattable& a, const Formattable& b) { 2399 if (a.getType() == b.getType()) { 2400 return a == b; 2401 } 2402 2403 if (a.getType() == Formattable::kLong) { 2404 if (b.getType() == Formattable::kInt64) { 2405 return a.getLong() == b.getLong(); 2406 } else if (b.getType() == Formattable::kDouble) { 2407 return (double) a.getLong() == b.getDouble(); // TODO check use of double instead of long 2408 } 2409 } else if (a.getType() == Formattable::kDouble) { 2410 if (b.getType() == Formattable::kLong) { 2411 return a.getDouble() == (double) b.getLong(); 2412 } else if (b.getType() == Formattable::kInt64) { 2413 return a.getDouble() == (double)b.getInt64(); 2414 } 2415 } else if (a.getType() == Formattable::kInt64) { 2416 if (b.getType() == Formattable::kLong) { 2417 return a.getInt64() == (int64_t)b.getLong(); 2418 } else if (b.getType() == Formattable::kDouble) { 2419 return a.getInt64() == (int64_t)b.getDouble(); 2420 } 2421 } 2422 return FALSE; 2423 } 2424 2425 void NumberFormatTest::expect3(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) { 2426 // Don't round-trip format test, since we explicitly do it 2427 expect_rbnf(fmt, n, str, FALSE); 2428 expect_rbnf(fmt, str, n); 2429 } 2430 2431 void NumberFormatTest::expect2(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) { 2432 // Don't round-trip format test, since we explicitly do it 2433 expect(fmt, n, str, FALSE); 2434 expect(fmt, str, n); 2435 } 2436 2437 void NumberFormatTest::expect2(NumberFormat* fmt, const Formattable& n, 2438 const UnicodeString& exp, 2439 UErrorCode status) { 2440 if (fmt == NULL || U_FAILURE(status)) { 2441 dataerrln("FAIL: NumberFormat constructor"); 2442 } else { 2443 expect2(*fmt, n, exp); 2444 } 2445 delete fmt; 2446 } 2447 2448 void NumberFormatTest::expect(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) { 2449 UErrorCode status = U_ZERO_ERROR; 2450 Formattable num; 2451 fmt.parse(str, num, status); 2452 if (U_FAILURE(status)) { 2453 dataerrln(UnicodeString("FAIL: Parse failed for \"") + str + "\" - " + u_errorName(status)); 2454 return; 2455 } 2456 UnicodeString pat; 2457 ((DecimalFormat*) &fmt)->toPattern(pat); 2458 if (equalValue(num, n)) { 2459 logln(UnicodeString("Ok \"") + str + "\" x " + 2460 pat + " = " + 2461 toString(num)); 2462 } else { 2463 dataerrln(UnicodeString("FAIL \"") + str + "\" x " + 2464 pat + " = " + 2465 toString(num) + ", expected " + toString(n)); 2466 } 2467 } 2468 2469 void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) { 2470 UErrorCode status = U_ZERO_ERROR; 2471 Formattable num; 2472 fmt.parse(str, num, status); 2473 if (U_FAILURE(status)) { 2474 errln(UnicodeString("FAIL: Parse failed for \"") + str + "\""); 2475 return; 2476 } 2477 if (equalValue(num, n)) { 2478 logln(UnicodeString("Ok \"") + str + " = " + 2479 toString(num)); 2480 } else { 2481 errln(UnicodeString("FAIL \"") + str + " = " + 2482 toString(num) + ", expected " + toString(n)); 2483 } 2484 } 2485 2486 void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const Formattable& n, 2487 const UnicodeString& exp, UBool rt) { 2488 UnicodeString saw; 2489 FieldPosition pos; 2490 UErrorCode status = U_ZERO_ERROR; 2491 fmt.format(n, saw, pos, status); 2492 CHECK(status, "NumberFormat::format"); 2493 if (saw == exp) { 2494 logln(UnicodeString("Ok ") + toString(n) + 2495 " = \"" + 2496 escape(saw) + "\""); 2497 // We should be able to round-trip the formatted string => 2498 // number => string (but not the other way around: number 2499 // => string => number2, might have number2 != number): 2500 if (rt) { 2501 Formattable n2; 2502 fmt.parse(exp, n2, status); 2503 if (U_FAILURE(status)) { 2504 errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\""); 2505 return; 2506 } 2507 UnicodeString saw2; 2508 fmt.format(n2, saw2, pos, status); 2509 CHECK(status, "NumberFormat::format"); 2510 if (saw2 != exp) { 2511 errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + 2512 " => \"" + saw2 + "\""); 2513 } 2514 } 2515 } else { 2516 errln(UnicodeString("FAIL ") + toString(n) + 2517 " = \"" + 2518 escape(saw) + "\", expected \"" + exp + "\""); 2519 } 2520 } 2521 2522 void NumberFormatTest::expect(NumberFormat& fmt, const Formattable& n, 2523 const UnicodeString& exp, UBool rt) { 2524 UnicodeString saw; 2525 FieldPosition pos; 2526 UErrorCode status = U_ZERO_ERROR; 2527 fmt.format(n, saw, pos, status); 2528 CHECK(status, "NumberFormat::format"); 2529 UnicodeString pat; 2530 ((DecimalFormat*) &fmt)->toPattern(pat); 2531 if (saw == exp) { 2532 logln(UnicodeString("Ok ") + toString(n) + " x " + 2533 escape(pat) + " = \"" + 2534 escape(saw) + "\""); 2535 // We should be able to round-trip the formatted string => 2536 // number => string (but not the other way around: number 2537 // => string => number2, might have number2 != number): 2538 if (rt) { 2539 Formattable n2; 2540 fmt.parse(exp, n2, status); 2541 if (U_FAILURE(status)) { 2542 errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\" - " + u_errorName(status)); 2543 return; 2544 } 2545 UnicodeString saw2; 2546 fmt.format(n2, saw2, pos, status); 2547 CHECK(status, "NumberFormat::format"); 2548 if (saw2 != exp) { 2549 errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + 2550 " => \"" + saw2 + "\""); 2551 } 2552 } 2553 } else { 2554 dataerrln(UnicodeString("FAIL ") + toString(n) + " x " + 2555 escape(pat) + " = \"" + 2556 escape(saw) + "\", expected \"" + exp + "\""); 2557 } 2558 } 2559 2560 void NumberFormatTest::expect(NumberFormat* fmt, const Formattable& n, 2561 const UnicodeString& exp, UBool rt, 2562 UErrorCode status) { 2563 if (fmt == NULL || U_FAILURE(status)) { 2564 dataerrln("FAIL: NumberFormat constructor"); 2565 } else { 2566 expect(*fmt, n, exp, rt); 2567 } 2568 delete fmt; 2569 } 2570 2571 void NumberFormatTest::expectCurrency(NumberFormat& nf, const Locale& locale, 2572 double value, const UnicodeString& string) { 2573 UErrorCode ec = U_ZERO_ERROR; 2574 DecimalFormat& fmt = * (DecimalFormat*) &nf; 2575 const UChar DEFAULT_CURR[] = {45/*-*/,0}; 2576 UChar curr[4]; 2577 u_strcpy(curr, DEFAULT_CURR); 2578 if (*locale.getLanguage() != 0) { 2579 ucurr_forLocale(locale.getName(), curr, 4, &ec); 2580 assertSuccess("ucurr_forLocale", ec); 2581 fmt.setCurrency(curr, ec); 2582 assertSuccess("DecimalFormat::setCurrency", ec); 2583 fmt.setCurrency(curr); //Deprecated variant, for coverage only 2584 } 2585 UnicodeString s; 2586 fmt.format(value, s); 2587 s.findAndReplace((UChar32)0x00A0, (UChar32)0x0020); 2588 2589 // Default display of the number yields "1234.5599999999999" 2590 // instead of "1234.56". Use a formatter to fix this. 2591 NumberFormat* f = 2592 NumberFormat::createInstance(Locale::getUS(), ec); 2593 UnicodeString v; 2594 if (U_FAILURE(ec)) { 2595 // Oops; bad formatter. Use default op+= display. 2596 v = (UnicodeString)"" + value; 2597 } else { 2598 f->setMaximumFractionDigits(4); 2599 f->setGroupingUsed(FALSE); 2600 f->format(value, v); 2601 } 2602 delete f; 2603 2604 if (s == string) { 2605 logln((UnicodeString)"Ok: " + v + " x " + curr + " => " + prettify(s)); 2606 } else { 2607 errln((UnicodeString)"FAIL: " + v + " x " + curr + " => " + prettify(s) + 2608 ", expected " + prettify(string)); 2609 } 2610 } 2611 2612 void NumberFormatTest::expectPat(DecimalFormat& fmt, const UnicodeString& exp) { 2613 UnicodeString pat; 2614 fmt.toPattern(pat); 2615 if (pat == exp) { 2616 logln(UnicodeString("Ok \"") + pat + "\""); 2617 } else { 2618 errln(UnicodeString("FAIL \"") + pat + "\", expected \"" + exp + "\""); 2619 } 2620 } 2621 2622 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, 2623 int32_t pos) { 2624 expectPad(fmt, pat, pos, 0, (UnicodeString)""); 2625 } 2626 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, 2627 int32_t pos, int32_t width, UChar pad) { 2628 expectPad(fmt, pat, pos, width, UnicodeString(pad)); 2629 } 2630 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, 2631 int32_t pos, int32_t width, const UnicodeString& pad) { 2632 int32_t apos = 0, awidth = 0; 2633 UnicodeString apadStr; 2634 UErrorCode status = U_ZERO_ERROR; 2635 fmt.applyPattern(pat, status); 2636 if (U_SUCCESS(status)) { 2637 apos = fmt.getPadPosition(); 2638 awidth = fmt.getFormatWidth(); 2639 apadStr=fmt.getPadCharacterString(); 2640 } else { 2641 apos = -1; 2642 awidth = width; 2643 apadStr = pad; 2644 } 2645 if (apos == pos && awidth == width && apadStr == pad) { 2646 UnicodeString infoStr; 2647 if (pos == ILLEGAL) { 2648 infoStr = UnicodeString(" width=", "") + awidth + UnicodeString(" pad=", "") + apadStr; 2649 } 2650 logln(UnicodeString("Ok \"") + pat + "\" pos=" + apos + infoStr); 2651 } else { 2652 errln(UnicodeString("FAIL \"") + pat + "\" pos=" + apos + 2653 " width=" + awidth + " pad=" + apadStr + 2654 ", expected " + pos + " " + width + " " + pad); 2655 } 2656 } 2657 2658 // This test is flaky b/c the symbols for CNY and JPY are equivalent in this locale - FIXME 2659 void NumberFormatTest::TestCompatibleCurrencies() { 2660 /* 2661 static const UChar JPY[] = {0x4A, 0x50, 0x59, 0}; 2662 static const UChar CNY[] = {0x43, 0x4E, 0x59, 0}; 2663 UErrorCode status = U_ZERO_ERROR; 2664 LocalPointer<NumberFormat> fmt( 2665 NumberFormat::createCurrencyInstance(Locale::getUS(), status)); 2666 if (U_FAILURE(status)) { 2667 errln("Could not create number format instance."); 2668 return; 2669 } 2670 logln("%s:%d - testing parse of halfwidth yen sign\n", __FILE__, __LINE__); 2671 expectParseCurrency(*fmt, JPY, 1235, "\\u00A51,235"); 2672 logln("%s:%d - testing parse of fullwidth yen sign\n", __FILE__, __LINE__); 2673 expectParseCurrency(*fmt, JPY, 1235, "\\uFFE51,235"); 2674 logln("%s:%d - testing parse of halfwidth yen sign\n", __FILE__, __LINE__); 2675 expectParseCurrency(*fmt, CNY, 1235, "CN\\u00A51,235"); 2676 2677 LocalPointer<NumberFormat> fmtTW( 2678 NumberFormat::createCurrencyInstance(Locale::getTaiwan(), status)); 2679 2680 logln("%s:%d - testing parse of halfwidth yen sign in TW\n", __FILE__, __LINE__); 2681 expectParseCurrency(*fmtTW, CNY, 1235, "\\u00A51,235"); 2682 logln("%s:%d - testing parse of fullwidth yen sign in TW\n", __FILE__, __LINE__); 2683 expectParseCurrency(*fmtTW, CNY, 1235, "\\uFFE51,235"); 2684 2685 LocalPointer<NumberFormat> fmtJP( 2686 NumberFormat::createCurrencyInstance(Locale::getJapan(), status)); 2687 2688 logln("%s:%d - testing parse of halfwidth yen sign in JP\n", __FILE__, __LINE__); 2689 expectParseCurrency(*fmtJP, JPY, 1235, "\\u00A51,235"); 2690 logln("%s:%d - testing parse of fullwidth yen sign in JP\n", __FILE__, __LINE__); 2691 expectParseCurrency(*fmtJP, JPY, 1235, "\\uFFE51,235"); 2692 2693 // more.. 2694 */ 2695 } 2696 2697 void NumberFormatTest::expectParseCurrency(const NumberFormat &fmt, const UChar* currency, double amount, const char *text) { 2698 ParsePosition ppos; 2699 UnicodeString utext = ctou(text); 2700 LocalPointer<CurrencyAmount> currencyAmount(fmt.parseCurrency(utext, ppos)); 2701 if (!ppos.getIndex()) { 2702 errln(UnicodeString("Parse of ") + utext + " should have succeeded."); 2703 return; 2704 } 2705 UErrorCode status = U_ZERO_ERROR; 2706 2707 char theInfo[100]; 2708 sprintf(theInfo, "For locale %s, string \"%s\", currency ", 2709 fmt.getLocale(ULOC_ACTUAL_LOCALE, status).getBaseName(), 2710 text); 2711 u_austrcpy(theInfo+uprv_strlen(theInfo), currency); 2712 2713 char theOperation[100]; 2714 2715 uprv_strcpy(theOperation, theInfo); 2716 uprv_strcat(theOperation, ", check amount:"); 2717 assertTrue(theOperation, amount == currencyAmount->getNumber().getDouble(status)); 2718 2719 uprv_strcpy(theOperation, theInfo); 2720 uprv_strcat(theOperation, ", check currency:"); 2721 assertEquals(theOperation, currency, currencyAmount->getISOCurrency()); 2722 } 2723 2724 2725 void NumberFormatTest::TestJB3832(){ 2726 const char* localeID = "pt_PT@currency=PTE"; 2727 Locale loc(localeID); 2728 UErrorCode status = U_ZERO_ERROR; 2729 UnicodeString expected(CharsToUnicodeString("1,150$50\\u00A0\\u200B")); // per cldrbug 7670 2730 UnicodeString s; 2731 NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(loc, status); 2732 if(U_FAILURE(status)){ 2733 dataerrln("Could not create currency formatter for locale %s - %s", localeID, u_errorName(status)); 2734 return; 2735 } 2736 currencyFmt->format(1150.50, s); 2737 if(s!=expected){ 2738 errln(UnicodeString("FAIL: Expected: ")+expected 2739 + UnicodeString(" Got: ") + s 2740 + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); 2741 } 2742 if (U_FAILURE(status)){ 2743 errln("FAIL: Status %s", u_errorName(status)); 2744 } 2745 delete currencyFmt; 2746 } 2747 2748 void NumberFormatTest::TestHost() 2749 { 2750 #if U_PLATFORM_USES_ONLY_WIN32_API 2751 Win32NumberTest::testLocales(this); 2752 #endif 2753 Locale loc("en_US@compat=host"); 2754 for (UNumberFormatStyle k = UNUM_DECIMAL; 2755 k < UNUM_FORMAT_STYLE_COUNT; k = (UNumberFormatStyle)(k+1)) { 2756 UErrorCode status = U_ZERO_ERROR; 2757 LocalPointer<NumberFormat> full(NumberFormat::createInstance(loc, k, status)); 2758 if (!NumberFormat::isStyleSupported(k)) { 2759 if (status != U_UNSUPPORTED_ERROR) { 2760 errln("FAIL: expected style %d to be unsupported - %s", 2761 k, u_errorName(status)); 2762 } 2763 continue; 2764 } 2765 if (full.isNull() || U_FAILURE(status)) { 2766 dataerrln("FAIL: Can't create number instance of style %d for host - %s", 2767 k, u_errorName(status)); 2768 return; 2769 } 2770 UnicodeString result1; 2771 Formattable number(10.00); 2772 full->format(number, result1, status); 2773 if (U_FAILURE(status)) { 2774 errln("FAIL: Can't format for host"); 2775 return; 2776 } 2777 Formattable formattable; 2778 full->parse(result1, formattable, status); 2779 if (U_FAILURE(status)) { 2780 errln("FAIL: Can't parse for host"); 2781 return; 2782 } 2783 } 2784 } 2785 2786 void NumberFormatTest::TestHostClone() 2787 { 2788 /* 2789 Verify that a cloned formatter gives the same results 2790 and is useable after the original has been deleted. 2791 */ 2792 // This is mainly important on Windows. 2793 UErrorCode status = U_ZERO_ERROR; 2794 Locale loc("en_US@compat=host"); 2795 UDate now = Calendar::getNow(); 2796 NumberFormat *full = NumberFormat::createInstance(loc, status); 2797 if (full == NULL || U_FAILURE(status)) { 2798 dataerrln("FAIL: Can't create Relative date instance - %s", u_errorName(status)); 2799 return; 2800 } 2801 UnicodeString result1; 2802 full->format(now, result1, status); 2803 Format *fullClone = full->clone(); 2804 delete full; 2805 full = NULL; 2806 2807 UnicodeString result2; 2808 fullClone->format(now, result2, status); 2809 if (U_FAILURE(status)) { 2810 errln("FAIL: format failure."); 2811 } 2812 if (result1 != result2) { 2813 errln("FAIL: Clone returned different result from non-clone."); 2814 } 2815 delete fullClone; 2816 } 2817 2818 void NumberFormatTest::TestCurrencyFormat() 2819 { 2820 // This test is here to increase code coverage. 2821 UErrorCode status = U_ZERO_ERROR; 2822 MeasureFormat *cloneObj; 2823 UnicodeString str; 2824 Formattable toFormat, result; 2825 static const UChar ISO_CODE[4] = {0x0047, 0x0042, 0x0050, 0}; 2826 2827 Locale saveDefaultLocale = Locale::getDefault(); 2828 Locale::setDefault( Locale::getUK(), status ); 2829 if (U_FAILURE(status)) { 2830 errln("couldn't set default Locale!"); 2831 return; 2832 } 2833 2834 MeasureFormat *measureObj = MeasureFormat::createCurrencyFormat(status); 2835 Locale::setDefault( saveDefaultLocale, status ); 2836 if (U_FAILURE(status)){ 2837 dataerrln("FAIL: Status %s", u_errorName(status)); 2838 return; 2839 } 2840 cloneObj = (MeasureFormat *)measureObj->clone(); 2841 if (cloneObj == NULL) { 2842 errln("Clone doesn't work"); 2843 return; 2844 } 2845 toFormat.adoptObject(new CurrencyAmount(1234.56, ISO_CODE, status)); 2846 measureObj->format(toFormat, str, status); 2847 measureObj->parseObject(str, result, status); 2848 if (U_FAILURE(status)){ 2849 errln("FAIL: Status %s", u_errorName(status)); 2850 } 2851 if (result != toFormat) { 2852 errln("measureObj does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat)); 2853 } 2854 status = U_ZERO_ERROR; 2855 str.truncate(0); 2856 cloneObj->format(toFormat, str, status); 2857 cloneObj->parseObject(str, result, status); 2858 if (U_FAILURE(status)){ 2859 errln("FAIL: Status %s", u_errorName(status)); 2860 } 2861 if (result != toFormat) { 2862 errln("Clone does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat)); 2863 } 2864 if (*measureObj != *cloneObj) { 2865 errln("Cloned object is not equal to the original object"); 2866 } 2867 delete measureObj; 2868 delete cloneObj; 2869 2870 status = U_USELESS_COLLATOR_ERROR; 2871 if (MeasureFormat::createCurrencyFormat(status) != NULL) { 2872 errln("createCurrencyFormat should have returned NULL."); 2873 } 2874 } 2875 2876 /* Port of ICU4J rounding test. */ 2877 void NumberFormatTest::TestRounding() { 2878 UErrorCode status = U_ZERO_ERROR; 2879 DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Locale::getEnglish(), status); 2880 2881 if (U_FAILURE(status)) { 2882 dataerrln("Unable to create decimal formatter. - %s", u_errorName(status)); 2883 return; 2884 } 2885 2886 int roundingIncrements[]={1, 2, 5, 20, 50, 100}; 2887 int testValues[]={0, 300}; 2888 2889 for (int j=0; j<2; j++) { 2890 for (int mode=DecimalFormat::kRoundUp;mode<DecimalFormat::kRoundHalfEven;mode++) { 2891 df->setRoundingMode((DecimalFormat::ERoundingMode)mode); 2892 for (int increment=0; increment<6; increment++) { 2893 double base=testValues[j]; 2894 double rInc=roundingIncrements[increment]; 2895 checkRounding(df, base, 20, rInc); 2896 rInc=1.000000000/rInc; 2897 checkRounding(df, base, 20, rInc); 2898 } 2899 } 2900 } 2901 delete df; 2902 } 2903 2904 void NumberFormatTest::TestRoundingPattern() { 2905 UErrorCode status = U_ZERO_ERROR; 2906 struct { 2907 UnicodeString pattern; 2908 double testCase; 2909 UnicodeString expected; 2910 } tests[] = { 2911 { (UnicodeString)"##0.65", 1.234, (UnicodeString)"1.30" }, 2912 { (UnicodeString)"#50", 1230, (UnicodeString)"1250" } 2913 }; 2914 int32_t numOfTests = (sizeof(tests)/sizeof(tests[0])); 2915 UnicodeString result; 2916 2917 DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Locale::getEnglish(), status); 2918 if (U_FAILURE(status)) { 2919 dataerrln("Unable to create decimal formatter. - %s", u_errorName(status)); 2920 return; 2921 } 2922 2923 for (int32_t i = 0; i < numOfTests; i++) { 2924 result.remove(); 2925 2926 df->applyPattern(tests[i].pattern, status); 2927 if (U_FAILURE(status)) { 2928 errln("Unable to apply pattern to decimal formatter. - %s", u_errorName(status)); 2929 } 2930 2931 df->format(tests[i].testCase, result); 2932 2933 if (result != tests[i].expected) { 2934 errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected); 2935 } 2936 } 2937 2938 delete df; 2939 } 2940 2941 void NumberFormatTest::checkRounding(DecimalFormat* df, double base, int iterations, double increment) { 2942 df->setRoundingIncrement(increment); 2943 double lastParsed=INT32_MIN; //Intger.MIN_VALUE 2944 for (int i=-iterations; i<=iterations;i++) { 2945 double iValue=base+(increment*(i*0.1)); 2946 double smallIncrement=0.00000001; 2947 if (iValue!=0) { 2948 smallIncrement*=iValue; 2949 } 2950 //we not only test the value, but some values in a small range around it 2951 lastParsed=checkRound(df, iValue-smallIncrement, lastParsed); 2952 lastParsed=checkRound(df, iValue, lastParsed); 2953 lastParsed=checkRound(df, iValue+smallIncrement, lastParsed); 2954 } 2955 } 2956 2957 double NumberFormatTest::checkRound(DecimalFormat* df, double iValue, double lastParsed) { 2958 UErrorCode status=U_ZERO_ERROR; 2959 UnicodeString formattedDecimal; 2960 double parsed; 2961 Formattable result; 2962 df->format(iValue, formattedDecimal, status); 2963 2964 if (U_FAILURE(status)) { 2965 errln("Error formatting number."); 2966 } 2967 2968 df->parse(formattedDecimal, result, status); 2969 2970 if (U_FAILURE(status)) { 2971 errln("Error parsing number."); 2972 } 2973 2974 parsed=result.getDouble(); 2975 2976 if (lastParsed>parsed) { 2977 errln("Rounding wrong direction! %d > %d", lastParsed, parsed); 2978 } 2979 2980 return lastParsed; 2981 } 2982 2983 void NumberFormatTest::TestNonpositiveMultiplier() { 2984 UErrorCode status = U_ZERO_ERROR; 2985 DecimalFormatSymbols US(Locale::getUS(), status); 2986 CHECK(status, "DecimalFormatSymbols constructor"); 2987 DecimalFormat df(UnicodeString("0"), US, status); 2988 CHECK(status, "DecimalFormat(0)"); 2989 2990 // test zero multiplier 2991 2992 int32_t mult = df.getMultiplier(); 2993 df.setMultiplier(0); 2994 if (df.getMultiplier() != mult) { 2995 errln("DecimalFormat.setMultiplier(0) did not ignore its zero input"); 2996 } 2997 2998 // test negative multiplier 2999 3000 df.setMultiplier(-1); 3001 if (df.getMultiplier() != -1) { 3002 errln("DecimalFormat.setMultiplier(-1) ignored its negative input"); 3003 return; 3004 } 3005 3006 expect(df, "1122.123", -1122.123); 3007 expect(df, "-1122.123", 1122.123); 3008 expect(df, "1.2", -1.2); 3009 expect(df, "-1.2", 1.2); 3010 3011 // Note: the tests with the final parameter of FALSE will not round trip. 3012 // The initial numeric value will format correctly, after the multiplier. 3013 // Parsing the formatted text will be out-of-range for an int64, however. 3014 // The expect() function could be modified to detect this and fall back 3015 // to looking at the decimal parsed value, but it doesn't. 3016 expect(df, U_INT64_MIN, "9223372036854775808", FALSE); 3017 expect(df, U_INT64_MIN+1, "9223372036854775807"); 3018 expect(df, (int64_t)-123, "123"); 3019 expect(df, (int64_t)123, "-123"); 3020 expect(df, U_INT64_MAX-1, "-9223372036854775806"); 3021 expect(df, U_INT64_MAX, "-9223372036854775807"); 3022 3023 df.setMultiplier(-2); 3024 expect(df, -(U_INT64_MIN/2)-1, "-9223372036854775806"); 3025 expect(df, -(U_INT64_MIN/2), "-9223372036854775808"); 3026 expect(df, -(U_INT64_MIN/2)+1, "-9223372036854775810", FALSE); 3027 3028 df.setMultiplier(-7); 3029 expect(df, -(U_INT64_MAX/7)-1, "9223372036854775814", FALSE); 3030 expect(df, -(U_INT64_MAX/7), "9223372036854775807"); 3031 expect(df, -(U_INT64_MAX/7)+1, "9223372036854775800"); 3032 3033 // TODO: uncomment (and fix up) all the following int64_t tests once BigInteger is ported 3034 // (right now the big numbers get turned into doubles and lose tons of accuracy) 3035 //expect2(df, U_INT64_MAX, Int64ToUnicodeString(-U_INT64_MAX)); 3036 //expect2(df, U_INT64_MIN, UnicodeString(Int64ToUnicodeString(U_INT64_MIN), 1)); 3037 //expect2(df, U_INT64_MAX / 2, Int64ToUnicodeString(-(U_INT64_MAX / 2))); 3038 //expect2(df, U_INT64_MIN / 2, Int64ToUnicodeString(-(U_INT64_MIN / 2))); 3039 3040 // TODO: uncomment (and fix up) once BigDecimal is ported and DecimalFormat can handle it 3041 //expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 3042 //expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 3043 //expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 3044 //expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 3045 } 3046 3047 typedef struct { 3048 const char * stringToParse; 3049 int parsedPos; 3050 int errorIndex; 3051 UBool lenient; 3052 } TestSpaceParsingItem; 3053 3054 void 3055 NumberFormatTest::TestSpaceParsing() { 3056 // the data are: 3057 // the string to be parsed, parsed position, parsed error index 3058 const TestSpaceParsingItem DATA[] = { 3059 // TOTO: Update the following TODOs, some may be handled now 3060 {"$124", 4, -1, FALSE}, 3061 {"$124 $124", 4, -1, FALSE}, 3062 {"$124 ", 4, -1, FALSE}, 3063 //{"$ 124 ", 5, -1, FALSE}, // TODO: need to handle space correctly 3064 //{"$\\u00A0124 ", 5, -1, FALSE}, // TODO: need to handle space correctly 3065 {"$ 124 ", 0, 1, FALSE}, // errorIndex used to be 0, now 1 (better) 3066 {"$\\u00A0124 ", 0, 1, FALSE}, // errorIndex used to be 0, now 1 (better) 3067 {" $ 124 ", 0, 0, FALSE}, // TODO: need to handle space correctly 3068 {"124$", 0, 3, FALSE}, // TODO: need to handle space correctly 3069 // {"124 $", 5, -1, FALSE}, // TODO: OK or not, need currency spacing rule 3070 {"124 $", 0, 3, FALSE}, 3071 {"$124", 4, -1, TRUE}, 3072 {"$124 $124", 4, -1, TRUE}, 3073 {"$124 ", 4, -1, TRUE}, 3074 {"$ 124 ", 5, -1, TRUE}, 3075 {"$\\u00A0124 ", 5, -1, TRUE}, 3076 {" $ 124 ", 6, -1, TRUE}, 3077 //{"124$", 4, -1, TRUE}, // TODO: need to handle trailing currency correctly 3078 {"124$", 3, -1, TRUE}, 3079 //{"124 $", 5, -1, TRUE}, // TODO: OK or not, need currency spacing rule 3080 {"124 $", 4, -1, TRUE}, 3081 }; 3082 UErrorCode status = U_ZERO_ERROR; 3083 Locale locale("en_US"); 3084 NumberFormat* foo = NumberFormat::createCurrencyInstance(locale, status); 3085 3086 if (U_FAILURE(status)) { 3087 delete foo; 3088 return; 3089 } 3090 for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { 3091 ParsePosition parsePosition(0); 3092 UnicodeString stringToBeParsed = ctou(DATA[i].stringToParse); 3093 int parsedPosition = DATA[i].parsedPos; 3094 int errorIndex = DATA[i].errorIndex; 3095 foo->setLenient(DATA[i].lenient); 3096 Formattable result; 3097 foo->parse(stringToBeParsed, result, parsePosition); 3098 if (parsePosition.getIndex() != parsedPosition || 3099 parsePosition.getErrorIndex() != errorIndex) { 3100 errln("FAILED parse " + stringToBeParsed + "; lenient: " + DATA[i].lenient + "; wrong position, expected: (" + parsedPosition + ", " + errorIndex + "); got (" + parsePosition.getIndex() + ", " + parsePosition.getErrorIndex() + ")"); 3101 } 3102 if (parsePosition.getErrorIndex() == -1 && 3103 result.getType() == Formattable::kLong && 3104 result.getLong() != 124) { 3105 errln("FAILED parse " + stringToBeParsed + "; wrong number, expect: 124, got " + result.getLong()); 3106 } 3107 } 3108 delete foo; 3109 } 3110 3111 /** 3112 * Test using various numbering systems and numbering system keyword. 3113 */ 3114 typedef struct { 3115 const char *localeName; 3116 double value; 3117 UBool isRBNF; 3118 const char *expectedResult; 3119 } TestNumberingSystemItem; 3120 3121 void NumberFormatTest::TestNumberingSystems() { 3122 3123 const TestNumberingSystemItem DATA[] = { 3124 { "en_US@numbers=thai", 1234.567, FALSE, "\\u0E51,\\u0E52\\u0E53\\u0E54.\\u0E55\\u0E56\\u0E57" }, 3125 { "en_US@numbers=hebr", 5678.0, TRUE, "\\u05D4\\u05F3\\u05EA\\u05E8\\u05E2\\u05F4\\u05D7" }, 3126 { "en_US@numbers=arabext", 1234.567, FALSE, "\\u06F1\\u066c\\u06F2\\u06F3\\u06F4\\u066b\\u06F5\\u06F6\\u06F7" }, 3127 { "ar_EG", 1234.567, FALSE, "\\u0661\\u066C\\u0662\\u0663\\u0664\\u066b\\u0665\\u0666\\u0667" }, 3128 { "th_TH@numbers=traditional", 1234.567, FALSE, "\\u0E51,\\u0E52\\u0E53\\u0E54.\\u0E55\\u0E56\\u0E57" }, // fall back to native per TR35 3129 { "ar_MA", 1234.567, FALSE, "1.234,567" }, 3130 { "en_US@numbers=hanidec", 1234.567, FALSE, "\\u4e00,\\u4e8c\\u4e09\\u56db.\\u4e94\\u516d\\u4e03" }, 3131 { "ta_IN@numbers=native", 1234.567, FALSE, "\\u0BE7,\\u0BE8\\u0BE9\\u0BEA.\\u0BEB\\u0BEC\\u0BED" }, 3132 { "ta_IN@numbers=traditional", 1235.0, TRUE, "\\u0BF2\\u0BE8\\u0BF1\\u0BE9\\u0BF0\\u0BEB" }, 3133 { "ta_IN@numbers=finance", 1234.567, FALSE, "1,234.567" }, // fall back to default per TR35 3134 { "zh_TW@numbers=native", 1234.567, FALSE, "\\u4e00,\\u4e8c\\u4e09\\u56db.\\u4e94\\u516d\\u4e03" }, 3135 { "zh_TW@numbers=traditional", 1234.567, TRUE, "\\u4E00\\u5343\\u4E8C\\u767E\\u4E09\\u5341\\u56DB\\u9EDE\\u4E94\\u516D\\u4E03" }, 3136 { "zh_TW@numbers=finance", 1234.567, TRUE, "\\u58F9\\u4EDF\\u8CB3\\u4F70\\u53C3\\u62FE\\u8086\\u9EDE\\u4F0D\\u9678\\u67D2" }, 3137 { NULL, 0, FALSE, NULL } 3138 }; 3139 3140 UErrorCode ec; 3141 3142 const TestNumberingSystemItem *item; 3143 for (item = DATA; item->localeName != NULL; item++) { 3144 ec = U_ZERO_ERROR; 3145 Locale loc = Locale::createFromName(item->localeName); 3146 3147 NumberFormat *origFmt = NumberFormat::createInstance(loc,ec); 3148 if (U_FAILURE(ec)) { 3149 dataerrln("FAIL: getInstance(%s) - %s", item->localeName, u_errorName(ec)); 3150 continue; 3151 } 3152 // Clone to test ticket #10682 3153 NumberFormat *fmt = (NumberFormat *) origFmt->clone(); 3154 delete origFmt; 3155 3156 3157 if (item->isRBNF) { 3158 expect3(*fmt,item->value,CharsToUnicodeString(item->expectedResult)); 3159 } else { 3160 expect2(*fmt,item->value,CharsToUnicodeString(item->expectedResult)); 3161 } 3162 delete fmt; 3163 } 3164 3165 3166 // Test bogus keyword value 3167 ec = U_ZERO_ERROR; 3168 Locale loc4 = Locale::createFromName("en_US@numbers=foobar"); 3169 NumberFormat* fmt4= NumberFormat::createInstance(loc4, ec); 3170 if ( ec != U_UNSUPPORTED_ERROR ) { 3171 errln("FAIL: getInstance(en_US@numbers=foobar) should have returned U_UNSUPPORTED_ERROR"); 3172 delete fmt4; 3173 } 3174 3175 ec = U_ZERO_ERROR; 3176 NumberingSystem *ns = NumberingSystem::createInstance(ec); 3177 if (U_FAILURE(ec)) { 3178 dataerrln("FAIL: NumberingSystem::createInstance(ec); - %s", u_errorName(ec)); 3179 } 3180 3181 if ( ns != NULL ) { 3182 ns->getDynamicClassID(); 3183 ns->getStaticClassID(); 3184 } else { 3185 errln("FAIL: getInstance() returned NULL."); 3186 } 3187 3188 NumberingSystem *ns1 = new NumberingSystem(*ns); 3189 if (ns1 == NULL) { 3190 errln("FAIL: NumberSystem copy constructor returned NULL."); 3191 } 3192 3193 delete ns1; 3194 delete ns; 3195 3196 } 3197 3198 3199 void 3200 NumberFormatTest::TestMultiCurrencySign() { 3201 const char* DATA[][6] = { 3202 // the fields in the following test are: 3203 // locale, 3204 // currency pattern (with negative pattern), 3205 // currency number to be formatted, 3206 // currency format using currency symbol name, such as "$" for USD, 3207 // currency format using currency ISO name, such as "USD", 3208 // currency format using plural name, such as "US dollars". 3209 // for US locale 3210 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"}, 3211 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"}, 3212 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"}, 3213 // for CHINA locale 3214 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\uFFE51,234.56", "CNY1,234.56", "\\u4EBA\\u6C11\\u5E011,234.56"}, 3215 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\uFFE51,234.56)", "(CNY1,234.56)", "(\\u4EBA\\u6C11\\u5E011,234.56)"}, 3216 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\uFFE51.00", "CNY1.00", "\\u4EBA\\u6C11\\u5E011.00"} 3217 }; 3218 3219 const UChar doubleCurrencySign[] = {0xA4, 0xA4, 0}; 3220 UnicodeString doubleCurrencyStr(doubleCurrencySign); 3221 const UChar tripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; 3222 UnicodeString tripleCurrencyStr(tripleCurrencySign); 3223 3224 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { 3225 const char* locale = DATA[i][0]; 3226 UnicodeString pat = ctou(DATA[i][1]); 3227 double numberToBeFormat = atof(DATA[i][2]); 3228 UErrorCode status = U_ZERO_ERROR; 3229 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale(locale), status); 3230 if (U_FAILURE(status)) { 3231 delete sym; 3232 continue; 3233 } 3234 for (int j=1; j<=3; ++j) { 3235 // j represents the number of currency sign in the pattern. 3236 if (j == 2) { 3237 pat = pat.findAndReplace(ctou("\\u00A4"), doubleCurrencyStr); 3238 } else if (j == 3) { 3239 pat = pat.findAndReplace(ctou("\\u00A4\\u00A4"), tripleCurrencyStr); 3240 } 3241 3242 DecimalFormat* fmt = new DecimalFormat(pat, new DecimalFormatSymbols(*sym), status); 3243 if (U_FAILURE(status)) { 3244 errln("FAILED init DecimalFormat "); 3245 delete fmt; 3246 continue; 3247 } 3248 UnicodeString s; 3249 ((NumberFormat*) fmt)->format(numberToBeFormat, s); 3250 // DATA[i][3] is the currency format result using a 3251 // single currency sign. 3252 // DATA[i][4] is the currency format result using 3253 // double currency sign. 3254 // DATA[i][5] is the currency format result using 3255 // triple currency sign. 3256 // DATA[i][j+2] is the currency format result using 3257 // 'j' number of currency sign. 3258 UnicodeString currencyFormatResult = ctou(DATA[i][2+j]); 3259 if (s.compare(currencyFormatResult)) { 3260 errln("FAIL format: Expected " + currencyFormatResult + "; Got " + s); 3261 } 3262 // mix style parsing 3263 for (int k=3; k<=5; ++k) { 3264 // DATA[i][3] is the currency format result using a 3265 // single currency sign. 3266 // DATA[i][4] is the currency format result using 3267 // double currency sign. 3268 // DATA[i][5] is the currency format result using 3269 // triple currency sign. 3270 UnicodeString oneCurrencyFormat = ctou(DATA[i][k]); 3271 UErrorCode status = U_ZERO_ERROR; 3272 Formattable parseRes; 3273 fmt->parse(oneCurrencyFormat, parseRes, status); 3274 if (U_FAILURE(status) || 3275 (parseRes.getType() == Formattable::kDouble && 3276 parseRes.getDouble() != numberToBeFormat) || 3277 (parseRes.getType() == Formattable::kLong && 3278 parseRes.getLong() != numberToBeFormat)) { 3279 errln("FAILED parse " + oneCurrencyFormat + "; (i, j, k): " + 3280 i + ", " + j + ", " + k); 3281 } 3282 } 3283 delete fmt; 3284 } 3285 delete sym; 3286 } 3287 } 3288 3289 3290 void 3291 NumberFormatTest::TestCurrencyFormatForMixParsing() { 3292 UErrorCode status = U_ZERO_ERROR; 3293 MeasureFormat* curFmt = MeasureFormat::createCurrencyFormat(Locale("en_US"), status); 3294 if (U_FAILURE(status)) { 3295 delete curFmt; 3296 return; 3297 } 3298 const char* formats[] = { 3299 "$1,234.56", // string to be parsed 3300 "USD1,234.56", 3301 "US dollars1,234.56", 3302 "1,234.56 US dollars" 3303 }; 3304 const CurrencyAmount* curramt = NULL; 3305 for (uint32_t i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) { 3306 UnicodeString stringToBeParsed = ctou(formats[i]); 3307 logln(UnicodeString("stringToBeParsed: ") + stringToBeParsed); 3308 Formattable result; 3309 UErrorCode status = U_ZERO_ERROR; 3310 curFmt->parseObject(stringToBeParsed, result, status); 3311 if (U_FAILURE(status)) { 3312 errln("FAIL: measure format parsing: '%s' ec: %s", formats[i], u_errorName(status)); 3313 } else if (result.getType() != Formattable::kObject || 3314 (curramt = dynamic_cast<const CurrencyAmount*>(result.getObject())) == NULL || 3315 curramt->getNumber().getDouble() != 1234.56 || 3316 UnicodeString(curramt->getISOCurrency()).compare(ISO_CURRENCY_USD) 3317 ) { 3318 errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number "); 3319 if (curramt->getNumber().getDouble() != 1234.56) { 3320 errln((UnicodeString)"wong number, expect: 1234.56" + ", got: " + curramt->getNumber().getDouble()); 3321 } 3322 if (curramt->getISOCurrency() != ISO_CURRENCY_USD) { 3323 errln((UnicodeString)"wong currency, expect: USD" + ", got: " + curramt->getISOCurrency()); 3324 } 3325 } 3326 } 3327 delete curFmt; 3328 } 3329 3330 3331 void 3332 NumberFormatTest::TestDecimalFormatCurrencyParse() { 3333 // Locale.US 3334 UErrorCode status = U_ZERO_ERROR; 3335 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale("en_US"), status); 3336 if (U_FAILURE(status)) { 3337 delete sym; 3338 return; 3339 } 3340 UnicodeString pat; 3341 UChar currency = 0x00A4; 3342 // "\xA4#,##0.00;-\xA4#,##0.00" 3343 pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00"); 3344 DecimalFormat* fmt = new DecimalFormat(pat, sym, status); 3345 if (U_FAILURE(status)) { 3346 delete fmt; 3347 errln("failed to new DecimalFormat in TestDecimalFormatCurrencyParse"); 3348 return; 3349 } 3350 const char* DATA[][2] = { 3351 // the data are: 3352 // string to be parsed, the parsed result (number) 3353 {"$1.00", "1"}, 3354 {"USD1.00", "1"}, 3355 {"1.00 US dollar", "1"}, 3356 {"$1,234.56", "1234.56"}, 3357 {"USD1,234.56", "1234.56"}, 3358 {"1,234.56 US dollar", "1234.56"}, 3359 }; 3360 for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { 3361 UnicodeString stringToBeParsed = ctou(DATA[i][0]); 3362 double parsedResult = atof(DATA[i][1]); 3363 UErrorCode status = U_ZERO_ERROR; 3364 Formattable result; 3365 fmt->parse(stringToBeParsed, result, status); 3366 if (U_FAILURE(status) || 3367 (result.getType() == Formattable::kDouble && 3368 result.getDouble() != parsedResult) || 3369 (result.getType() == Formattable::kLong && 3370 result.getLong() != parsedResult)) { 3371 errln((UnicodeString)"FAIL parse: Expected " + parsedResult); 3372 } 3373 } 3374 delete fmt; 3375 } 3376 3377 3378 void 3379 NumberFormatTest::TestCurrencyIsoPluralFormat() { 3380 static const char* DATA[][6] = { 3381 // the data are: 3382 // locale, 3383 // currency amount to be formatted, 3384 // currency ISO code to be formatted, 3385 // format result using CURRENCYSTYLE, 3386 // format result using ISOCURRENCYSTYLE, 3387 // format result using PLURALCURRENCYSTYLE, 3388 3389 {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"}, 3390 {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"}, 3391 {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"}, 3392 {"zh_CN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00\\u7F8E\\u5143"}, 3393 {"zh_CN", "1234.56", "USD", "US$\\u00A01,234.56", "USD\\u00A01,234.56", "1,234.56\\u7F8E\\u5143"}, 3394 // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"}, 3395 // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"}, 3396 {"zh_CN", "1", "CNY", "\\uFFE5\\u00A01.00", "CNY\\u00A01.00", "1.00\\u4EBA\\u6C11\\u5E01"}, 3397 {"zh_CN", "1234.56", "CNY", "\\uFFE5\\u00A01,234.56", "CNY\\u00A01,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"}, 3398 {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"}, 3399 {"ru_RU", "2", "RUB", "2,00\\u00A0\\u0440\\u0443\\u0431.", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"}, 3400 {"ru_RU", "5", "RUB", "5,00\\u00A0\\u0440\\u0443\\u0431.", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"}, 3401 // test locale without currency information 3402 {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"}, 3403 // test choice format 3404 {"es_AR", "1", "INR", "INR1,00", "INR1,00", "1,00 rupia india"}, 3405 }; 3406 static const UNumberFormatStyle currencyStyles[] = { 3407 UNUM_CURRENCY, 3408 UNUM_CURRENCY_ISO, 3409 UNUM_CURRENCY_PLURAL 3410 }; 3411 3412 for (int32_t i=0; i<UPRV_LENGTHOF(DATA); ++i) { 3413 for (int32_t kIndex = 0; kIndex < UPRV_LENGTHOF(currencyStyles); ++kIndex) { 3414 UNumberFormatStyle k = currencyStyles[kIndex]; 3415 const char* localeString = DATA[i][0]; 3416 double numberToBeFormat = atof(DATA[i][1]); 3417 const char* currencyISOCode = DATA[i][2]; 3418 Locale locale(localeString); 3419 UErrorCode status = U_ZERO_ERROR; 3420 NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); 3421 if (U_FAILURE(status)) { 3422 delete numFmt; 3423 dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status)); 3424 continue; 3425 } 3426 UChar currencyCode[4]; 3427 u_charsToUChars(currencyISOCode, currencyCode, 4); 3428 numFmt->setCurrency(currencyCode, status); 3429 if (U_FAILURE(status)) { 3430 delete numFmt; 3431 errln((UnicodeString)"can not set currency:" + currencyISOCode); 3432 continue; 3433 } 3434 3435 UnicodeString strBuf; 3436 numFmt->format(numberToBeFormat, strBuf); 3437 int resultDataIndex = 3 + kIndex; 3438 // DATA[i][resultDataIndex] is the currency format result 3439 // using 'k' currency style. 3440 UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); 3441 if (strBuf.compare(formatResult)) { 3442 errln("FAIL: Expected " + formatResult + " actual: " + strBuf); 3443 } 3444 // test parsing, and test parsing for all currency formats. 3445 for (int j = 3; j < 6; ++j) { 3446 // DATA[i][3] is the currency format result using 3447 // CURRENCYSTYLE formatter. 3448 // DATA[i][4] is the currency format result using 3449 // ISOCURRENCYSTYLE formatter. 3450 // DATA[i][5] is the currency format result using 3451 // PLURALCURRENCYSTYLE formatter. 3452 UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); 3453 UErrorCode status = U_ZERO_ERROR; 3454 Formattable parseResult; 3455 numFmt->parse(oneCurrencyFormatResult, parseResult, status); 3456 if (U_FAILURE(status) || 3457 (parseResult.getType() == Formattable::kDouble && 3458 parseResult.getDouble() != numberToBeFormat) || 3459 (parseResult.getType() == Formattable::kLong && 3460 parseResult.getLong() != numberToBeFormat)) { 3461 errln((UnicodeString)"FAIL: getCurrencyFormat of locale " + 3462 localeString + " failed roundtripping the number"); 3463 if (parseResult.getType() == Formattable::kDouble) { 3464 errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getDouble()); 3465 } else { 3466 errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getLong()); 3467 } 3468 } 3469 } 3470 delete numFmt; 3471 } 3472 } 3473 } 3474 3475 void 3476 NumberFormatTest::TestCurrencyParsing() { 3477 static const char* DATA[][6] = { 3478 // the data are: 3479 // locale, 3480 // currency amount to be formatted, 3481 // currency ISO code to be formatted, 3482 // format result using CURRENCYSTYLE, 3483 // format result using ISOCURRENCYSTYLE, 3484 // format result using PLURALCURRENCYSTYLE, 3485 {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"}, 3486 {"pa_IN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00 \\u0a2f\\u0a42.\\u0a10\\u0a38. \\u0a21\\u0a3e\\u0a32\\u0a30"}, 3487 {"es_AR", "1", "USD", "US$1,00", "USD1,00", "1,00 d\\u00f3lar estadounidense"}, 3488 {"ar_EG", "1", "USD", "US$\\u00a0\\u0661\\u066b\\u0660\\u0660", "USD\\u00a0\\u0661\\u066b\\u0660\\u0660", "\\u0661\\u066b\\u0660\\u0660 \\u062f\\u0648\\u0644\\u0627\\u0631 \\u0623\\u0645\\u0631\\u064a\\u0643\\u064a"}, 3489 {"fa_CA", "1", "USD", "\\u200e$\\u06f1\\u066b\\u06f0\\u06f0", "\\u200eUSD\\u06f1\\u066b\\u06f0\\u06f0", "\\u200e\\u062f\\u0644\\u0627\\u0631 \\u0627\\u0645\\u0631\\u06cc\\u06a9\\u0627\\u06f1\\u066b\\u06f0\\u06f0"}, 3490 {"he_IL", "1", "USD", "1.00\\u00a0$", "1.00\\u00a0USD", "1.00 \\u05d3\\u05d5\\u05dc\\u05e8 \\u05d0\\u05de\\u05e8\\u05d9\\u05e7\\u05d0\\u05d9"}, 3491 {"hr_HR", "1", "USD", "1,00\\u00a0USD", "1,00\\u00a0USD", "1,00 Ameri\\u010dki dolar"}, 3492 {"id_ID", "1", "USD", "US$1,00", "USD1,00", "1,00 Dolar Amerika Serikat"}, 3493 {"it_IT", "1", "USD", "1,00\\u00a0US$", "1,00\\u00a0USD", "1,00 Dollaro Statunitense"}, 3494 {"ko_KR", "1", "USD", "US$1.00", "USD1.00", "1.00\\ubbf8\\uad6d \\ub2ec\\ub7ec"}, 3495 {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00\\u7c73\\u30c9\\u30eb"}, 3496 {"zh_CN", "1", "CNY", "\\uFFE5\\u00a01.00", "CNY\\u00a01.00", "1.00\\u4EBA\\u6C11\\u5E01"}, 3497 {"zh_TW", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"}, 3498 {"zh_Hant", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"}, 3499 {"zh_Hant", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00 \\u65e5\\u5713"}, 3500 {"ja_JP", "1", "JPY", "\\uFFE51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"}, 3501 {"ja_JP", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"}, 3502 {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u0439 \\u0440\\u0443\\u0431\\u043B\\u044C"} 3503 }; 3504 static const UNumberFormatStyle currencyStyles[] = { 3505 UNUM_CURRENCY, 3506 UNUM_CURRENCY_ISO, 3507 UNUM_CURRENCY_PLURAL 3508 }; 3509 static const char* currencyStyleNames[] = { 3510 "UNUM_CURRENCY", 3511 "UNUM_CURRENCY_ISO", 3512 "UNUM_CURRENCY_PLURAL" 3513 }; 3514 3515 #ifdef NUMFMTST_CACHE_DEBUG 3516 int deadloop = 0; 3517 for (;;) { 3518 printf("loop: %d\n", deadloop++); 3519 #endif 3520 for (uint32_t i=0; i< sizeof(DATA)/sizeof(DATA[0]); ++i) { /* i = test case # - should be i=0*/ 3521 for (int32_t kIndex = 2; kIndex < UPRV_LENGTHOF(currencyStyles); ++kIndex) { 3522 UNumberFormatStyle k = currencyStyles[kIndex]; /* k = style */ 3523 const char* localeString = DATA[i][0]; 3524 double numberToBeFormat = atof(DATA[i][1]); 3525 const char* currencyISOCode = DATA[i][2]; 3526 Locale locale(localeString); 3527 UErrorCode status = U_ZERO_ERROR; 3528 NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); 3529 logln("#%d NumberFormat(%s, %s) Currency=%s\n", 3530 i, localeString, currencyStyleNames[kIndex], 3531 currencyISOCode); 3532 3533 if (U_FAILURE(status)) { 3534 delete numFmt; 3535 dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status)); 3536 continue; 3537 } 3538 UChar currencyCode[4]; 3539 u_charsToUChars(currencyISOCode, currencyCode, 4); 3540 numFmt->setCurrency(currencyCode, status); 3541 if (U_FAILURE(status)) { 3542 delete numFmt; 3543 errln((UnicodeString)"can not set currency:" + currencyISOCode); 3544 continue; 3545 } 3546 3547 UnicodeString strBuf; 3548 numFmt->format(numberToBeFormat, strBuf); 3549 /* 3550 int resultDataIndex = 3 + kIndex; 3551 // DATA[i][resultDataIndex] is the currency format result 3552 // using 'k' currency style. 3553 UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); 3554 if (strBuf.compare(formatResult)) { 3555 errln("FAIL: Expected " + formatResult + " actual: " + strBuf); 3556 } 3557 */ 3558 // test parsing, and test parsing for all currency formats. 3559 for (int j = 3; j < 6; ++j) { 3560 // DATA[i][3] is the currency format result using 3561 // CURRENCYSTYLE formatter. 3562 // DATA[i][4] is the currency format result using 3563 // ISOCURRENCYSTYLE formatter. 3564 // DATA[i][5] is the currency format result using 3565 // PLURALCURRENCYSTYLE formatter. 3566 UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); 3567 UErrorCode status = U_ZERO_ERROR; 3568 Formattable parseResult; 3569 logln("parse(%s)", DATA[i][j]); 3570 numFmt->parse(oneCurrencyFormatResult, parseResult, status); 3571 if (U_FAILURE(status) || 3572 (parseResult.getType() == Formattable::kDouble && 3573 parseResult.getDouble() != numberToBeFormat) || 3574 (parseResult.getType() == Formattable::kLong && 3575 parseResult.getLong() != numberToBeFormat)) { 3576 errln((UnicodeString)"FAIL: NumberFormat(" + localeString +", " + currencyStyleNames[kIndex] + 3577 "), Currency="+currencyISOCode+", parse("+DATA[i][j]+") returned error " + (UnicodeString)u_errorName(status)+". Testcase: data[" + i + "][" + currencyStyleNames[j-3] +"="+j+"]"); 3578 if (parseResult.getType() == Formattable::kDouble) { 3579 errln((UnicodeString)"expected: " + numberToBeFormat + "; actual (double): " +parseResult.getDouble()); 3580 } else { 3581 errln((UnicodeString)"expected: " + numberToBeFormat + "; actual (long): " +parseResult.getLong()); 3582 } 3583 errln((UnicodeString)" round-trip would be: " + strBuf); 3584 } 3585 } 3586 delete numFmt; 3587 } 3588 } 3589 #ifdef NUMFMTST_CACHE_DEBUG 3590 } 3591 #endif 3592 } 3593 3594 3595 void 3596 NumberFormatTest::TestParseCurrencyInUCurr() { 3597 const char* DATA[] = { 3598 "1.00 US DOLLAR", // case in-sensitive 3599 "$1.00", 3600 "USD1.00", 3601 "US dollar1.00", 3602 "US dollars1.00", 3603 "$1.00", 3604 "A$1.00", 3605 "ADP1.00", 3606 "ADP1.00", 3607 "AED1.00", 3608 "AED1.00", 3609 "AFA1.00", 3610 "AFA1.00", 3611 "AFN1.00", 3612 "ALL1.00", 3613 "AMD1.00", 3614 "ANG1.00", 3615 "AOA1.00", 3616 "AOK1.00", 3617 "AOK1.00", 3618 "AON1.00", 3619 "AON1.00", 3620 "AOR1.00", 3621 "AOR1.00", 3622 "ARS1.00", 3623 "ARA1.00", 3624 "ARA1.00", 3625 "ARP1.00", 3626 "ARP1.00", 3627 "ARS1.00", 3628 "ATS1.00", 3629 "ATS1.00", 3630 "AUD1.00", 3631 "AWG1.00", 3632 "AZM1.00", 3633 "AZM1.00", 3634 "AZN1.00", 3635 "Afghan Afghani (1927\\u20132002)1.00", 3636 "Afghan afghani (1927\\u20132002)1.00", 3637 "Afghan Afghani1.00", 3638 "Afghan Afghanis1.00", 3639 "Albanian Lek1.00", 3640 "Albanian lek1.00", 3641 "Albanian lek\\u00eb1.00", 3642 "Algerian Dinar1.00", 3643 "Algerian dinar1.00", 3644 "Algerian dinars1.00", 3645 "Andorran Peseta1.00", 3646 "Andorran peseta1.00", 3647 "Andorran pesetas1.00", 3648 "Angolan Kwanza (1977\\u20131991)1.00", 3649 "Angolan Readjusted Kwanza (1995\\u20131999)1.00", 3650 "Angolan Kwanza1.00", 3651 "Angolan New Kwanza (1990\\u20132000)1.00", 3652 "Angolan kwanza (1977\\u20131991)1.00", 3653 "Angolan readjusted kwanza (1995\\u20131999)1.00", 3654 "Angolan kwanza1.00", 3655 "Angolan kwanzas (1977\\u20131991)1.00", 3656 "Angolan readjusted kwanzas (1995\\u20131999)1.00", 3657 "Angolan kwanzas1.00", 3658 "Angolan new kwanza (1990\\u20132000)1.00", 3659 "Angolan new kwanzas (1990\\u20132000)1.00", 3660 "Argentine Austral1.00", 3661 "Argentine Peso (1983\\u20131985)1.00", 3662 "Argentine Peso1.00", 3663 "Argentine austral1.00", 3664 "Argentine australs1.00", 3665 "Argentine peso (1983\\u20131985)1.00", 3666 "Argentine peso1.00", 3667 "Argentine pesos (1983\\u20131985)1.00", 3668 "Argentine pesos1.00", 3669 "Armenian Dram1.00", 3670 "Armenian dram1.00", 3671 "Armenian drams1.00", 3672 "Aruban Florin1.00", 3673 "Aruban florin1.00", 3674 "Australian Dollar1.00", 3675 "Australian dollar1.00", 3676 "Australian dollars1.00", 3677 "Austrian Schilling1.00", 3678 "Austrian schilling1.00", 3679 "Austrian schillings1.00", 3680 "Azerbaijani Manat (1993\\u20132006)1.00", 3681 "Azerbaijani Manat1.00", 3682 "Azerbaijani manat (1993\\u20132006)1.00", 3683 "Azerbaijani manat1.00", 3684 "Azerbaijani manats (1993\\u20132006)1.00", 3685 "Azerbaijani manats1.00", 3686 "BAD1.00", 3687 "BAD1.00", 3688 "BAM1.00", 3689 "BBD1.00", 3690 "BDT1.00", 3691 "BEC1.00", 3692 "BEC1.00", 3693 "BEF1.00", 3694 "BEL1.00", 3695 "BEL1.00", 3696 "BGL1.00", 3697 "BGN1.00", 3698 "BGN1.00", 3699 "BHD1.00", 3700 "BIF1.00", 3701 "BMD1.00", 3702 "BND1.00", 3703 "BOB1.00", 3704 "BOP1.00", 3705 "BOP1.00", 3706 "BOV1.00", 3707 "BOV1.00", 3708 "BRB1.00", 3709 "BRB1.00", 3710 "BRC1.00", 3711 "BRC1.00", 3712 "BRE1.00", 3713 "BRE1.00", 3714 "BRL1.00", 3715 "BRN1.00", 3716 "BRN1.00", 3717 "BRR1.00", 3718 "BRR1.00", 3719 "BSD1.00", 3720 "BSD1.00", 3721 "BTN1.00", 3722 "BUK1.00", 3723 "BUK1.00", 3724 "BWP1.00", 3725 "BYB1.00", 3726 "BYB1.00", 3727 "BYR1.00", 3728 "BZD1.00", 3729 "Bahamian Dollar1.00", 3730 "Bahamian dollar1.00", 3731 "Bahamian dollars1.00", 3732 "Bahraini Dinar1.00", 3733 "Bahraini dinar1.00", 3734 "Bahraini dinars1.00", 3735 "Bangladeshi Taka1.00", 3736 "Bangladeshi taka1.00", 3737 "Bangladeshi takas1.00", 3738 "Barbadian Dollar1.00", 3739 "Barbadian dollar1.00", 3740 "Barbadian dollars1.00", 3741 "Belarusian New Ruble (1994\\u20131999)1.00", 3742 "Belarusian Ruble1.00", 3743 "Belarusian new ruble (1994\\u20131999)1.00", 3744 "Belarusian new rubles (1994\\u20131999)1.00", 3745 "Belarusian ruble1.00", 3746 "Belarusian rubles1.00", 3747 "Belgian Franc (convertible)1.00", 3748 "Belgian Franc (financial)1.00", 3749 "Belgian Franc1.00", 3750 "Belgian franc (convertible)1.00", 3751 "Belgian franc (financial)1.00", 3752 "Belgian franc1.00", 3753 "Belgian francs (convertible)1.00", 3754 "Belgian francs (financial)1.00", 3755 "Belgian francs1.00", 3756 "Belize Dollar1.00", 3757 "Belize dollar1.00", 3758 "Belize dollars1.00", 3759 "Bermudan Dollar1.00", 3760 "Bermudan dollar1.00", 3761 "Bermudan dollars1.00", 3762 "Bhutanese Ngultrum1.00", 3763 "Bhutanese ngultrum1.00", 3764 "Bhutanese ngultrums1.00", 3765 "Bolivian Mvdol1.00", 3766 "Bolivian Peso1.00", 3767 "Bolivian mvdol1.00", 3768 "Bolivian mvdols1.00", 3769 "Bolivian peso1.00", 3770 "Bolivian pesos1.00", 3771 "Bolivian Boliviano1.00", 3772 "Bolivian Boliviano1.00", 3773 "Bolivian Bolivianos1.00", 3774 "Bosnia-Herzegovina Convertible Mark1.00", 3775 "Bosnia-Herzegovina Dinar (1992\\u20131994)1.00", 3776 "Bosnia-Herzegovina convertible mark1.00", 3777 "Bosnia-Herzegovina convertible marks1.00", 3778 "Bosnia-Herzegovina dinar (1992\\u20131994)1.00", 3779 "Bosnia-Herzegovina dinars (1992\\u20131994)1.00", 3780 "Botswanan Pula1.00", 3781 "Botswanan pula1.00", 3782 "Botswanan pulas1.00", 3783 "Brazilian New Cruzado (1989\\u20131990)1.00", 3784 "Brazilian Cruzado (1986\\u20131989)1.00", 3785 "Brazilian Cruzeiro (1990\\u20131993)1.00", 3786 "Brazilian New Cruzeiro (1967\\u20131986)1.00", 3787 "Brazilian Cruzeiro (1993\\u20131994)1.00", 3788 "Brazilian Real1.00", 3789 "Brazilian new cruzado (1989\\u20131990)1.00", 3790 "Brazilian new cruzados (1989\\u20131990)1.00", 3791 "Brazilian cruzado (1986\\u20131989)1.00", 3792 "Brazilian cruzados (1986\\u20131989)1.00", 3793 "Brazilian cruzeiro (1990\\u20131993)1.00", 3794 "Brazilian new cruzeiro (1967\\u20131986)1.00", 3795 "Brazilian cruzeiro (1993\\u20131994)1.00", 3796 "Brazilian cruzeiros (1990\\u20131993)1.00", 3797 "Brazilian new cruzeiros (1967\\u20131986)1.00", 3798 "Brazilian cruzeiros (1993\\u20131994)1.00", 3799 "Brazilian real1.00", 3800 "Brazilian reals1.00", 3801 "British Pound1.00", 3802 "British pound1.00", 3803 "British pounds1.00", 3804 "Brunei Dollar1.00", 3805 "Brunei dollar1.00", 3806 "Brunei dollars1.00", 3807 "Bulgarian Hard Lev1.00", 3808 "Bulgarian Lev1.00", 3809 "Bulgarian Leva1.00", 3810 "Bulgarian hard lev1.00", 3811 "Bulgarian hard leva1.00", 3812 "Bulgarian lev1.00", 3813 "Burmese Kyat1.00", 3814 "Burmese kyat1.00", 3815 "Burmese kyats1.00", 3816 "Burundian Franc1.00", 3817 "Burundian franc1.00", 3818 "Burundian francs1.00", 3819 "CA$1.00", 3820 "CAD1.00", 3821 "CDF1.00", 3822 "CDF1.00", 3823 "West African CFA Franc1.00", 3824 "Central African CFA Franc1.00", 3825 "West African CFA franc1.00", 3826 "Central African CFA franc1.00", 3827 "West African CFA francs1.00", 3828 "Central African CFA francs1.00", 3829 "CFP Franc1.00", 3830 "CFP franc1.00", 3831 "CFP francs1.00", 3832 "CFPF1.00", 3833 "CHE1.00", 3834 "CHE1.00", 3835 "CHF1.00", 3836 "CHW1.00", 3837 "CHW1.00", 3838 "CLF1.00", 3839 "CLF1.00", 3840 "CLP1.00", 3841 "CNY1.00", 3842 "COP1.00", 3843 "COU1.00", 3844 "COU1.00", 3845 "CRC1.00", 3846 "CSD1.00", 3847 "CSD1.00", 3848 "CSK1.00", 3849 "CSK1.00", 3850 "CUP1.00", 3851 "CUP1.00", 3852 "CVE1.00", 3853 "CYP1.00", 3854 "CZK1.00", 3855 "Cambodian Riel1.00", 3856 "Cambodian riel1.00", 3857 "Cambodian riels1.00", 3858 "Canadian Dollar1.00", 3859 "Canadian dollar1.00", 3860 "Canadian dollars1.00", 3861 "Cape Verdean Escudo1.00", 3862 "Cape Verdean escudo1.00", 3863 "Cape Verdean escudos1.00", 3864 "Cayman Islands Dollar1.00", 3865 "Cayman Islands dollar1.00", 3866 "Cayman Islands dollars1.00", 3867 "Chilean Peso1.00", 3868 "Chilean Unit of Account (UF)1.00", 3869 "Chilean peso1.00", 3870 "Chilean pesos1.00", 3871 "Chilean unit of account (UF)1.00", 3872 "Chilean units of account (UF)1.00", 3873 "Chinese Yuan1.00", 3874 "Chinese yuan1.00", 3875 "Colombian Peso1.00", 3876 "Colombian peso1.00", 3877 "Colombian pesos1.00", 3878 "Comorian Franc1.00", 3879 "Comorian franc1.00", 3880 "Comorian francs1.00", 3881 "Congolese Franc1.00", 3882 "Congolese franc1.00", 3883 "Congolese francs1.00", 3884 "Costa Rican Col\\u00f3n1.00", 3885 "Costa Rican col\\u00f3n1.00", 3886 "Costa Rican col\\u00f3ns1.00", 3887 "Croatian Dinar1.00", 3888 "Croatian Kuna1.00", 3889 "Croatian dinar1.00", 3890 "Croatian dinars1.00", 3891 "Croatian kuna1.00", 3892 "Croatian kunas1.00", 3893 "Cuban Peso1.00", 3894 "Cuban peso1.00", 3895 "Cuban pesos1.00", 3896 "Cypriot Pound1.00", 3897 "Cypriot pound1.00", 3898 "Cypriot pounds1.00", 3899 "Czech Republic Koruna1.00", 3900 "Czech Republic koruna1.00", 3901 "Czech Republic korunas1.00", 3902 "Czechoslovak Hard Koruna1.00", 3903 "Czechoslovak hard koruna1.00", 3904 "Czechoslovak hard korunas1.00", 3905 "DDM1.00", 3906 "DDM1.00", 3907 "DEM1.00", 3908 "DEM1.00", 3909 "DJF1.00", 3910 "DKK1.00", 3911 "DOP1.00", 3912 "DZD1.00", 3913 "Danish Krone1.00", 3914 "Danish krone1.00", 3915 "Danish kroner1.00", 3916 "German Mark1.00", 3917 "German mark1.00", 3918 "German marks1.00", 3919 "Djiboutian Franc1.00", 3920 "Djiboutian franc1.00", 3921 "Djiboutian francs1.00", 3922 "Dominican Peso1.00", 3923 "Dominican peso1.00", 3924 "Dominican pesos1.00", 3925 "EC$1.00", 3926 "ECS1.00", 3927 "ECS1.00", 3928 "ECV1.00", 3929 "ECV1.00", 3930 "EEK1.00", 3931 "EEK1.00", 3932 "EGP1.00", 3933 "EGP1.00", 3934 "ERN1.00", 3935 "ERN1.00", 3936 "ESA1.00", 3937 "ESA1.00", 3938 "ESB1.00", 3939 "ESB1.00", 3940 "ESP1.00", 3941 "ETB1.00", 3942 "EUR1.00", 3943 "East Caribbean Dollar1.00", 3944 "East Caribbean dollar1.00", 3945 "East Caribbean dollars1.00", 3946 "East German Mark1.00", 3947 "East German mark1.00", 3948 "East German marks1.00", 3949 "Ecuadorian Sucre1.00", 3950 "Ecuadorian Unit of Constant Value1.00", 3951 "Ecuadorian sucre1.00", 3952 "Ecuadorian sucres1.00", 3953 "Ecuadorian unit of constant value1.00", 3954 "Ecuadorian units of constant value1.00", 3955 "Egyptian Pound1.00", 3956 "Egyptian pound1.00", 3957 "Egyptian pounds1.00", 3958 "Salvadoran Col\\u00f3n1.00", 3959 "Salvadoran col\\u00f3n1.00", 3960 "Salvadoran colones1.00", 3961 "Equatorial Guinean Ekwele1.00", 3962 "Equatorial Guinean ekwele1.00", 3963 "Eritrean Nakfa1.00", 3964 "Eritrean nakfa1.00", 3965 "Eritrean nakfas1.00", 3966 "Estonian Kroon1.00", 3967 "Estonian kroon1.00", 3968 "Estonian kroons1.00", 3969 "Ethiopian Birr1.00", 3970 "Ethiopian birr1.00", 3971 "Ethiopian birrs1.00", 3972 "Euro1.00", 3973 "European Composite Unit1.00", 3974 "European Currency Unit1.00", 3975 "European Monetary Unit1.00", 3976 "European Unit of Account (XBC)1.00", 3977 "European Unit of Account (XBD)1.00", 3978 "European composite unit1.00", 3979 "European composite units1.00", 3980 "European currency unit1.00", 3981 "European currency units1.00", 3982 "European monetary unit1.00", 3983 "European monetary units1.00", 3984 "European unit of account (XBC)1.00", 3985 "European unit of account (XBD)1.00", 3986 "European units of account (XBC)1.00", 3987 "European units of account (XBD)1.00", 3988 "FIM1.00", 3989 "FIM1.00", 3990 "FJD1.00", 3991 "FKP1.00", 3992 "FKP1.00", 3993 "FRF1.00", 3994 "FRF1.00", 3995 "Falkland Islands Pound1.00", 3996 "Falkland Islands pound1.00", 3997 "Falkland Islands pounds1.00", 3998 "Fijian Dollar1.00", 3999 "Fijian dollar1.00", 4000 "Fijian dollars1.00", 4001 "Finnish Markka1.00", 4002 "Finnish markka1.00", 4003 "Finnish markkas1.00", 4004 "CHF1.00", 4005 "French Franc1.00", 4006 "French Gold Franc1.00", 4007 "French UIC-Franc1.00", 4008 "French UIC-franc1.00", 4009 "French UIC-francs1.00", 4010 "French franc1.00", 4011 "French francs1.00", 4012 "French gold franc1.00", 4013 "French gold francs1.00", 4014 "GBP1.00", 4015 "GEK1.00", 4016 "GEK1.00", 4017 "GEL1.00", 4018 "GHC1.00", 4019 "GHC1.00", 4020 "GHS1.00", 4021 "GIP1.00", 4022 "GIP1.00", 4023 "GMD1.00", 4024 "GMD1.00", 4025 "GNF1.00", 4026 "GNS1.00", 4027 "GNS1.00", 4028 "GQE1.00", 4029 "GQE1.00", 4030 "GRD1.00", 4031 "GRD1.00", 4032 "GTQ1.00", 4033 "GWE1.00", 4034 "GWE1.00", 4035 "GWP1.00", 4036 "GWP1.00", 4037 "GYD1.00", 4038 "Gambian Dalasi1.00", 4039 "Gambian dalasi1.00", 4040 "Gambian dalasis1.00", 4041 "Georgian Kupon Larit1.00", 4042 "Georgian Lari1.00", 4043 "Georgian kupon larit1.00", 4044 "Georgian kupon larits1.00", 4045 "Georgian lari1.00", 4046 "Georgian laris1.00", 4047 "Ghanaian Cedi (1979\\u20132007)1.00", 4048 "Ghanaian Cedi1.00", 4049 "Ghanaian cedi (1979\\u20132007)1.00", 4050 "Ghanaian cedi1.00", 4051 "Ghanaian cedis (1979\\u20132007)1.00", 4052 "Ghanaian cedis1.00", 4053 "Gibraltar Pound1.00", 4054 "Gibraltar pound1.00", 4055 "Gibraltar pounds1.00", 4056 "Gold1.00", 4057 "Gold1.00", 4058 "Greek Drachma1.00", 4059 "Greek drachma1.00", 4060 "Greek drachmas1.00", 4061 "Guatemalan Quetzal1.00", 4062 "Guatemalan quetzal1.00", 4063 "Guatemalan quetzals1.00", 4064 "Guinean Franc1.00", 4065 "Guinean Syli1.00", 4066 "Guinean franc1.00", 4067 "Guinean francs1.00", 4068 "Guinean syli1.00", 4069 "Guinean sylis1.00", 4070 "Guinea-Bissau Peso1.00", 4071 "Guinea-Bissau peso1.00", 4072 "Guinea-Bissau pesos1.00", 4073 "Guyanaese Dollar1.00", 4074 "Guyanaese dollar1.00", 4075 "Guyanaese dollars1.00", 4076 "HK$1.00", 4077 "HKD1.00", 4078 "HNL1.00", 4079 "HRD1.00", 4080 "HRD1.00", 4081 "HRK1.00", 4082 "HRK1.00", 4083 "HTG1.00", 4084 "HTG1.00", 4085 "HUF1.00", 4086 "Haitian Gourde1.00", 4087 "Haitian gourde1.00", 4088 "Haitian gourdes1.00", 4089 "Honduran Lempira1.00", 4090 "Honduran lempira1.00", 4091 "Honduran lempiras1.00", 4092 "Hong Kong Dollar1.00", 4093 "Hong Kong dollar1.00", 4094 "Hong Kong dollars1.00", 4095 "Hungarian Forint1.00", 4096 "Hungarian forint1.00", 4097 "Hungarian forints1.00", 4098 "IDR1.00", 4099 "IEP1.00", 4100 "ILP1.00", 4101 "ILP1.00", 4102 "ILS1.00", 4103 "INR1.00", 4104 "IQD1.00", 4105 "IRR1.00", 4106 "ISK1.00", 4107 "ISK1.00", 4108 "ITL1.00", 4109 "Icelandic Kr\\u00f3na1.00", 4110 "Icelandic kr\\u00f3na1.00", 4111 "Icelandic kr\\u00f3nur1.00", 4112 "Indian Rupee1.00", 4113 "Indian rupee1.00", 4114 "Indian rupees1.00", 4115 "Indonesian Rupiah1.00", 4116 "Indonesian rupiah1.00", 4117 "Indonesian rupiahs1.00", 4118 "Iranian Rial1.00", 4119 "Iranian rial1.00", 4120 "Iranian rials1.00", 4121 "Iraqi Dinar1.00", 4122 "Iraqi dinar1.00", 4123 "Iraqi dinars1.00", 4124 "Irish Pound1.00", 4125 "Irish pound1.00", 4126 "Irish pounds1.00", 4127 "Israeli Pound1.00", 4128 "Israeli new sheqel1.00", 4129 "Israeli pound1.00", 4130 "Israeli pounds1.00", 4131 "Italian Lira1.00", 4132 "Italian lira1.00", 4133 "Italian liras1.00", 4134 "JMD1.00", 4135 "JOD1.00", 4136 "JPY1.00", 4137 "Jamaican Dollar1.00", 4138 "Jamaican dollar1.00", 4139 "Jamaican dollars1.00", 4140 "Japanese Yen1.00", 4141 "Japanese yen1.00", 4142 "Jordanian Dinar1.00", 4143 "Jordanian dinar1.00", 4144 "Jordanian dinars1.00", 4145 "KES1.00", 4146 "KGS1.00", 4147 "KHR1.00", 4148 "KMF1.00", 4149 "KPW1.00", 4150 "KPW1.00", 4151 "KRW1.00", 4152 "KWD1.00", 4153 "KYD1.00", 4154 "KYD1.00", 4155 "KZT1.00", 4156 "Kazakhstani Tenge1.00", 4157 "Kazakhstani tenge1.00", 4158 "Kazakhstani tenges1.00", 4159 "Kenyan Shilling1.00", 4160 "Kenyan shilling1.00", 4161 "Kenyan shillings1.00", 4162 "Kuwaiti Dinar1.00", 4163 "Kuwaiti dinar1.00", 4164 "Kuwaiti dinars1.00", 4165 "Kyrgystani Som1.00", 4166 "Kyrgystani som1.00", 4167 "Kyrgystani soms1.00", 4168 "HNL1.00", 4169 "LAK1.00", 4170 "LAK1.00", 4171 "LBP1.00", 4172 "LKR1.00", 4173 "LRD1.00", 4174 "LRD1.00", 4175 "LSL1.00", 4176 "LTL1.00", 4177 "LTL1.00", 4178 "LTT1.00", 4179 "LTT1.00", 4180 "LUC1.00", 4181 "LUC1.00", 4182 "LUF1.00", 4183 "LUF1.00", 4184 "LUL1.00", 4185 "LUL1.00", 4186 "LVL1.00", 4187 "LVL1.00", 4188 "LVR1.00", 4189 "LVR1.00", 4190 "LYD1.00", 4191 "Laotian Kip1.00", 4192 "Laotian kip1.00", 4193 "Laotian kips1.00", 4194 "Latvian Lats1.00", 4195 "Latvian Ruble1.00", 4196 "Latvian lats1.00", 4197 "Latvian lati1.00", 4198 "Latvian ruble1.00", 4199 "Latvian rubles1.00", 4200 "Lebanese Pound1.00", 4201 "Lebanese pound1.00", 4202 "Lebanese pounds1.00", 4203 "Lesotho Loti1.00", 4204 "Lesotho loti1.00", 4205 "Lesotho lotis1.00", 4206 "Liberian Dollar1.00", 4207 "Liberian dollar1.00", 4208 "Liberian dollars1.00", 4209 "Libyan Dinar1.00", 4210 "Libyan dinar1.00", 4211 "Libyan dinars1.00", 4212 "Lithuanian Litas1.00", 4213 "Lithuanian Talonas1.00", 4214 "Lithuanian litas1.00", 4215 "Lithuanian litai1.00", 4216 "Lithuanian talonas1.00", 4217 "Lithuanian talonases1.00", 4218 "Luxembourgian Convertible Franc1.00", 4219 "Luxembourg Financial Franc1.00", 4220 "Luxembourgian Franc1.00", 4221 "Luxembourgian convertible franc1.00", 4222 "Luxembourgian convertible francs1.00", 4223 "Luxembourg financial franc1.00", 4224 "Luxembourg financial francs1.00", 4225 "Luxembourgian franc1.00", 4226 "Luxembourgian francs1.00", 4227 "MAD1.00", 4228 "MAD1.00", 4229 "MAF1.00", 4230 "MAF1.00", 4231 "MDL1.00", 4232 "MDL1.00", 4233 "MX$1.00", 4234 "MGA1.00", 4235 "MGA1.00", 4236 "MGF1.00", 4237 "MGF1.00", 4238 "MKD1.00", 4239 "MLF1.00", 4240 "MLF1.00", 4241 "MMK1.00", 4242 "MMK1.00", 4243 "MNT1.00", 4244 "MOP1.00", 4245 "MOP1.00", 4246 "MRO1.00", 4247 "MTL1.00", 4248 "MTP1.00", 4249 "MTP1.00", 4250 "MUR1.00", 4251 "MUR1.00", 4252 "MVR1.00", 4253 "MVR1.00", 4254 "MWK1.00", 4255 "MXN1.00", 4256 "MXP1.00", 4257 "MXP1.00", 4258 "MXV1.00", 4259 "MXV1.00", 4260 "MYR1.00", 4261 "MZE1.00", 4262 "MZE1.00", 4263 "MZM1.00", 4264 "MZN1.00", 4265 "Macanese Pataca1.00", 4266 "Macanese pataca1.00", 4267 "Macanese patacas1.00", 4268 "Macedonian Denar1.00", 4269 "Macedonian denar1.00", 4270 "Macedonian denari1.00", 4271 "Malagasy Ariaries1.00", 4272 "Malagasy Ariary1.00", 4273 "Malagasy Ariary1.00", 4274 "Malagasy Franc1.00", 4275 "Malagasy franc1.00", 4276 "Malagasy francs1.00", 4277 "Malawian Kwacha1.00", 4278 "Malawian Kwacha1.00", 4279 "Malawian Kwachas1.00", 4280 "Malaysian Ringgit1.00", 4281 "Malaysian ringgit1.00", 4282 "Malaysian ringgits1.00", 4283 "Maldivian Rufiyaa1.00", 4284 "Maldivian rufiyaa1.00", 4285 "Maldivian rufiyaas1.00", 4286 "Malian Franc1.00", 4287 "Malian franc1.00", 4288 "Malian francs1.00", 4289 "Maltese Lira1.00", 4290 "Maltese Pound1.00", 4291 "Maltese lira1.00", 4292 "Maltese lira1.00", 4293 "Maltese pound1.00", 4294 "Maltese pounds1.00", 4295 "Mauritanian Ouguiya1.00", 4296 "Mauritanian ouguiya1.00", 4297 "Mauritanian ouguiyas1.00", 4298 "Mauritian Rupee1.00", 4299 "Mauritian rupee1.00", 4300 "Mauritian rupees1.00", 4301 "Mexican Peso1.00", 4302 "Mexican Silver Peso (1861\\u20131992)1.00", 4303 "Mexican Investment Unit1.00", 4304 "Mexican peso1.00", 4305 "Mexican pesos1.00", 4306 "Mexican silver peso (1861\\u20131992)1.00", 4307 "Mexican silver pesos (1861\\u20131992)1.00", 4308 "Mexican investment unit1.00", 4309 "Mexican investment units1.00", 4310 "Moldovan Leu1.00", 4311 "Moldovan leu1.00", 4312 "Moldovan lei1.00", 4313 "Mongolian Tugrik1.00", 4314 "Mongolian tugrik1.00", 4315 "Mongolian tugriks1.00", 4316 "Moroccan Dirham1.00", 4317 "Moroccan Franc1.00", 4318 "Moroccan dirham1.00", 4319 "Moroccan dirhams1.00", 4320 "Moroccan franc1.00", 4321 "Moroccan francs1.00", 4322 "Mozambican Escudo1.00", 4323 "Mozambican Metical1.00", 4324 "Mozambican escudo1.00", 4325 "Mozambican escudos1.00", 4326 "Mozambican metical1.00", 4327 "Mozambican meticals1.00", 4328 "Myanmar Kyat1.00", 4329 "Myanmar kyat1.00", 4330 "Myanmar kyats1.00", 4331 "NAD1.00", 4332 "NGN1.00", 4333 "NIC1.00", 4334 "NIO1.00", 4335 "NIO1.00", 4336 "NLG1.00", 4337 "NLG1.00", 4338 "NOK1.00", 4339 "NPR1.00", 4340 "NT$1.00", 4341 "NZ$1.00", 4342 "NZD1.00", 4343 "Namibian Dollar1.00", 4344 "Namibian dollar1.00", 4345 "Namibian dollars1.00", 4346 "Nepalese Rupee1.00", 4347 "Nepalese rupee1.00", 4348 "Nepalese rupees1.00", 4349 "Netherlands Antillean Guilder1.00", 4350 "Netherlands Antillean guilder1.00", 4351 "Netherlands Antillean guilders1.00", 4352 "Dutch Guilder1.00", 4353 "Dutch guilder1.00", 4354 "Dutch guilders1.00", 4355 "Israeli New Sheqel1.00", 4356 "Israeli New Sheqels1.00", 4357 "New Zealand Dollar1.00", 4358 "New Zealand dollar1.00", 4359 "New Zealand dollars1.00", 4360 "Nicaraguan C\\u00f3rdoba1.00", 4361 "Nicaraguan C\\u00f3rdoba (1988\\u20131991)1.00", 4362 "Nicaraguan c\\u00f3rdoba1.00", 4363 "Nicaraguan c\\u00f3rdobas1.00", 4364 "Nicaraguan c\\u00f3rdoba (1988\\u20131991)1.00", 4365 "Nicaraguan c\\u00f3rdobas (1988\\u20131991)1.00", 4366 "Nigerian Naira1.00", 4367 "Nigerian naira1.00", 4368 "Nigerian nairas1.00", 4369 "North Korean Won1.00", 4370 "North Korean won1.00", 4371 "North Korean won1.00", 4372 "Norwegian Krone1.00", 4373 "Norwegian krone1.00", 4374 "Norwegian kroner1.00", 4375 "OMR1.00", 4376 "Mozambican Metical (1980\\u20132006)1.00", 4377 "Mozambican metical (1980\\u20132006)1.00", 4378 "Mozambican meticals (1980\\u20132006)1.00", 4379 "Romanian Lei (1952\\u20132006)1.00", 4380 "Romanian Leu (1952\\u20132006)1.00", 4381 "Romanian leu (1952\\u20132006)1.00", 4382 "Serbian Dinar (2002\\u20132006)1.00", 4383 "Serbian dinar (2002\\u20132006)1.00", 4384 "Serbian dinars (2002\\u20132006)1.00", 4385 "Sudanese Dinar (1992\\u20132007)1.00", 4386 "Sudanese Pound (1957\\u20131998)1.00", 4387 "Sudanese dinar (1992\\u20132007)1.00", 4388 "Sudanese dinars (1992\\u20132007)1.00", 4389 "Sudanese pound (1957\\u20131998)1.00", 4390 "Sudanese pounds (1957\\u20131998)1.00", 4391 "Turkish Lira (1922\\u20132005)1.00", 4392 "Turkish Lira (1922\\u20132005)1.00", 4393 "Omani Rial1.00", 4394 "Omani rial1.00", 4395 "Omani rials1.00", 4396 "PAB1.00", 4397 "PAB1.00", 4398 "PEI1.00", 4399 "PEI1.00", 4400 "PEN1.00", 4401 "PEN1.00", 4402 "PES1.00", 4403 "PES1.00", 4404 "PGK1.00", 4405 "PGK1.00", 4406 "PHP1.00", 4407 "PKR1.00", 4408 "PLN1.00", 4409 "PLZ1.00", 4410 "PLZ1.00", 4411 "PTE1.00", 4412 "PTE1.00", 4413 "PYG1.00", 4414 "Pakistani Rupee1.00", 4415 "Pakistani rupee1.00", 4416 "Pakistani rupees1.00", 4417 "Palladium1.00", 4418 "Palladium1.00", 4419 "Panamanian Balboa1.00", 4420 "Panamanian balboa1.00", 4421 "Panamanian balboas1.00", 4422 "Papua New Guinean Kina1.00", 4423 "Papua New Guinean kina1.00", 4424 "Papua New Guinean kina1.00", 4425 "Paraguayan Guarani1.00", 4426 "Paraguayan guarani1.00", 4427 "Paraguayan guaranis1.00", 4428 "Peruvian Inti1.00", 4429 "Peruvian Nuevo Sol1.00", 4430 "Peruvian Sol (1863\\u20131965)1.00", 4431 "Peruvian inti1.00", 4432 "Peruvian intis1.00", 4433 "Peruvian nuevo sol1.00", 4434 "Peruvian nuevos soles1.00", 4435 "Peruvian sol (1863\\u20131965)1.00", 4436 "Peruvian soles (1863\\u20131965)1.00", 4437 "Philippine Peso1.00", 4438 "Philippine peso1.00", 4439 "Philippine pesos1.00", 4440 "Platinum1.00", 4441 "Platinum1.00", 4442 "Polish Zloty (1950\\u20131995)1.00", 4443 "Polish Zloty1.00", 4444 "Polish zlotys1.00", 4445 "Polish zloty (PLZ)1.00", 4446 "Polish zloty1.00", 4447 "Polish zlotys (PLZ)1.00", 4448 "Portuguese Escudo1.00", 4449 "Portuguese Guinea Escudo1.00", 4450 "Portuguese Guinea escudo1.00", 4451 "Portuguese Guinea escudos1.00", 4452 "Portuguese escudo1.00", 4453 "Portuguese escudos1.00", 4454 "GTQ1.00", 4455 "QAR1.00", 4456 "Qatari Rial1.00", 4457 "Qatari rial1.00", 4458 "Qatari rials1.00", 4459 "RHD1.00", 4460 "RHD1.00", 4461 "RINET Funds1.00", 4462 "RINET Funds1.00", 4463 "CN\\u00a51.00", 4464 "ROL1.00", 4465 "ROL1.00", 4466 "RON1.00", 4467 "RON1.00", 4468 "RSD1.00", 4469 "RSD1.00", 4470 "RUB1.00", 4471 "RUB1.00", 4472 "RUR1.00", 4473 "RUR1.00", 4474 "RWF1.00", 4475 "RWF1.00", 4476 "Rhodesian Dollar1.00", 4477 "Rhodesian dollar1.00", 4478 "Rhodesian dollars1.00", 4479 "Romanian Leu1.00", 4480 "Romanian lei1.00", 4481 "Romanian leu1.00", 4482 "Russian Ruble (1991\\u20131998)1.00", 4483 "Russian Ruble1.00", 4484 "Russian ruble (1991\\u20131998)1.00", 4485 "Russian ruble1.00", 4486 "Russian rubles (1991\\u20131998)1.00", 4487 "Russian rubles1.00", 4488 "Rwandan Franc1.00", 4489 "Rwandan franc1.00", 4490 "Rwandan francs1.00", 4491 "SAR1.00", 4492 "SBD1.00", 4493 "SCR1.00", 4494 "SDD1.00", 4495 "SDD1.00", 4496 "SDG1.00", 4497 "SDG1.00", 4498 "SDP1.00", 4499 "SDP1.00", 4500 "SEK1.00", 4501 "SGD1.00", 4502 "SHP1.00", 4503 "SHP1.00", 4504 "SIT1.00", 4505 "SIT1.00", 4506 "SKK1.00", 4507 "SLL1.00", 4508 "SLL1.00", 4509 "SOS1.00", 4510 "SRD1.00", 4511 "SRD1.00", 4512 "SRG1.00", 4513 "STD1.00", 4514 "SUR1.00", 4515 "SUR1.00", 4516 "SVC1.00", 4517 "SVC1.00", 4518 "SYP1.00", 4519 "SZL1.00", 4520 "St. Helena Pound1.00", 4521 "St. Helena pound1.00", 4522 "St. Helena pounds1.00", 4523 "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobra1.00", 4524 "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobra1.00", 4525 "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobras1.00", 4526 "Saudi Riyal1.00", 4527 "Saudi riyal1.00", 4528 "Saudi riyals1.00", 4529 "Serbian Dinar1.00", 4530 "Serbian dinar1.00", 4531 "Serbian dinars1.00", 4532 "Seychellois Rupee1.00", 4533 "Seychellois rupee1.00", 4534 "Seychellois rupees1.00", 4535 "Sierra Leonean Leone1.00", 4536 "Sierra Leonean leone1.00", 4537 "Sierra Leonean leones1.00", 4538 "Silver1.00", 4539 "Silver1.00", 4540 "Singapore Dollar1.00", 4541 "Singapore dollar1.00", 4542 "Singapore dollars1.00", 4543 "Slovak Koruna1.00", 4544 "Slovak koruna1.00", 4545 "Slovak korunas1.00", 4546 "Slovenian Tolar1.00", 4547 "Slovenian tolar1.00", 4548 "Slovenian tolars1.00", 4549 "Solomon Islands Dollar1.00", 4550 "Solomon Islands dollar1.00", 4551 "Solomon Islands dollars1.00", 4552 "Somali Shilling1.00", 4553 "Somali shilling1.00", 4554 "Somali shillings1.00", 4555 "South African Rand (financial)1.00", 4556 "South African Rand1.00", 4557 "South African rand (financial)1.00", 4558 "South African rand1.00", 4559 "South African rands (financial)1.00", 4560 "South African rand1.00", 4561 "South Korean Won1.00", 4562 "South Korean won1.00", 4563 "South Korean won1.00", 4564 "Soviet Rouble1.00", 4565 "Soviet rouble1.00", 4566 "Soviet roubles1.00", 4567 "Spanish Peseta (A account)1.00", 4568 "Spanish Peseta (convertible account)1.00", 4569 "Spanish Peseta1.00", 4570 "Spanish peseta (A account)1.00", 4571 "Spanish peseta (convertible account)1.00", 4572 "Spanish peseta1.00", 4573 "Spanish pesetas (A account)1.00", 4574 "Spanish pesetas (convertible account)1.00", 4575 "Spanish pesetas1.00", 4576 "Special Drawing Rights1.00", 4577 "Sri Lankan Rupee1.00", 4578 "Sri Lankan rupee1.00", 4579 "Sri Lankan rupees1.00", 4580 "Sudanese Pound1.00", 4581 "Sudanese pound1.00", 4582 "Sudanese pounds1.00", 4583 "Surinamese Dollar1.00", 4584 "Surinamese dollar1.00", 4585 "Surinamese dollars1.00", 4586 "Surinamese Guilder1.00", 4587 "Surinamese guilder1.00", 4588 "Surinamese guilders1.00", 4589 "Swazi Lilangeni1.00", 4590 "Swazi lilangeni1.00", 4591 "Swazi emalangeni1.00", 4592 "Swedish Krona1.00", 4593 "Swedish krona1.00", 4594 "Swedish kronor1.00", 4595 "Swiss Franc1.00", 4596 "Swiss franc1.00", 4597 "Swiss francs1.00", 4598 "Syrian Pound1.00", 4599 "Syrian pound1.00", 4600 "Syrian pounds1.00", 4601 "THB1.00", 4602 "TJR1.00", 4603 "TJR1.00", 4604 "TJS1.00", 4605 "TJS1.00", 4606 "TMM1.00", 4607 "TMM1.00", 4608 "TND1.00", 4609 "TND1.00", 4610 "TOP1.00", 4611 "TPE1.00", 4612 "TPE1.00", 4613 "TRL1.00", 4614 "TRY1.00", 4615 "TRY1.00", 4616 "TTD1.00", 4617 "TWD1.00", 4618 "TZS1.00", 4619 "New Taiwan Dollar1.00", 4620 "New Taiwan dollar1.00", 4621 "New Taiwan dollars1.00", 4622 "Tajikistani Ruble1.00", 4623 "Tajikistani Somoni1.00", 4624 "Tajikistani ruble1.00", 4625 "Tajikistani rubles1.00", 4626 "Tajikistani somoni1.00", 4627 "Tajikistani somonis1.00", 4628 "Tanzanian Shilling1.00", 4629 "Tanzanian shilling1.00", 4630 "Tanzanian shillings1.00", 4631 "Testing Currency Code1.00", 4632 "Testing Currency Code1.00", 4633 "Thai Baht1.00", 4634 "Thai baht1.00", 4635 "Thai baht1.00", 4636 "Timorese Escudo1.00", 4637 "Timorese escudo1.00", 4638 "Timorese escudos1.00", 4639 "Tongan Pa\\u02bbanga1.00", 4640 "Tongan pa\\u02bbanga1.00", 4641 "Tongan pa\\u02bbanga1.00", 4642 "Trinidad & Tobago Dollar1.00", 4643 "Trinidad & Tobago dollar1.00", 4644 "Trinidad & Tobago dollars1.00", 4645 "Tunisian Dinar1.00", 4646 "Tunisian dinar1.00", 4647 "Tunisian dinars1.00", 4648 "Turkish Lira1.00", 4649 "Turkish Lira1.00", 4650 "Turkish lira1.00", 4651 "Turkmenistani Manat1.00", 4652 "Turkmenistani manat1.00", 4653 "Turkmenistani manat1.00", 4654 "UAE dirham1.00", 4655 "UAE dirhams1.00", 4656 "UAH1.00", 4657 "UAK1.00", 4658 "UAK1.00", 4659 "UGS1.00", 4660 "UGS1.00", 4661 "UGX1.00", 4662 "US Dollar (Next day)1.00", 4663 "US Dollar (Same day)1.00", 4664 "US Dollar1.00", 4665 "US dollar (next day)1.00", 4666 "US dollar (same day)1.00", 4667 "US dollar1.00", 4668 "US dollars (next day)1.00", 4669 "US dollars (same day)1.00", 4670 "US dollars1.00", 4671 "USD1.00", 4672 "USN1.00", 4673 "USN1.00", 4674 "USS1.00", 4675 "USS1.00", 4676 "UYI1.00", 4677 "UYI1.00", 4678 "UYP1.00", 4679 "UYP1.00", 4680 "UYU1.00", 4681 "UZS1.00", 4682 "UZS1.00", 4683 "Ugandan Shilling (1966\\u20131987)1.00", 4684 "Ugandan Shilling1.00", 4685 "Ugandan shilling (1966\\u20131987)1.00", 4686 "Ugandan shilling1.00", 4687 "Ugandan shillings (1966\\u20131987)1.00", 4688 "Ugandan shillings1.00", 4689 "Ukrainian Hryvnia1.00", 4690 "Ukrainian Karbovanets1.00", 4691 "Ukrainian hryvnia1.00", 4692 "Ukrainian hryvnias1.00", 4693 "Ukrainian karbovanets1.00", 4694 "Ukrainian karbovantsiv1.00", 4695 "Colombian Real Value Unit1.00", 4696 "United Arab Emirates Dirham1.00", 4697 "Unknown Currency1.00", 4698 "Uruguayan Peso (1975\\u20131993)1.00", 4699 "Uruguayan Peso1.00", 4700 "Uruguayan Peso (Indexed Units)1.00", 4701 "Uruguayan peso (1975\\u20131993)1.00", 4702 "Uruguayan peso (indexed units)1.00", 4703 "Uruguayan peso1.00", 4704 "Uruguayan pesos (1975\\u20131993)1.00", 4705 "Uruguayan pesos (indexed units)1.00", 4706 "Uruguayan pesos1.00", 4707 "Uzbekistani Som1.00", 4708 "Uzbekistani som1.00", 4709 "Uzbekistani som1.00", 4710 "VEB1.00", 4711 "VEF1.00", 4712 "VND1.00", 4713 "VUV1.00", 4714 "Vanuatu Vatu1.00", 4715 "Vanuatu vatu1.00", 4716 "Vanuatu vatus1.00", 4717 "Venezuelan Bol\\u00edvar1.00", 4718 "Venezuelan Bol\\u00edvar (1871\\u20132008)1.00", 4719 "Venezuelan bol\\u00edvar1.00", 4720 "Venezuelan bol\\u00edvars1.00", 4721 "Venezuelan bol\\u00edvar (1871\\u20132008)1.00", 4722 "Venezuelan bol\\u00edvars (1871\\u20132008)1.00", 4723 "Vietnamese Dong1.00", 4724 "Vietnamese dong1.00", 4725 "Vietnamese dong1.00", 4726 "WIR Euro1.00", 4727 "WIR Franc1.00", 4728 "WIR euro1.00", 4729 "WIR euros1.00", 4730 "WIR franc1.00", 4731 "WIR francs1.00", 4732 "WST1.00", 4733 "WST1.00", 4734 "Samoan Tala1.00", 4735 "Samoan tala1.00", 4736 "Samoan tala1.00", 4737 "XAF1.00", 4738 "XAF1.00", 4739 "XAG1.00", 4740 "XAG1.00", 4741 "XAU1.00", 4742 "XAU1.00", 4743 "XBA1.00", 4744 "XBA1.00", 4745 "XBB1.00", 4746 "XBB1.00", 4747 "XBC1.00", 4748 "XBC1.00", 4749 "XBD1.00", 4750 "XBD1.00", 4751 "XCD1.00", 4752 "XDR1.00", 4753 "XDR1.00", 4754 "XEU1.00", 4755 "XEU1.00", 4756 "XFO1.00", 4757 "XFO1.00", 4758 "XFU1.00", 4759 "XFU1.00", 4760 "XOF1.00", 4761 "XOF1.00", 4762 "XPD1.00", 4763 "XPD1.00", 4764 "XPF1.00", 4765 "XPT1.00", 4766 "XPT1.00", 4767 "XRE1.00", 4768 "XRE1.00", 4769 "XTS1.00", 4770 "XTS1.00", 4771 "XXX1.00", 4772 "XXX1.00", 4773 "YDD1.00", 4774 "YDD1.00", 4775 "YER1.00", 4776 "YUD1.00", 4777 "YUD1.00", 4778 "YUM1.00", 4779 "YUM1.00", 4780 "YUN1.00", 4781 "YUN1.00", 4782 "Yemeni Dinar1.00", 4783 "Yemeni Rial1.00", 4784 "Yemeni dinar1.00", 4785 "Yemeni dinars1.00", 4786 "Yemeni rial1.00", 4787 "Yemeni rials1.00", 4788 "Yugoslavian Convertible Dinar (1990\\u20131992)1.00", 4789 "Yugoslavian Hard Dinar (1966\\u20131990)1.00", 4790 "Yugoslavian New Dinar (1994\\u20132002)1.00", 4791 "Yugoslavian convertible dinar (1990\\u20131992)1.00", 4792 "Yugoslavian convertible dinars (1990\\u20131992)1.00", 4793 "Yugoslavian hard dinar (1966\\u20131990)1.00", 4794 "Yugoslavian hard dinars (1966\\u20131990)1.00", 4795 "Yugoslavian new dinar (1994\\u20132002)1.00", 4796 "Yugoslavian new dinars (1994\\u20132002)1.00", 4797 "ZAL1.00", 4798 "ZAL1.00", 4799 "ZAR1.00", 4800 "ZMK1.00", 4801 "ZMK1.00", 4802 "ZRN1.00", 4803 "ZRN1.00", 4804 "ZRZ1.00", 4805 "ZRZ1.00", 4806 "ZWD1.00", 4807 "Zairean New Zaire (1993\\u20131998)1.00", 4808 "Zairean Zaire (1971\\u20131993)1.00", 4809 "Zairean new zaire (1993\\u20131998)1.00", 4810 "Zairean new zaires (1993\\u20131998)1.00", 4811 "Zairean zaire (1971\\u20131993)1.00", 4812 "Zairean zaires (1971\\u20131993)1.00", 4813 "Zambian Kwacha1.00", 4814 "Zambian kwacha1.00", 4815 "Zambian kwachas1.00", 4816 "Zimbabwean Dollar (1980\\u20132008)1.00", 4817 "Zimbabwean dollar (1980\\u20132008)1.00", 4818 "Zimbabwean dollars (1980\\u20132008)1.00", 4819 "euro1.00", 4820 "euros1.00", 4821 "Turkish lira (1922\\u20132005)1.00", 4822 "special drawing rights1.00", 4823 "Colombian real value unit1.00", 4824 "Colombian real value units1.00", 4825 "unknown currency1.00", 4826 "\\u00a31.00", 4827 "\\u00a51.00", 4828 "\\u20ab1.00", 4829 "\\u20aa1.00", 4830 "\\u20ac1.00", 4831 "\\u20b91.00", 4832 // 4833 // Following has extra text, should be parsed correctly too 4834 "$1.00 random", 4835 "USD1.00 random", 4836 "1.00 US dollar random", 4837 "1.00 US dollars random", 4838 "1.00 Afghan Afghani random", 4839 "1.00 Afghan Afghani random", 4840 "1.00 Afghan Afghanis (1927\\u20131992) random", 4841 "1.00 Afghan Afghanis random", 4842 "1.00 Albanian Lek random", 4843 "1.00 Albanian lek random", 4844 "1.00 Albanian lek\\u00eb random", 4845 "1.00 Algerian Dinar random", 4846 "1.00 Algerian dinar random", 4847 "1.00 Algerian dinars random", 4848 "1.00 Andorran Peseta random", 4849 "1.00 Andorran peseta random", 4850 "1.00 Andorran pesetas random", 4851 "1.00 Angolan Kwanza (1977\\u20131990) random", 4852 "1.00 Angolan Readjusted Kwanza (1995\\u20131999) random", 4853 "1.00 Angolan Kwanza random", 4854 "1.00 Angolan New Kwanza (1990\\u20132000) random", 4855 "1.00 Angolan kwanza (1977\\u20131991) random", 4856 "1.00 Angolan readjusted kwanza (1995\\u20131999) random", 4857 "1.00 Angolan kwanza random", 4858 "1.00 Angolan kwanzas (1977\\u20131991) random", 4859 "1.00 Angolan readjusted kwanzas (1995\\u20131999) random", 4860 "1.00 Angolan kwanzas random", 4861 "1.00 Angolan new kwanza (1990\\u20132000) random", 4862 "1.00 Angolan new kwanzas (1990\\u20132000) random", 4863 "1.00 Argentine Austral random", 4864 "1.00 Argentine Peso (1983\\u20131985) random", 4865 "1.00 Argentine Peso random", 4866 "1.00 Argentine austral random", 4867 "1.00 Argentine australs random", 4868 "1.00 Argentine peso (1983\\u20131985) random", 4869 "1.00 Argentine peso random", 4870 "1.00 Argentine pesos (1983\\u20131985) random", 4871 "1.00 Argentine pesos random", 4872 "1.00 Armenian Dram random", 4873 "1.00 Armenian dram random", 4874 "1.00 Armenian drams random", 4875 "1.00 Aruban Florin random", 4876 "1.00 Aruban florin random", 4877 "1.00 Australian Dollar random", 4878 "1.00 Australian dollar random", 4879 "1.00 Australian dollars random", 4880 "1.00 Austrian Schilling random", 4881 "1.00 Austrian schilling random", 4882 "1.00 Austrian schillings random", 4883 "1.00 Azerbaijani Manat (1993\\u20132006) random", 4884 "1.00 Azerbaijani Manat random", 4885 "1.00 Azerbaijani manat (1993\\u20132006) random", 4886 "1.00 Azerbaijani manat random", 4887 "1.00 Azerbaijani manats (1993\\u20132006) random", 4888 "1.00 Azerbaijani manats random", 4889 "1.00 Bahamian Dollar random", 4890 "1.00 Bahamian dollar random", 4891 "1.00 Bahamian dollars random", 4892 "1.00 Bahraini Dinar random", 4893 "1.00 Bahraini dinar random", 4894 "1.00 Bahraini dinars random", 4895 "1.00 Bangladeshi Taka random", 4896 "1.00 Bangladeshi taka random", 4897 "1.00 Bangladeshi takas random", 4898 "1.00 Barbadian Dollar random", 4899 "1.00 Barbadian dollar random", 4900 "1.00 Barbadian dollars random", 4901 "1.00 Belarusian New Ruble (1994\\u20131999) random", 4902 "1.00 Belarusian Ruble random", 4903 "1.00 Belarusian new ruble (1994\\u20131999) random", 4904 "1.00 Belarusian new rubles (1994\\u20131999) random", 4905 "1.00 Belarusian ruble random", 4906 "1.00 Belarusian rubles random", 4907 "1.00 Belgian Franc (convertible) random", 4908 "1.00 Belgian Franc (financial) random", 4909 "1.00 Belgian Franc random", 4910 "1.00 Belgian franc (convertible) random", 4911 "1.00 Belgian franc (financial) random", 4912 "1.00 Belgian franc random", 4913 "1.00 Belgian francs (convertible) random", 4914 "1.00 Belgian francs (financial) random", 4915 "1.00 Belgian francs random", 4916 "1.00 Belize Dollar random", 4917 "1.00 Belize dollar random", 4918 "1.00 Belize dollars random", 4919 "1.00 Bermudan Dollar random", 4920 "1.00 Bermudan dollar random", 4921 "1.00 Bermudan dollars random", 4922 "1.00 Bhutanese Ngultrum random", 4923 "1.00 Bhutanese ngultrum random", 4924 "1.00 Bhutanese ngultrums random", 4925 "1.00 Bolivian Mvdol random", 4926 "1.00 Bolivian Peso random", 4927 "1.00 Bolivian mvdol random", 4928 "1.00 Bolivian mvdols random", 4929 "1.00 Bolivian peso random", 4930 "1.00 Bolivian pesos random", 4931 "1.00 Bolivian Boliviano random", 4932 "1.00 Bolivian Boliviano random", 4933 "1.00 Bolivian Bolivianos random", 4934 "1.00 Bosnia-Herzegovina Convertible Mark random", 4935 "1.00 Bosnia-Herzegovina Dinar (1992\\u20131994) random", 4936 "1.00 Bosnia-Herzegovina convertible mark random", 4937 "1.00 Bosnia-Herzegovina convertible marks random", 4938 "1.00 Bosnia-Herzegovina dinar (1992\\u20131994) random", 4939 "1.00 Bosnia-Herzegovina dinars (1992\\u20131994) random", 4940 "1.00 Botswanan Pula random", 4941 "1.00 Botswanan pula random", 4942 "1.00 Botswanan pulas random", 4943 "1.00 Brazilian New Cruzado (1989\\u20131990) random", 4944 "1.00 Brazilian Cruzado (1986\\u20131989) random", 4945 "1.00 Brazilian Cruzeiro (1990\\u20131993) random", 4946 "1.00 Brazilian New Cruzeiro (1967\\u20131986) random", 4947 "1.00 Brazilian Cruzeiro (1993\\u20131994) random", 4948 "1.00 Brazilian Real random", 4949 "1.00 Brazilian new cruzado (1989\\u20131990) random", 4950 "1.00 Brazilian new cruzados (1989\\u20131990) random", 4951 "1.00 Brazilian cruzado (1986\\u20131989) random", 4952 "1.00 Brazilian cruzados (1986\\u20131989) random", 4953 "1.00 Brazilian cruzeiro (1990\\u20131993) random", 4954 "1.00 Brazilian new cruzeiro (1967\\u20131986) random", 4955 "1.00 Brazilian cruzeiro (1993\\u20131994) random", 4956 "1.00 Brazilian cruzeiros (1990\\u20131993) random", 4957 "1.00 Brazilian new cruzeiros (1967\\u20131986) random", 4958 "1.00 Brazilian cruzeiros (1993\\u20131994) random", 4959 "1.00 Brazilian real random", 4960 "1.00 Brazilian reals random", 4961 "1.00 British Pound random", 4962 "1.00 British pound random", 4963 "1.00 British pounds random", 4964 "1.00 Brunei Dollar random", 4965 "1.00 Brunei dollar random", 4966 "1.00 Brunei dollars random", 4967 "1.00 Bulgarian Hard Lev random", 4968 "1.00 Bulgarian Lev random", 4969 "1.00 Bulgarian Leva random", 4970 "1.00 Bulgarian hard lev random", 4971 "1.00 Bulgarian hard leva random", 4972 "1.00 Bulgarian lev random", 4973 "1.00 Burmese Kyat random", 4974 "1.00 Burmese kyat random", 4975 "1.00 Burmese kyats random", 4976 "1.00 Burundian Franc random", 4977 "1.00 Burundian franc random", 4978 "1.00 Burundian francs random", 4979 "1.00 Cambodian Riel random", 4980 "1.00 Cambodian riel random", 4981 "1.00 Cambodian riels random", 4982 "1.00 Canadian Dollar random", 4983 "1.00 Canadian dollar random", 4984 "1.00 Canadian dollars random", 4985 "1.00 Cape Verdean Escudo random", 4986 "1.00 Cape Verdean escudo random", 4987 "1.00 Cape Verdean escudos random", 4988 "1.00 Cayman Islands Dollar random", 4989 "1.00 Cayman Islands dollar random", 4990 "1.00 Cayman Islands dollars random", 4991 "1.00 Chilean Peso random", 4992 "1.00 Chilean Unit of Account (UF) random", 4993 "1.00 Chilean peso random", 4994 "1.00 Chilean pesos random", 4995 "1.00 Chilean unit of account (UF) random", 4996 "1.00 Chilean units of account (UF) random", 4997 "1.00 Chinese Yuan random", 4998 "1.00 Chinese yuan random", 4999 "1.00 Colombian Peso random", 5000 "1.00 Colombian peso random", 5001 "1.00 Colombian pesos random", 5002 "1.00 Comorian Franc random", 5003 "1.00 Comorian franc random", 5004 "1.00 Comorian francs random", 5005 "1.00 Congolese Franc Congolais random", 5006 "1.00 Congolese franc Congolais random", 5007 "1.00 Congolese francs Congolais random", 5008 "1.00 Costa Rican Col\\u00f3n random", 5009 "1.00 Costa Rican col\\u00f3n random", 5010 "1.00 Costa Rican col\\u00f3ns random", 5011 "1.00 Croatian Dinar random", 5012 "1.00 Croatian Kuna random", 5013 "1.00 Croatian dinar random", 5014 "1.00 Croatian dinars random", 5015 "1.00 Croatian kuna random", 5016 "1.00 Croatian kunas random", 5017 "1.00 Cuban Peso random", 5018 "1.00 Cuban peso random", 5019 "1.00 Cuban pesos random", 5020 "1.00 Cypriot Pound random", 5021 "1.00 Cypriot pound random", 5022 "1.00 Cypriot pounds random", 5023 "1.00 Czech Republic Koruna random", 5024 "1.00 Czech Republic koruna random", 5025 "1.00 Czech Republic korunas random", 5026 "1.00 Czechoslovak Hard Koruna random", 5027 "1.00 Czechoslovak hard koruna random", 5028 "1.00 Czechoslovak hard korunas random", 5029 "1.00 Danish Krone random", 5030 "1.00 Danish krone random", 5031 "1.00 Danish kroner random", 5032 "1.00 German Mark random", 5033 "1.00 German mark random", 5034 "1.00 German marks random", 5035 "1.00 Djiboutian Franc random", 5036 "1.00 Djiboutian franc random", 5037 "1.00 Djiboutian francs random", 5038 "1.00 Dominican Peso random", 5039 "1.00 Dominican peso random", 5040 "1.00 Dominican pesos random", 5041 "1.00 East Caribbean Dollar random", 5042 "1.00 East Caribbean dollar random", 5043 "1.00 East Caribbean dollars random", 5044 "1.00 East German Mark random", 5045 "1.00 East German mark random", 5046 "1.00 East German marks random", 5047 "1.00 Ecuadorian Sucre random", 5048 "1.00 Ecuadorian Unit of Constant Value random", 5049 "1.00 Ecuadorian sucre random", 5050 "1.00 Ecuadorian sucres random", 5051 "1.00 Ecuadorian unit of constant value random", 5052 "1.00 Ecuadorian units of constant value random", 5053 "1.00 Egyptian Pound random", 5054 "1.00 Egyptian pound random", 5055 "1.00 Egyptian pounds random", 5056 "1.00 Salvadoran Col\\u00f3n random", 5057 "1.00 Salvadoran col\\u00f3n random", 5058 "1.00 Salvadoran colones random", 5059 "1.00 Equatorial Guinean Ekwele random", 5060 "1.00 Equatorial Guinean ekwele random", 5061 "1.00 Eritrean Nakfa random", 5062 "1.00 Eritrean nakfa random", 5063 "1.00 Eritrean nakfas random", 5064 "1.00 Estonian Kroon random", 5065 "1.00 Estonian kroon random", 5066 "1.00 Estonian kroons random", 5067 "1.00 Ethiopian Birr random", 5068 "1.00 Ethiopian birr random", 5069 "1.00 Ethiopian birrs random", 5070 "1.00 European Composite Unit random", 5071 "1.00 European Currency Unit random", 5072 "1.00 European Monetary Unit random", 5073 "1.00 European Unit of Account (XBC) random", 5074 "1.00 European Unit of Account (XBD) random", 5075 "1.00 European composite unit random", 5076 "1.00 European composite units random", 5077 "1.00 European currency unit random", 5078 "1.00 European currency units random", 5079 "1.00 European monetary unit random", 5080 "1.00 European monetary units random", 5081 "1.00 European unit of account (XBC) random", 5082 "1.00 European unit of account (XBD) random", 5083 "1.00 European units of account (XBC) random", 5084 "1.00 European units of account (XBD) random", 5085 "1.00 Falkland Islands Pound random", 5086 "1.00 Falkland Islands pound random", 5087 "1.00 Falkland Islands pounds random", 5088 "1.00 Fijian Dollar random", 5089 "1.00 Fijian dollar random", 5090 "1.00 Fijian dollars random", 5091 "1.00 Finnish Markka random", 5092 "1.00 Finnish markka random", 5093 "1.00 Finnish markkas random", 5094 "1.00 French Franc random", 5095 "1.00 French Gold Franc random", 5096 "1.00 French UIC-Franc random", 5097 "1.00 French UIC-franc random", 5098 "1.00 French UIC-francs random", 5099 "1.00 French franc random", 5100 "1.00 French francs random", 5101 "1.00 French gold franc random", 5102 "1.00 French gold francs random", 5103 "1.00 Gambian Dalasi random", 5104 "1.00 Gambian dalasi random", 5105 "1.00 Gambian dalasis random", 5106 "1.00 Georgian Kupon Larit random", 5107 "1.00 Georgian Lari random", 5108 "1.00 Georgian kupon larit random", 5109 "1.00 Georgian kupon larits random", 5110 "1.00 Georgian lari random", 5111 "1.00 Georgian laris random", 5112 "1.00 Ghanaian Cedi (1979\\u20132007) random", 5113 "1.00 Ghanaian Cedi random", 5114 "1.00 Ghanaian cedi (1979\\u20132007) random", 5115 "1.00 Ghanaian cedi random", 5116 "1.00 Ghanaian cedis (1979\\u20132007) random", 5117 "1.00 Ghanaian cedis random", 5118 "1.00 Gibraltar Pound random", 5119 "1.00 Gibraltar pound random", 5120 "1.00 Gibraltar pounds random", 5121 "1.00 Gold random", 5122 "1.00 Gold random", 5123 "1.00 Greek Drachma random", 5124 "1.00 Greek drachma random", 5125 "1.00 Greek drachmas random", 5126 "1.00 Guatemalan Quetzal random", 5127 "1.00 Guatemalan quetzal random", 5128 "1.00 Guatemalan quetzals random", 5129 "1.00 Guinean Franc random", 5130 "1.00 Guinean Syli random", 5131 "1.00 Guinean franc random", 5132 "1.00 Guinean francs random", 5133 "1.00 Guinean syli random", 5134 "1.00 Guinean sylis random", 5135 "1.00 Guinea-Bissau Peso random", 5136 "1.00 Guinea-Bissau peso random", 5137 "1.00 Guinea-Bissau pesos random", 5138 "1.00 Guyanaese Dollar random", 5139 "1.00 Guyanaese dollar random", 5140 "1.00 Guyanaese dollars random", 5141 "1.00 Haitian Gourde random", 5142 "1.00 Haitian gourde random", 5143 "1.00 Haitian gourdes random", 5144 "1.00 Honduran Lempira random", 5145 "1.00 Honduran lempira random", 5146 "1.00 Honduran lempiras random", 5147 "1.00 Hong Kong Dollar random", 5148 "1.00 Hong Kong dollar random", 5149 "1.00 Hong Kong dollars random", 5150 "1.00 Hungarian Forint random", 5151 "1.00 Hungarian forint random", 5152 "1.00 Hungarian forints random", 5153 "1.00 Icelandic Kr\\u00f3na random", 5154 "1.00 Icelandic kr\\u00f3na random", 5155 "1.00 Icelandic kr\\u00f3nur random", 5156 "1.00 Indian Rupee random", 5157 "1.00 Indian rupee random", 5158 "1.00 Indian rupees random", 5159 "1.00 Indonesian Rupiah random", 5160 "1.00 Indonesian rupiah random", 5161 "1.00 Indonesian rupiahs random", 5162 "1.00 Iranian Rial random", 5163 "1.00 Iranian rial random", 5164 "1.00 Iranian rials random", 5165 "1.00 Iraqi Dinar random", 5166 "1.00 Iraqi dinar random", 5167 "1.00 Iraqi dinars random", 5168 "1.00 Irish Pound random", 5169 "1.00 Irish pound random", 5170 "1.00 Irish pounds random", 5171 "1.00 Israeli Pound random", 5172 "1.00 Israeli new sheqel random", 5173 "1.00 Israeli pound random", 5174 "1.00 Israeli pounds random", 5175 "1.00 Italian Lira random", 5176 "1.00 Italian lira random", 5177 "1.00 Italian liras random", 5178 "1.00 Jamaican Dollar random", 5179 "1.00 Jamaican dollar random", 5180 "1.00 Jamaican dollars random", 5181 "1.00 Japanese Yen random", 5182 "1.00 Japanese yen random", 5183 "1.00 Jordanian Dinar random", 5184 "1.00 Jordanian dinar random", 5185 "1.00 Jordanian dinars random", 5186 "1.00 Kazakhstani Tenge random", 5187 "1.00 Kazakhstani tenge random", 5188 "1.00 Kazakhstani tenges random", 5189 "1.00 Kenyan Shilling random", 5190 "1.00 Kenyan shilling random", 5191 "1.00 Kenyan shillings random", 5192 "1.00 Kuwaiti Dinar random", 5193 "1.00 Kuwaiti dinar random", 5194 "1.00 Kuwaiti dinars random", 5195 "1.00 Kyrgystani Som random", 5196 "1.00 Kyrgystani som random", 5197 "1.00 Kyrgystani soms random", 5198 "1.00 Laotian Kip random", 5199 "1.00 Laotian kip random", 5200 "1.00 Laotian kips random", 5201 "1.00 Latvian Lats random", 5202 "1.00 Latvian Ruble random", 5203 "1.00 Latvian lats random", 5204 "1.00 Latvian lati random", 5205 "1.00 Latvian ruble random", 5206 "1.00 Latvian rubles random", 5207 "1.00 Lebanese Pound random", 5208 "1.00 Lebanese pound random", 5209 "1.00 Lebanese pounds random", 5210 "1.00 Lesotho Loti random", 5211 "1.00 Lesotho loti random", 5212 "1.00 Lesotho lotis random", 5213 "1.00 Liberian Dollar random", 5214 "1.00 Liberian dollar random", 5215 "1.00 Liberian dollars random", 5216 "1.00 Libyan Dinar random", 5217 "1.00 Libyan dinar random", 5218 "1.00 Libyan dinars random", 5219 "1.00 Lithuanian Litas random", 5220 "1.00 Lithuanian Talonas random", 5221 "1.00 Lithuanian litas random", 5222 "1.00 Lithuanian litai random", 5223 "1.00 Lithuanian talonas random", 5224 "1.00 Lithuanian talonases random", 5225 "1.00 Luxembourgian Convertible Franc random", 5226 "1.00 Luxembourg Financial Franc random", 5227 "1.00 Luxembourgian Franc random", 5228 "1.00 Luxembourgian convertible franc random", 5229 "1.00 Luxembourgian convertible francs random", 5230 "1.00 Luxembourg financial franc random", 5231 "1.00 Luxembourg financial francs random", 5232 "1.00 Luxembourgian franc random", 5233 "1.00 Luxembourgian francs random", 5234 "1.00 Macanese Pataca random", 5235 "1.00 Macanese pataca random", 5236 "1.00 Macanese patacas random", 5237 "1.00 Macedonian Denar random", 5238 "1.00 Macedonian denar random", 5239 "1.00 Macedonian denari random", 5240 "1.00 Malagasy Ariaries random", 5241 "1.00 Malagasy Ariary random", 5242 "1.00 Malagasy Ariary random", 5243 "1.00 Malagasy Franc random", 5244 "1.00 Malagasy franc random", 5245 "1.00 Malagasy francs random", 5246 "1.00 Malawian Kwacha random", 5247 "1.00 Malawian Kwacha random", 5248 "1.00 Malawian Kwachas random", 5249 "1.00 Malaysian Ringgit random", 5250 "1.00 Malaysian ringgit random", 5251 "1.00 Malaysian ringgits random", 5252 "1.00 Maldivian Rufiyaa random", 5253 "1.00 Maldivian rufiyaa random", 5254 "1.00 Maldivian rufiyaas random", 5255 "1.00 Malian Franc random", 5256 "1.00 Malian franc random", 5257 "1.00 Malian francs random", 5258 "1.00 Maltese Lira random", 5259 "1.00 Maltese Pound random", 5260 "1.00 Maltese lira random", 5261 "1.00 Maltese liras random", 5262 "1.00 Maltese pound random", 5263 "1.00 Maltese pounds random", 5264 "1.00 Mauritanian Ouguiya random", 5265 "1.00 Mauritanian ouguiya random", 5266 "1.00 Mauritanian ouguiyas random", 5267 "1.00 Mauritian Rupee random", 5268 "1.00 Mauritian rupee random", 5269 "1.00 Mauritian rupees random", 5270 "1.00 Mexican Peso random", 5271 "1.00 Mexican Silver Peso (1861\\u20131992) random", 5272 "1.00 Mexican Investment Unit random", 5273 "1.00 Mexican peso random", 5274 "1.00 Mexican pesos random", 5275 "1.00 Mexican silver peso (1861\\u20131992) random", 5276 "1.00 Mexican silver pesos (1861\\u20131992) random", 5277 "1.00 Mexican investment unit random", 5278 "1.00 Mexican investment units random", 5279 "1.00 Moldovan Leu random", 5280 "1.00 Moldovan leu random", 5281 "1.00 Moldovan lei random", 5282 "1.00 Mongolian Tugrik random", 5283 "1.00 Mongolian tugrik random", 5284 "1.00 Mongolian tugriks random", 5285 "1.00 Moroccan Dirham random", 5286 "1.00 Moroccan Franc random", 5287 "1.00 Moroccan dirham random", 5288 "1.00 Moroccan dirhams random", 5289 "1.00 Moroccan franc random", 5290 "1.00 Moroccan francs random", 5291 "1.00 Mozambican Escudo random", 5292 "1.00 Mozambican Metical random", 5293 "1.00 Mozambican escudo random", 5294 "1.00 Mozambican escudos random", 5295 "1.00 Mozambican metical random", 5296 "1.00 Mozambican meticals random", 5297 "1.00 Myanmar Kyat random", 5298 "1.00 Myanmar kyat random", 5299 "1.00 Myanmar kyats random", 5300 "1.00 Namibian Dollar random", 5301 "1.00 Namibian dollar random", 5302 "1.00 Namibian dollars random", 5303 "1.00 Nepalese Rupee random", 5304 "1.00 Nepalese rupee random", 5305 "1.00 Nepalese rupees random", 5306 "1.00 Netherlands Antillean Guilder random", 5307 "1.00 Netherlands Antillean guilder random", 5308 "1.00 Netherlands Antillean guilders random", 5309 "1.00 Dutch Guilder random", 5310 "1.00 Dutch guilder random", 5311 "1.00 Dutch guilders random", 5312 "1.00 Israeli New Sheqel random", 5313 "1.00 Israeli new sheqels random", 5314 "1.00 New Zealand Dollar random", 5315 "1.00 New Zealand dollar random", 5316 "1.00 New Zealand dollars random", 5317 "1.00 Nicaraguan C\\u00f3rdoba random", 5318 "1.00 Nicaraguan C\\u00f3rdoba (1988\\u20131991) random", 5319 "1.00 Nicaraguan c\\u00f3rdoba random", 5320 "1.00 Nicaraguan c\\u00f3rdoba random", 5321 "1.00 Nicaraguan c\\u00f3rdoba (1988\\u20131991) random", 5322 "1.00 Nicaraguan c\\u00f3rdobas (1988\\u20131991) random", 5323 "1.00 Nigerian Naira random", 5324 "1.00 Nigerian naira random", 5325 "1.00 Nigerian nairas random", 5326 "1.00 North Korean Won random", 5327 "1.00 North Korean won random", 5328 "1.00 North Korean won random", 5329 "1.00 Norwegian Krone random", 5330 "1.00 Norwegian krone random", 5331 "1.00 Norwegian kroner random", 5332 "1.00 Mozambican Metical (1980\\u20132006) random", 5333 "1.00 Mozambican metical (1980\\u20132006) random", 5334 "1.00 Mozambican meticals (1980\\u20132006) random", 5335 "1.00 Romanian Lei (1952\\u20132006) random", 5336 "1.00 Romanian Leu (1952\\u20132006) random", 5337 "1.00 Romanian leu (1952\\u20132006) random", 5338 "1.00 Serbian Dinar (2002\\u20132006) random", 5339 "1.00 Serbian dinar (2002\\u20132006) random", 5340 "1.00 Serbian dinars (2002\\u20132006) random", 5341 "1.00 Sudanese Dinar (1992\\u20132007) random", 5342 "1.00 Sudanese Pound (1957\\u20131998) random", 5343 "1.00 Sudanese dinar (1992\\u20132007) random", 5344 "1.00 Sudanese dinars (1992\\u20132007) random", 5345 "1.00 Sudanese pound (1957\\u20131998) random", 5346 "1.00 Sudanese pounds (1957\\u20131998) random", 5347 "1.00 Turkish Lira (1922\\u20132005) random", 5348 "1.00 Turkish Lira (1922\\u20132005) random", 5349 "1.00 Omani Rial random", 5350 "1.00 Omani rial random", 5351 "1.00 Omani rials random", 5352 "1.00 Pakistani Rupee random", 5353 "1.00 Pakistani rupee random", 5354 "1.00 Pakistani rupees random", 5355 "1.00 Palladium random", 5356 "1.00 Palladium random", 5357 "1.00 Panamanian Balboa random", 5358 "1.00 Panamanian balboa random", 5359 "1.00 Panamanian balboas random", 5360 "1.00 Papua New Guinean Kina random", 5361 "1.00 Papua New Guinean kina random", 5362 "1.00 Papua New Guinean kina random", 5363 "1.00 Paraguayan Guarani random", 5364 "1.00 Paraguayan guarani random", 5365 "1.00 Paraguayan guaranis random", 5366 "1.00 Peruvian Inti random", 5367 "1.00 Peruvian Nuevo Sol random", 5368 "1.00 Peruvian Sol (1863\\u20131965) random", 5369 "1.00 Peruvian inti random", 5370 "1.00 Peruvian intis random", 5371 "1.00 Peruvian nuevo sol random", 5372 "1.00 Peruvian nuevos soles random", 5373 "1.00 Peruvian sol (1863\\u20131965) random", 5374 "1.00 Peruvian soles (1863\\u20131965) random", 5375 "1.00 Philippine Peso random", 5376 "1.00 Philippine peso random", 5377 "1.00 Philippine pesos random", 5378 "1.00 Platinum random", 5379 "1.00 Platinum random", 5380 "1.00 Polish Zloty (1950\\u20131995) random", 5381 "1.00 Polish Zloty random", 5382 "1.00 Polish zlotys random", 5383 "1.00 Polish zloty (PLZ) random", 5384 "1.00 Polish zloty random", 5385 "1.00 Polish zlotys (PLZ) random", 5386 "1.00 Portuguese Escudo random", 5387 "1.00 Portuguese Guinea Escudo random", 5388 "1.00 Portuguese Guinea escudo random", 5389 "1.00 Portuguese Guinea escudos random", 5390 "1.00 Portuguese escudo random", 5391 "1.00 Portuguese escudos random", 5392 "1.00 Qatari Rial random", 5393 "1.00 Qatari rial random", 5394 "1.00 Qatari rials random", 5395 "1.00 RINET Funds random", 5396 "1.00 RINET Funds random", 5397 "1.00 Rhodesian Dollar random", 5398 "1.00 Rhodesian dollar random", 5399 "1.00 Rhodesian dollars random", 5400 "1.00 Romanian Leu random", 5401 "1.00 Romanian lei random", 5402 "1.00 Romanian leu random", 5403 "1.00 Russian Ruble (1991\\u20131998) random", 5404 "1.00 Russian Ruble random", 5405 "1.00 Russian ruble (1991\\u20131998) random", 5406 "1.00 Russian ruble random", 5407 "1.00 Russian rubles (1991\\u20131998) random", 5408 "1.00 Russian rubles random", 5409 "1.00 Rwandan Franc random", 5410 "1.00 Rwandan franc random", 5411 "1.00 Rwandan francs random", 5412 "1.00 St. Helena Pound random", 5413 "1.00 St. Helena pound random", 5414 "1.00 St. Helena pounds random", 5415 "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobra random", 5416 "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobra random", 5417 "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobras random", 5418 "1.00 Saudi Riyal random", 5419 "1.00 Saudi riyal random", 5420 "1.00 Saudi riyals random", 5421 "1.00 Serbian Dinar random", 5422 "1.00 Serbian dinar random", 5423 "1.00 Serbian dinars random", 5424 "1.00 Seychellois Rupee random", 5425 "1.00 Seychellois rupee random", 5426 "1.00 Seychellois rupees random", 5427 "1.00 Sierra Leonean Leone random", 5428 "1.00 Sierra Leonean leone random", 5429 "1.00 Sierra Leonean leones random", 5430 "1.00 Singapore Dollar random", 5431 "1.00 Singapore dollar random", 5432 "1.00 Singapore dollars random", 5433 "1.00 Slovak Koruna random", 5434 "1.00 Slovak koruna random", 5435 "1.00 Slovak korunas random", 5436 "1.00 Slovenian Tolar random", 5437 "1.00 Slovenian tolar random", 5438 "1.00 Slovenian tolars random", 5439 "1.00 Solomon Islands Dollar random", 5440 "1.00 Solomon Islands dollar random", 5441 "1.00 Solomon Islands dollars random", 5442 "1.00 Somali Shilling random", 5443 "1.00 Somali shilling random", 5444 "1.00 Somali shillings random", 5445 "1.00 South African Rand (financial) random", 5446 "1.00 South African Rand random", 5447 "1.00 South African rand (financial) random", 5448 "1.00 South African rand random", 5449 "1.00 South African rands (financial) random", 5450 "1.00 South African rand random", 5451 "1.00 South Korean Won random", 5452 "1.00 South Korean won random", 5453 "1.00 South Korean won random", 5454 "1.00 Soviet Rouble random", 5455 "1.00 Soviet rouble random", 5456 "1.00 Soviet roubles random", 5457 "1.00 Spanish Peseta (A account) random", 5458 "1.00 Spanish Peseta (convertible account) random", 5459 "1.00 Spanish Peseta random", 5460 "1.00 Spanish peseta (A account) random", 5461 "1.00 Spanish peseta (convertible account) random", 5462 "1.00 Spanish peseta random", 5463 "1.00 Spanish pesetas (A account) random", 5464 "1.00 Spanish pesetas (convertible account) random", 5465 "1.00 Spanish pesetas random", 5466 "1.00 Special Drawing Rights random", 5467 "1.00 Sri Lankan Rupee random", 5468 "1.00 Sri Lankan rupee random", 5469 "1.00 Sri Lankan rupees random", 5470 "1.00 Sudanese Pound random", 5471 "1.00 Sudanese pound random", 5472 "1.00 Sudanese pounds random", 5473 "1.00 Surinamese Dollar random", 5474 "1.00 Surinamese dollar random", 5475 "1.00 Surinamese dollars random", 5476 "1.00 Surinamese Guilder random", 5477 "1.00 Surinamese guilder random", 5478 "1.00 Surinamese guilders random", 5479 "1.00 Swazi Lilangeni random", 5480 "1.00 Swazi lilangeni random", 5481 "1.00 Swazi emalangeni random", 5482 "1.00 Swedish Krona random", 5483 "1.00 Swedish krona random", 5484 "1.00 Swedish kronor random", 5485 "1.00 Swiss Franc random", 5486 "1.00 Swiss franc random", 5487 "1.00 Swiss francs random", 5488 "1.00 Syrian Pound random", 5489 "1.00 Syrian pound random", 5490 "1.00 Syrian pounds random", 5491 "1.00 New Taiwan Dollar random", 5492 "1.00 New Taiwan dollar random", 5493 "1.00 New Taiwan dollars random", 5494 "1.00 Tajikistani Ruble random", 5495 "1.00 Tajikistani Somoni random", 5496 "1.00 Tajikistani ruble random", 5497 "1.00 Tajikistani rubles random", 5498 "1.00 Tajikistani somoni random", 5499 "1.00 Tajikistani somonis random", 5500 "1.00 Tanzanian Shilling random", 5501 "1.00 Tanzanian shilling random", 5502 "1.00 Tanzanian shillings random", 5503 "1.00 Testing Currency Code random", 5504 "1.00 Testing Currency Code random", 5505 "1.00 Thai Baht random", 5506 "1.00 Thai baht random", 5507 "1.00 Thai baht random", 5508 "1.00 Timorese Escudo random", 5509 "1.00 Timorese escudo random", 5510 "1.00 Timorese escudos random", 5511 "1.00 Trinidad & Tobago Dollar random", 5512 "1.00 Trinidad & Tobago dollar random", 5513 "1.00 Trinidad & Tobago dollars random", 5514 "1.00 Tunisian Dinar random", 5515 "1.00 Tunisian dinar random", 5516 "1.00 Tunisian dinars random", 5517 "1.00 Turkish Lira random", 5518 "1.00 Turkish Lira random", 5519 "1.00 Turkish lira random", 5520 "1.00 Turkmenistani Manat random", 5521 "1.00 Turkmenistani manat random", 5522 "1.00 Turkmenistani manat random", 5523 "1.00 US Dollar (Next day) random", 5524 "1.00 US Dollar (Same day) random", 5525 "1.00 US Dollar random", 5526 "1.00 US dollar (next day) random", 5527 "1.00 US dollar (same day) random", 5528 "1.00 US dollar random", 5529 "1.00 US dollars (next day) random", 5530 "1.00 US dollars (same day) random", 5531 "1.00 US dollars random", 5532 "1.00 Ugandan Shilling (1966\\u20131987) random", 5533 "1.00 Ugandan Shilling random", 5534 "1.00 Ugandan shilling (1966\\u20131987) random", 5535 "1.00 Ugandan shilling random", 5536 "1.00 Ugandan shillings (1966\\u20131987) random", 5537 "1.00 Ugandan shillings random", 5538 "1.00 Ukrainian Hryvnia random", 5539 "1.00 Ukrainian Karbovanets random", 5540 "1.00 Ukrainian hryvnia random", 5541 "1.00 Ukrainian hryvnias random", 5542 "1.00 Ukrainian karbovanets random", 5543 "1.00 Ukrainian karbovantsiv random", 5544 "1.00 Colombian Real Value Unit random", 5545 "1.00 United Arab Emirates Dirham random", 5546 "1.00 Unknown Currency random", 5547 "1.00 Uruguayan Peso (1975\\u20131993) random", 5548 "1.00 Uruguayan Peso random", 5549 "1.00 Uruguayan Peso (Indexed Units) random", 5550 "1.00 Uruguayan peso (1975\\u20131993) random", 5551 "1.00 Uruguayan peso (indexed units) random", 5552 "1.00 Uruguayan peso random", 5553 "1.00 Uruguayan pesos (1975\\u20131993) random", 5554 "1.00 Uruguayan pesos (indexed units) random", 5555 "1.00 Uzbekistani Som random", 5556 "1.00 Uzbekistani som random", 5557 "1.00 Uzbekistani som random", 5558 "1.00 Vanuatu Vatu random", 5559 "1.00 Vanuatu vatu random", 5560 "1.00 Vanuatu vatus random", 5561 "1.00 Venezuelan Bol\\u00edvar random", 5562 "1.00 Venezuelan Bol\\u00edvar (1871\\u20132008) random", 5563 "1.00 Venezuelan bol\\u00edvar random", 5564 "1.00 Venezuelan bol\\u00edvars random", 5565 "1.00 Venezuelan bol\\u00edvar (1871\\u20132008) random", 5566 "1.00 Venezuelan bol\\u00edvars (1871\\u20132008) random", 5567 "1.00 Vietnamese Dong random", 5568 "1.00 Vietnamese dong random", 5569 "1.00 Vietnamese dong random", 5570 "1.00 WIR Euro random", 5571 "1.00 WIR Franc random", 5572 "1.00 WIR euro random", 5573 "1.00 WIR euros random", 5574 "1.00 WIR franc random", 5575 "1.00 WIR francs random", 5576 "1.00 Samoan Tala random", 5577 "1.00 Samoan tala random", 5578 "1.00 Samoan tala random", 5579 "1.00 Yemeni Dinar random", 5580 "1.00 Yemeni Rial random", 5581 "1.00 Yemeni dinar random", 5582 "1.00 Yemeni dinars random", 5583 "1.00 Yemeni rial random", 5584 "1.00 Yemeni rials random", 5585 "1.00 Yugoslavian Convertible Dinar (1990\\u20131992) random", 5586 "1.00 Yugoslavian Hard Dinar (1966\\u20131990) random", 5587 "1.00 Yugoslavian New Dinar (1994\\u20132002) random", 5588 "1.00 Yugoslavian convertible dinar (1990\\u20131992) random", 5589 "1.00 Yugoslavian convertible dinars (1990\\u20131992) random", 5590 "1.00 Yugoslavian hard dinar (1966\\u20131990) random", 5591 "1.00 Yugoslavian hard dinars (1966\\u20131990) random", 5592 "1.00 Yugoslavian new dinar (1994\\u20132002) random", 5593 "1.00 Yugoslavian new dinars (1994\\u20132002) random", 5594 "1.00 Zairean New Zaire (1993\\u20131998) random", 5595 "1.00 Zairean Zaire (1971\\u20131993) random", 5596 "1.00 Zairean new zaire (1993\\u20131998) random", 5597 "1.00 Zairean new zaires (1993\\u20131998) random", 5598 "1.00 Zairean zaire (1971\\u20131993) random", 5599 "1.00 Zairean zaires (1971\\u20131993) random", 5600 "1.00 Zambian Kwacha random", 5601 "1.00 Zambian kwacha random", 5602 "1.00 Zambian kwachas random", 5603 "1.00 Zimbabwean Dollar (1980\\u20132008) random", 5604 "1.00 Zimbabwean dollar (1980\\u20132008) random", 5605 "1.00 Zimbabwean dollars (1980\\u20132008) random", 5606 "1.00 euro random", 5607 "1.00 euros random", 5608 "1.00 Turkish lira (1922\\u20132005) random", 5609 "1.00 special drawing rights random", 5610 "1.00 Colombian real value unit random", 5611 "1.00 Colombian real value units random", 5612 "1.00 unknown currency random", 5613 }; 5614 5615 const char* WRONG_DATA[] = { 5616 // Following are missing one last char in the currency name 5617 "usd1.00", // case sensitive 5618 "1.00 Nicaraguan Cordob", 5619 "1.00 Namibian Dolla", 5620 "1.00 Namibian dolla", 5621 "1.00 Nepalese Rupe", 5622 "1.00 Nepalese rupe", 5623 "1.00 Netherlands Antillean Guilde", 5624 "1.00 Netherlands Antillean guilde", 5625 "1.00 Dutch Guilde", 5626 "1.00 Dutch guilde", 5627 "1.00 Israeli New Sheqe", 5628 "1.00 New Zealand Dolla", 5629 "1.00 New Zealand dolla", 5630 "1.00 Nicaraguan cordob", 5631 "1.00 Nigerian Nair", 5632 "1.00 Nigerian nair", 5633 "1.00 North Korean Wo", 5634 "1.00 North Korean wo", 5635 "1.00 Norwegian Kron", 5636 "1.00 Norwegian kron", 5637 "1.00 US dolla", 5638 "1.00", 5639 "A1.00", 5640 "AD1.00", 5641 "AE1.00", 5642 "AF1.00", 5643 "AL1.00", 5644 "AM1.00", 5645 "AN1.00", 5646 "AO1.00", 5647 "AR1.00", 5648 "AT1.00", 5649 "AU1.00", 5650 "AW1.00", 5651 "AZ1.00", 5652 "Afghan Afghan1.00", 5653 "Afghan Afghani (1927\\u201320021.00", 5654 "Afl1.00", 5655 "Albanian Le1.00", 5656 "Algerian Dina1.00", 5657 "Andorran Peset1.00", 5658 "Angolan Kwanz1.00", 5659 "Angolan Kwanza (1977\\u201319901.00", 5660 "Angolan Readjusted Kwanza (1995\\u201319991.00", 5661 "Angolan New Kwanza (1990\\u201320001.00", 5662 "Argentine Austra1.00", 5663 "Argentine Pes1.00", 5664 "Argentine Peso (1983\\u201319851.00", 5665 "Armenian Dra1.00", 5666 "Aruban Flori1.00", 5667 "Australian Dolla1.00", 5668 "Austrian Schillin1.00", 5669 "Azerbaijani Mana1.00", 5670 "Azerbaijani Manat (1993\\u201320061.00", 5671 "B1.00", 5672 "BA1.00", 5673 "BB1.00", 5674 "BE1.00", 5675 "BG1.00", 5676 "BH1.00", 5677 "BI1.00", 5678 "BM1.00", 5679 "BN1.00", 5680 "BO1.00", 5681 "BR1.00", 5682 "BS1.00", 5683 "BT1.00", 5684 "BU1.00", 5685 "BW1.00", 5686 "BY1.00", 5687 "BZ1.00", 5688 "Bahamian Dolla1.00", 5689 "Bahraini Dina1.00", 5690 "Bangladeshi Tak1.00", 5691 "Barbadian Dolla1.00", 5692 "Bds1.00", 5693 "Belarusian New Ruble (1994\\u201319991.00", 5694 "Belarusian Rubl1.00", 5695 "Belgian Fran1.00", 5696 "Belgian Franc (convertible1.00", 5697 "Belgian Franc (financial1.00", 5698 "Belize Dolla1.00", 5699 "Bermudan Dolla1.00", 5700 "Bhutanese Ngultru1.00", 5701 "Bolivian Mvdo1.00", 5702 "Bolivian Pes1.00", 5703 "Bolivian Bolivian1.00", 5704 "Bosnia-Herzegovina Convertible Mar1.00", 5705 "Bosnia-Herzegovina Dina1.00", 5706 "Botswanan Pul1.00", 5707 "Brazilian Cruzad1.00", 5708 "Brazilian Cruzado Nov1.00", 5709 "Brazilian Cruzeir1.00", 5710 "Brazilian Cruzeiro (1990\\u201319931.00", 5711 "Brazilian New Cruzeiro (1967\\u201319861.00", 5712 "Brazilian Rea1.00", 5713 "British Pound Sterlin1.00", 5714 "Brunei Dolla1.00", 5715 "Bulgarian Hard Le1.00", 5716 "Bulgarian Le1.00", 5717 "Burmese Kya1.00", 5718 "Burundian Fran1.00", 5719 "C1.00", 5720 "CA1.00", 5721 "CD1.00", 5722 "CFP Fran1.00", 5723 "CFP1.00", 5724 "CH1.00", 5725 "CL1.00", 5726 "CN1.00", 5727 "CO1.00", 5728 "CS1.00", 5729 "CU1.00", 5730 "CV1.00", 5731 "CY1.00", 5732 "CZ1.00", 5733 "Cambodian Rie1.00", 5734 "Canadian Dolla1.00", 5735 "Cape Verdean Escud1.00", 5736 "Cayman Islands Dolla1.00", 5737 "Chilean Pes1.00", 5738 "Chilean Unit of Accoun1.00", 5739 "Chinese Yua1.00", 5740 "Colombian Pes1.00", 5741 "Comoro Fran1.00", 5742 "Congolese Fran1.00", 5743 "Costa Rican Col\\u00f31.00", 5744 "Croatian Dina1.00", 5745 "Croatian Kun1.00", 5746 "Cuban Pes1.00", 5747 "Cypriot Poun1.00", 5748 "Czech Republic Korun1.00", 5749 "Czechoslovak Hard Korun1.00", 5750 "D1.00", 5751 "DD1.00", 5752 "DE1.00", 5753 "DJ1.00", 5754 "DK1.00", 5755 "DO1.00", 5756 "DZ1.00", 5757 "Danish Kron1.00", 5758 "German Mar1.00", 5759 "Djiboutian Fran1.00", 5760 "Dk1.00", 5761 "Dominican Pes1.00", 5762 "EC1.00", 5763 "EE1.00", 5764 "EG1.00", 5765 "EQ1.00", 5766 "ER1.00", 5767 "ES1.00", 5768 "ET1.00", 5769 "EU1.00", 5770 "East Caribbean Dolla1.00", 5771 "East German Ostmar1.00", 5772 "Ecuadorian Sucr1.00", 5773 "Ecuadorian Unit of Constant Valu1.00", 5774 "Egyptian Poun1.00", 5775 "Ekwel1.00", 5776 "Salvadoran Col\\u00f31.00", 5777 "Equatorial Guinean Ekwel1.00", 5778 "Eritrean Nakf1.00", 5779 "Es1.00", 5780 "Estonian Kroo1.00", 5781 "Ethiopian Bir1.00", 5782 "Eur1.00", 5783 "European Composite Uni1.00", 5784 "European Currency Uni1.00", 5785 "European Monetary Uni1.00", 5786 "European Unit of Account (XBC1.00", 5787 "European Unit of Account (XBD1.00", 5788 "F1.00", 5789 "FB1.00", 5790 "FI1.00", 5791 "FJ1.00", 5792 "FK1.00", 5793 "FR1.00", 5794 "Falkland Islands Poun1.00", 5795 "Fd1.00", 5796 "Fijian Dolla1.00", 5797 "Finnish Markk1.00", 5798 "Fr1.00", 5799 "French Fran1.00", 5800 "French Gold Fran1.00", 5801 "French UIC-Fran1.00", 5802 "G1.00", 5803 "GB1.00", 5804 "GE1.00", 5805 "GH1.00", 5806 "GI1.00", 5807 "GM1.00", 5808 "GN1.00", 5809 "GQ1.00", 5810 "GR1.00", 5811 "GT1.00", 5812 "GW1.00", 5813 "GY1.00", 5814 "Gambian Dalas1.00", 5815 "Georgian Kupon Lari1.00", 5816 "Georgian Lar1.00", 5817 "Ghanaian Ced1.00", 5818 "Ghanaian Cedi (1979\\u201320071.00", 5819 "Gibraltar Poun1.00", 5820 "Gol1.00", 5821 "Greek Drachm1.00", 5822 "Guatemalan Quetza1.00", 5823 "Guinean Fran1.00", 5824 "Guinean Syl1.00", 5825 "Guinea-Bissau Pes1.00", 5826 "Guyanaese Dolla1.00", 5827 "HK1.00", 5828 "HN1.00", 5829 "HR1.00", 5830 "HT1.00", 5831 "HU1.00", 5832 "Haitian Gourd1.00", 5833 "Honduran Lempir1.00", 5834 "Hong Kong Dolla1.00", 5835 "Hungarian Forin1.00", 5836 "I1.00", 5837 "IE1.00", 5838 "IL1.00", 5839 "IN1.00", 5840 "IQ1.00", 5841 "IR1.00", 5842 "IS1.00", 5843 "IT1.00", 5844 "Icelandic Kron1.00", 5845 "Indian Rupe1.00", 5846 "Indonesian Rupia1.00", 5847 "Iranian Ria1.00", 5848 "Iraqi Dina1.00", 5849 "Irish Poun1.00", 5850 "Israeli Poun1.00", 5851 "Italian Lir1.00", 5852 "J1.00", 5853 "JM1.00", 5854 "JO1.00", 5855 "JP1.00", 5856 "Jamaican Dolla1.00", 5857 "Japanese Ye1.00", 5858 "Jordanian Dina1.00", 5859 "K S1.00", 5860 "K1.00", 5861 "KE1.00", 5862 "KG1.00", 5863 "KH1.00", 5864 "KP1.00", 5865 "KR1.00", 5866 "KW1.00", 5867 "KY1.00", 5868 "KZ1.00", 5869 "Kazakhstani Teng1.00", 5870 "Kenyan Shillin1.00", 5871 "Kuwaiti Dina1.00", 5872 "Kyrgystani So1.00", 5873 "LA1.00", 5874 "LB1.00", 5875 "LK1.00", 5876 "LR1.00", 5877 "LT1.00", 5878 "LU1.00", 5879 "LV1.00", 5880 "LY1.00", 5881 "Laotian Ki1.00", 5882 "Latvian Lat1.00", 5883 "Latvian Rubl1.00", 5884 "Lebanese Poun1.00", 5885 "Lesotho Lot1.00", 5886 "Liberian Dolla1.00", 5887 "Libyan Dina1.00", 5888 "Lithuanian Lit1.00", 5889 "Lithuanian Talona1.00", 5890 "Luxembourgian Convertible Fran1.00", 5891 "Luxembourg Financial Fran1.00", 5892 "Luxembourgian Fran1.00", 5893 "MA1.00", 5894 "MD1.00", 5895 "MDe1.00", 5896 "MEX1.00", 5897 "MG1.00", 5898 "ML1.00", 5899 "MM1.00", 5900 "MN1.00", 5901 "MO1.00", 5902 "MR1.00", 5903 "MT1.00", 5904 "MU1.00", 5905 "MV1.00", 5906 "MW1.00", 5907 "MX1.00", 5908 "MY1.00", 5909 "MZ1.00", 5910 "Macanese Patac1.00", 5911 "Macedonian Dena1.00", 5912 "Malagasy Ariar1.00", 5913 "Malagasy Fran1.00", 5914 "Malawian Kwach1.00", 5915 "Malaysian Ringgi1.00", 5916 "Maldivian Rufiya1.00", 5917 "Malian Fran1.00", 5918 "Malot1.00", 5919 "Maltese Lir1.00", 5920 "Maltese Poun1.00", 5921 "Mauritanian Ouguiy1.00", 5922 "Mauritian Rupe1.00", 5923 "Mexican Pes1.00", 5924 "Mexican Silver Peso (1861\\u201319921.00", 5925 "Mexican Investment Uni1.00", 5926 "Moldovan Le1.00", 5927 "Mongolian Tugri1.00", 5928 "Moroccan Dirha1.00", 5929 "Moroccan Fran1.00", 5930 "Mozambican Escud1.00", 5931 "Mozambican Metica1.00", 5932 "Myanmar Kya1.00", 5933 "N1.00", 5934 "NA1.00", 5935 "NAf1.00", 5936 "NG1.00", 5937 "NI1.00", 5938 "NK1.00", 5939 "NL1.00", 5940 "NO1.00", 5941 "NP1.00", 5942 "NT1.00", 5943 "Namibian Dolla1.00", 5944 "Nepalese Rupe1.00", 5945 "Netherlands Antillean Guilde1.00", 5946 "Dutch Guilde1.00", 5947 "Israeli New Sheqe1.00", 5948 "New Zealand Dolla1.00", 5949 "Nicaraguan C\\u00f3rdoba (1988\\u201319911.00", 5950 "Nicaraguan C\\u00f3rdob1.00", 5951 "Nigerian Nair1.00", 5952 "North Korean Wo1.00", 5953 "Norwegian Kron1.00", 5954 "Nr1.00", 5955 "OM1.00", 5956 "Old Mozambican Metica1.00", 5957 "Romanian Leu (1952\\u201320061.00", 5958 "Serbian Dinar (2002\\u201320061.00", 5959 "Sudanese Dinar (1992\\u201320071.00", 5960 "Sudanese Pound (1957\\u201319981.00", 5961 "Turkish Lira (1922\\u201320051.00", 5962 "Omani Ria1.00", 5963 "PA1.00", 5964 "PE1.00", 5965 "PG1.00", 5966 "PH1.00", 5967 "PK1.00", 5968 "PL1.00", 5969 "PT1.00", 5970 "PY1.00", 5971 "Pakistani Rupe1.00", 5972 "Palladiu1.00", 5973 "Panamanian Balbo1.00", 5974 "Papua New Guinean Kin1.00", 5975 "Paraguayan Guaran1.00", 5976 "Peruvian Int1.00", 5977 "Peruvian Sol (1863\\u201319651.00", 5978 "Peruvian Sol Nuev1.00", 5979 "Philippine Pes1.00", 5980 "Platinu1.00", 5981 "Polish Zlot1.00", 5982 "Polish Zloty (1950\\u201319951.00", 5983 "Portuguese Escud1.00", 5984 "Portuguese Guinea Escud1.00", 5985 "Pr1.00", 5986 "QA1.00", 5987 "Qatari Ria1.00", 5988 "RD1.00", 5989 "RH1.00", 5990 "RINET Fund1.00", 5991 "RS1.00", 5992 "RU1.00", 5993 "RW1.00", 5994 "Rb1.00", 5995 "Rhodesian Dolla1.00", 5996 "Romanian Le1.00", 5997 "Russian Rubl1.00", 5998 "Russian Ruble (1991\\u201319981.00", 5999 "Rwandan Fran1.00", 6000 "S1.00", 6001 "SA1.00", 6002 "SB1.00", 6003 "SC1.00", 6004 "SD1.00", 6005 "SE1.00", 6006 "SG1.00", 6007 "SH1.00", 6008 "SI1.00", 6009 "SK1.00", 6010 "SL R1.00", 6011 "SL1.00", 6012 "SO1.00", 6013 "ST1.00", 6014 "SU1.00", 6015 "SV1.00", 6016 "SY1.00", 6017 "SZ1.00", 6018 "St. Helena Poun1.00", 6019 "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobr1.00", 6020 "Saudi Riya1.00", 6021 "Serbian Dina1.00", 6022 "Seychellois Rupe1.00", 6023 "Sh1.00", 6024 "Sierra Leonean Leon1.00", 6025 "Silve1.00", 6026 "Singapore Dolla1.00", 6027 "Slovak Korun1.00", 6028 "Slovenian Tola1.00", 6029 "Solomon Islands Dolla1.00", 6030 "Somali Shillin1.00", 6031 "South African Ran1.00", 6032 "South African Rand (financial1.00", 6033 "South Korean Wo1.00", 6034 "Soviet Roubl1.00", 6035 "Spanish Peset1.00", 6036 "Spanish Peseta (A account1.00", 6037 "Spanish Peseta (convertible account1.00", 6038 "Special Drawing Right1.00", 6039 "Sri Lankan Rupe1.00", 6040 "Sudanese Poun1.00", 6041 "Surinamese Dolla1.00", 6042 "Surinamese Guilde1.00", 6043 "Swazi Lilangen1.00", 6044 "Swedish Kron1.00", 6045 "Swiss Fran1.00", 6046 "Syrian Poun1.00", 6047 "T S1.00", 6048 "TH1.00", 6049 "TJ1.00", 6050 "TM1.00", 6051 "TN1.00", 6052 "TO1.00", 6053 "TP1.00", 6054 "TR1.00", 6055 "TT1.00", 6056 "TW1.00", 6057 "TZ1.00", 6058 "New Taiwan Dolla1.00", 6059 "Tajikistani Rubl1.00", 6060 "Tajikistani Somon1.00", 6061 "Tanzanian Shillin1.00", 6062 "Testing Currency Cod1.00", 6063 "Thai Bah1.00", 6064 "Timorese Escud1.00", 6065 "Tongan Pa\\u20bbang1.00", 6066 "Trinidad & Tobago Dolla1.00", 6067 "Tunisian Dina1.00", 6068 "Turkish Lir1.00", 6069 "Turkmenistani Mana1.00", 6070 "U S1.00", 6071 "U1.00", 6072 "UA1.00", 6073 "UG1.00", 6074 "US Dolla1.00", 6075 "US Dollar (Next day1.00", 6076 "US Dollar (Same day1.00", 6077 "US1.00", 6078 "UY1.00", 6079 "UZ1.00", 6080 "Ugandan Shillin1.00", 6081 "Ugandan Shilling (1966\\u201319871.00", 6082 "Ukrainian Hryvni1.00", 6083 "Ukrainian Karbovanet1.00", 6084 "Colombian Real Value Uni1.00", 6085 "United Arab Emirates Dirha1.00", 6086 "Unknown Currenc1.00", 6087 "Ur1.00", 6088 "Uruguay Peso (1975\\u201319931.00", 6089 "Uruguay Peso Uruguay1.00", 6090 "Uruguay Peso (Indexed Units1.00", 6091 "Uzbekistani So1.00", 6092 "V1.00", 6093 "VE1.00", 6094 "VN1.00", 6095 "VU1.00", 6096 "Vanuatu Vat1.00", 6097 "Venezuelan Bol\\u00edva1.00", 6098 "Venezuelan Bol\\u00edvar Fuert1.00", 6099 "Vietnamese Don1.00", 6100 "West African CFA Fran1.00", 6101 "Central African CFA Fran1.00", 6102 "WIR Eur1.00", 6103 "WIR Fran1.00", 6104 "WS1.00", 6105 "Samoa Tal1.00", 6106 "XA1.00", 6107 "XB1.00", 6108 "XC1.00", 6109 "XD1.00", 6110 "XE1.00", 6111 "XF1.00", 6112 "XO1.00", 6113 "XP1.00", 6114 "XR1.00", 6115 "XT1.00", 6116 "XX1.00", 6117 "YD1.00", 6118 "YE1.00", 6119 "YU1.00", 6120 "Yemeni Dina1.00", 6121 "Yemeni Ria1.00", 6122 "Yugoslavian Convertible Dina1.00", 6123 "Yugoslavian Hard Dinar (1966\\u201319901.00", 6124 "Yugoslavian New Dina1.00", 6125 "Z1.00", 6126 "ZA1.00", 6127 "ZM1.00", 6128 "ZR1.00", 6129 "ZW1.00", 6130 "Zairean New Zaire (1993\\u201319981.00", 6131 "Zairean Zair1.00", 6132 "Zambian Kwach1.00", 6133 "Zimbabwean Dollar (1980\\u201320081.00", 6134 "dra1.00", 6135 "lar1.00", 6136 "le1.00", 6137 "man1.00", 6138 "so1.00", 6139 }; 6140 6141 Locale locale("en_US"); 6142 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { 6143 UnicodeString formatted = ctou(DATA[i]); 6144 UErrorCode status = U_ZERO_ERROR; 6145 NumberFormat* numFmt = NumberFormat::createInstance(locale, UNUM_CURRENCY, status); 6146 if (numFmt != NULL && U_SUCCESS(status)) { 6147 ParsePosition parsePos; 6148 LocalPointer<CurrencyAmount> currAmt(numFmt->parseCurrency(formatted, parsePos)); 6149 if (parsePos.getIndex() > 0) { 6150 double doubleVal = currAmt->getNumber().getDouble(status); 6151 if ( doubleVal != 1.0 ) { 6152 errln("Parsed as currency value other than 1.0: " + formatted + " -> " + doubleVal); 6153 } 6154 } else { 6155 errln("Failed to parse as currency: " + formatted); 6156 } 6157 } else { 6158 dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); 6159 delete numFmt; 6160 break; 6161 } 6162 delete numFmt; 6163 } 6164 6165 for (uint32_t i=0; i<sizeof(WRONG_DATA)/sizeof(WRONG_DATA[0]); ++i) { 6166 UnicodeString formatted = ctou(WRONG_DATA[i]); 6167 UErrorCode status = U_ZERO_ERROR; 6168 NumberFormat* numFmt = NumberFormat::createInstance(locale, UNUM_CURRENCY, status); 6169 if (numFmt != NULL && U_SUCCESS(status)) { 6170 ParsePosition parsePos; 6171 LocalPointer<CurrencyAmount> currAmt(numFmt->parseCurrency(formatted, parsePos)); 6172 if (parsePos.getIndex() > 0) { 6173 double doubleVal = currAmt->getNumber().getDouble(status); 6174 errln("Parsed as currency, should not have: " + formatted + " -> " + doubleVal); 6175 } 6176 } else { 6177 dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); 6178 delete numFmt; 6179 break; 6180 } 6181 delete numFmt; 6182 } 6183 } 6184 6185 const char* attrString(int32_t); 6186 6187 // UnicodeString s; 6188 // std::string ss; 6189 // std::cout << s.toUTF8String(ss) 6190 void NumberFormatTest::expectPositions(FieldPositionIterator& iter, int32_t *values, int32_t tupleCount, 6191 const UnicodeString& str) { 6192 UBool found[10]; 6193 FieldPosition fp; 6194 6195 if (tupleCount > 10) { 6196 assertTrue("internal error, tupleCount too large", FALSE); 6197 } else { 6198 for (int i = 0; i < tupleCount; ++i) { 6199 found[i] = FALSE; 6200 } 6201 } 6202 6203 logln(str); 6204 while (iter.next(fp)) { 6205 UBool ok = FALSE; 6206 int32_t id = fp.getField(); 6207 int32_t start = fp.getBeginIndex(); 6208 int32_t limit = fp.getEndIndex(); 6209 6210 // is there a logln using printf? 6211 char buf[128]; 6212 sprintf(buf, "%24s %3d %3d %3d", attrString(id), id, start, limit); 6213 logln(buf); 6214 6215 for (int i = 0; i < tupleCount; ++i) { 6216 if (found[i]) { 6217 continue; 6218 } 6219 if (values[i*3] == id && 6220 values[i*3+1] == start && 6221 values[i*3+2] == limit) { 6222 found[i] = ok = TRUE; 6223 break; 6224 } 6225 } 6226 6227 assertTrue((UnicodeString)"found [" + id + "," + start + "," + limit + "]", ok); 6228 } 6229 6230 // check that all were found 6231 UBool ok = TRUE; 6232 for (int i = 0; i < tupleCount; ++i) { 6233 if (!found[i]) { 6234 ok = FALSE; 6235 assertTrue((UnicodeString) "missing [" + values[i*3] + "," + values[i*3+1] + "," + values[i*3+2] + "]", found[i]); 6236 } 6237 } 6238 assertTrue("no expected values were missing", ok); 6239 } 6240 6241 void NumberFormatTest::expectPosition(FieldPosition& pos, int32_t id, int32_t start, int32_t limit, 6242 const UnicodeString& str) { 6243 logln(str); 6244 assertTrue((UnicodeString)"id " + id + " == " + pos.getField(), id == pos.getField()); 6245 assertTrue((UnicodeString)"begin " + start + " == " + pos.getBeginIndex(), start == pos.getBeginIndex()); 6246 assertTrue((UnicodeString)"end " + limit + " == " + pos.getEndIndex(), limit == pos.getEndIndex()); 6247 } 6248 6249 void NumberFormatTest::TestFieldPositionIterator() { 6250 // bug 7372 6251 UErrorCode status = U_ZERO_ERROR; 6252 FieldPositionIterator iter1; 6253 FieldPositionIterator iter2; 6254 FieldPosition pos; 6255 6256 DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(status); 6257 if (failure(status, "NumberFormat::createInstance", TRUE)) return; 6258 6259 double num = 1234.56; 6260 UnicodeString str1; 6261 UnicodeString str2; 6262 6263 assertTrue((UnicodeString)"self==", iter1 == iter1); 6264 assertTrue((UnicodeString)"iter1==iter2", iter1 == iter2); 6265 6266 decFmt->format(num, str1, &iter1, status); 6267 assertTrue((UnicodeString)"iter1 != iter2", iter1 != iter2); 6268 decFmt->format(num, str2, &iter2, status); 6269 assertTrue((UnicodeString)"iter1 == iter2 (2)", iter1 == iter2); 6270 iter1.next(pos); 6271 assertTrue((UnicodeString)"iter1 != iter2 (2)", iter1 != iter2); 6272 iter2.next(pos); 6273 assertTrue((UnicodeString)"iter1 == iter2 (3)", iter1 == iter2); 6274 6275 // should format ok with no iterator 6276 str2.remove(); 6277 decFmt->format(num, str2, NULL, status); 6278 assertEquals("null fpiter", str1, str2); 6279 6280 delete decFmt; 6281 } 6282 6283 void NumberFormatTest::TestFormatAttributes() { 6284 Locale locale("en_US"); 6285 UErrorCode status = U_ZERO_ERROR; 6286 DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, UNUM_CURRENCY, status); 6287 if (failure(status, "NumberFormat::createInstance", TRUE)) return; 6288 double val = 12345.67; 6289 6290 { 6291 int32_t expected[] = { 6292 UNUM_CURRENCY_FIELD, 0, 1, 6293 UNUM_GROUPING_SEPARATOR_FIELD, 3, 4, 6294 UNUM_INTEGER_FIELD, 1, 7, 6295 UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8, 6296 UNUM_FRACTION_FIELD, 8, 10, 6297 }; 6298 int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); 6299 6300 FieldPositionIterator posIter; 6301 UnicodeString result; 6302 decFmt->format(val, result, &posIter, status); 6303 expectPositions(posIter, expected, tupleCount, result); 6304 } 6305 { 6306 FieldPosition fp(UNUM_INTEGER_FIELD); 6307 UnicodeString result; 6308 decFmt->format(val, result, fp); 6309 expectPosition(fp, UNUM_INTEGER_FIELD, 1, 7, result); 6310 } 6311 { 6312 FieldPosition fp(UNUM_FRACTION_FIELD); 6313 UnicodeString result; 6314 decFmt->format(val, result, fp); 6315 expectPosition(fp, UNUM_FRACTION_FIELD, 8, 10, result); 6316 } 6317 delete decFmt; 6318 6319 decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, UNUM_SCIENTIFIC, status); 6320 val = -0.0000123; 6321 { 6322 int32_t expected[] = { 6323 UNUM_SIGN_FIELD, 0, 1, 6324 UNUM_INTEGER_FIELD, 1, 2, 6325 UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3, 6326 UNUM_FRACTION_FIELD, 3, 5, 6327 UNUM_EXPONENT_SYMBOL_FIELD, 5, 6, 6328 UNUM_EXPONENT_SIGN_FIELD, 6, 7, 6329 UNUM_EXPONENT_FIELD, 7, 8 6330 }; 6331 int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); 6332 6333 FieldPositionIterator posIter; 6334 UnicodeString result; 6335 decFmt->format(val, result, &posIter, status); 6336 expectPositions(posIter, expected, tupleCount, result); 6337 } 6338 { 6339 FieldPosition fp(UNUM_INTEGER_FIELD); 6340 UnicodeString result; 6341 decFmt->format(val, result, fp); 6342 expectPosition(fp, UNUM_INTEGER_FIELD, 1, 2, result); 6343 } 6344 { 6345 FieldPosition fp(UNUM_FRACTION_FIELD); 6346 UnicodeString result; 6347 decFmt->format(val, result, fp); 6348 expectPosition(fp, UNUM_FRACTION_FIELD, 3, 5, result); 6349 } 6350 delete decFmt; 6351 6352 fflush(stderr); 6353 } 6354 6355 const char* attrString(int32_t attrId) { 6356 switch (attrId) { 6357 case UNUM_INTEGER_FIELD: return "integer"; 6358 case UNUM_FRACTION_FIELD: return "fraction"; 6359 case UNUM_DECIMAL_SEPARATOR_FIELD: return "decimal separator"; 6360 case UNUM_EXPONENT_SYMBOL_FIELD: return "exponent symbol"; 6361 case UNUM_EXPONENT_SIGN_FIELD: return "exponent sign"; 6362 case UNUM_EXPONENT_FIELD: return "exponent"; 6363 case UNUM_GROUPING_SEPARATOR_FIELD: return "grouping separator"; 6364 case UNUM_CURRENCY_FIELD: return "currency"; 6365 case UNUM_PERCENT_FIELD: return "percent"; 6366 case UNUM_PERMILL_FIELD: return "permille"; 6367 case UNUM_SIGN_FIELD: return "sign"; 6368 default: return ""; 6369 } 6370 } 6371 6372 // 6373 // Test formatting & parsing of big decimals. 6374 // API test, not a comprehensive test. 6375 // See DecimalFormatTest/DataDrivenTests 6376 // 6377 #define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) errln("file %s, line %d: status: %s", \ 6378 __FILE__, __LINE__, u_errorName(status));} 6379 #define ASSERT_EQUALS(expected, actual) {if ((expected) != (actual)) \ 6380 errln("file %s, line %d: %s != %s", __FILE__, __LINE__, #expected, #actual);} 6381 6382 static UBool operator != (const char *s1, UnicodeString &s2) { 6383 // This function lets ASSERT_EQUALS("literal", UnicodeString) work. 6384 UnicodeString us1(s1); 6385 return us1 != s2; 6386 } 6387 6388 void NumberFormatTest::TestDecimal() { 6389 { 6390 UErrorCode status = U_ZERO_ERROR; 6391 Formattable f("12.345678999987654321E666", status); 6392 ASSERT_SUCCESS(status); 6393 StringPiece s = f.getDecimalNumber(status); 6394 ASSERT_SUCCESS(status); 6395 ASSERT_EQUALS("1.2345678999987654321E+667", s); 6396 //printf("%s\n", s.data()); 6397 } 6398 6399 { 6400 UErrorCode status = U_ZERO_ERROR; 6401 Formattable f1("this is not a number", status); 6402 ASSERT_EQUALS(U_DECIMAL_NUMBER_SYNTAX_ERROR, status); 6403 } 6404 6405 { 6406 UErrorCode status = U_ZERO_ERROR; 6407 Formattable f; 6408 f.setDecimalNumber("123.45", status); 6409 ASSERT_SUCCESS(status); 6410 ASSERT_EQUALS( Formattable::kDouble, f.getType()); 6411 ASSERT_EQUALS(123.45, f.getDouble()); 6412 ASSERT_EQUALS(123.45, f.getDouble(status)); 6413 ASSERT_SUCCESS(status); 6414 ASSERT_EQUALS("123.45", f.getDecimalNumber(status)); 6415 ASSERT_SUCCESS(status); 6416 6417 f.setDecimalNumber("4.5678E7", status); 6418 int32_t n; 6419 n = f.getLong(); 6420 ASSERT_EQUALS(45678000, n); 6421 6422 status = U_ZERO_ERROR; 6423 f.setDecimalNumber("-123", status); 6424 ASSERT_SUCCESS(status); 6425 ASSERT_EQUALS( Formattable::kLong, f.getType()); 6426 ASSERT_EQUALS(-123, f.getLong()); 6427 ASSERT_EQUALS(-123, f.getLong(status)); 6428 ASSERT_SUCCESS(status); 6429 ASSERT_EQUALS("-123", f.getDecimalNumber(status)); 6430 ASSERT_SUCCESS(status); 6431 6432 status = U_ZERO_ERROR; 6433 f.setDecimalNumber("1234567890123", status); // Number too big for 32 bits 6434 ASSERT_SUCCESS(status); 6435 ASSERT_EQUALS( Formattable::kInt64, f.getType()); 6436 ASSERT_EQUALS(1234567890123LL, f.getInt64()); 6437 ASSERT_EQUALS(1234567890123LL, f.getInt64(status)); 6438 ASSERT_SUCCESS(status); 6439 ASSERT_EQUALS("1234567890123", f.getDecimalNumber(status)); 6440 ASSERT_SUCCESS(status); 6441 } 6442 6443 { 6444 UErrorCode status = U_ZERO_ERROR; 6445 NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status); 6446 if (U_FAILURE(status) || fmtr == NULL) { 6447 dataerrln("Unable to create NumberFormat"); 6448 } else { 6449 UnicodeString formattedResult; 6450 StringPiece num("244444444444444444444444444444444444446.4"); 6451 fmtr->format(num, formattedResult, NULL, status); 6452 ASSERT_SUCCESS(status); 6453 ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); 6454 //std::string ss; std::cout << formattedResult.toUTF8String(ss); 6455 delete fmtr; 6456 } 6457 } 6458 6459 { 6460 // Check formatting a DigitList. DigitList is internal, but this is 6461 // a critical interface that must work. 6462 UErrorCode status = U_ZERO_ERROR; 6463 NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status); 6464 if (U_FAILURE(status) || fmtr == NULL) { 6465 dataerrln("Unable to create NumberFormat"); 6466 } else { 6467 UnicodeString formattedResult; 6468 DigitList dl; 6469 StringPiece num("123.4566666666666666666666666666666666621E+40"); 6470 dl.set(num, status); 6471 ASSERT_SUCCESS(status); 6472 fmtr->format(dl, formattedResult, NULL, status); 6473 ASSERT_SUCCESS(status); 6474 ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); 6475 6476 status = U_ZERO_ERROR; 6477 num.set("666.666"); 6478 dl.set(num, status); 6479 FieldPosition pos(NumberFormat::FRACTION_FIELD); 6480 ASSERT_SUCCESS(status); 6481 formattedResult.remove(); 6482 fmtr->format(dl, formattedResult, pos, status); 6483 ASSERT_SUCCESS(status); 6484 ASSERT_EQUALS("666.666", formattedResult); 6485 ASSERT_EQUALS(4, pos.getBeginIndex()); 6486 ASSERT_EQUALS(7, pos.getEndIndex()); 6487 delete fmtr; 6488 } 6489 } 6490 6491 { 6492 // Check a parse with a formatter with a multiplier. 6493 UErrorCode status = U_ZERO_ERROR; 6494 NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_PERCENT, status); 6495 if (U_FAILURE(status) || fmtr == NULL) { 6496 dataerrln("Unable to create NumberFormat"); 6497 } else { 6498 UnicodeString input = "1.84%"; 6499 Formattable result; 6500 fmtr->parse(input, result, status); 6501 ASSERT_SUCCESS(status); 6502 ASSERT_EQUALS(0, strcmp("0.0184", result.getDecimalNumber(status).data())); 6503 //std::cout << result.getDecimalNumber(status).data(); 6504 delete fmtr; 6505 } 6506 } 6507 6508 #if U_PLATFORM != U_PF_CYGWIN || defined(CYGWINMSVC) 6509 /* 6510 * This test fails on Cygwin (1.7.16) using GCC because of a rounding issue with strtod(). 6511 * See #9463 6512 */ 6513 { 6514 // Check that a parse returns a decimal number with full accuracy 6515 UErrorCode status = U_ZERO_ERROR; 6516 NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status); 6517 if (U_FAILURE(status) || fmtr == NULL) { 6518 dataerrln("Unable to create NumberFormat"); 6519 } else { 6520 UnicodeString input = "1.002200044400088880000070000"; 6521 Formattable result; 6522 fmtr->parse(input, result, status); 6523 ASSERT_SUCCESS(status); 6524 ASSERT_EQUALS(0, strcmp("1.00220004440008888000007", result.getDecimalNumber(status).data())); 6525 ASSERT_EQUALS(1.00220004440008888, result.getDouble()); 6526 //std::cout << result.getDecimalNumber(status).data(); 6527 delete fmtr; 6528 } 6529 } 6530 #endif 6531 6532 } 6533 6534 void NumberFormatTest::TestCurrencyFractionDigits() { 6535 UErrorCode status = U_ZERO_ERROR; 6536 UnicodeString text1, text2; 6537 double value = 99.12345; 6538 6539 // Create currenct instance 6540 NumberFormat* fmt = NumberFormat::createCurrencyInstance("ja_JP", status); 6541 if (U_FAILURE(status) || fmt == NULL) { 6542 dataerrln("Unable to create NumberFormat"); 6543 } else { 6544 fmt->format(value, text1); 6545 6546 // Reset the same currency and format the test value again 6547 fmt->setCurrency(fmt->getCurrency(), status); 6548 ASSERT_SUCCESS(status); 6549 fmt->format(value, text2); 6550 6551 if (text1 != text2) { 6552 errln((UnicodeString)"NumberFormat::format() should return the same result - text1=" 6553 + text1 + " text2=" + text2); 6554 } 6555 delete fmt; 6556 } 6557 } 6558 6559 void NumberFormatTest::TestExponentParse() { 6560 6561 UErrorCode status = U_ZERO_ERROR; 6562 Formattable result; 6563 ParsePosition parsePos(0); 6564 6565 // set the exponent symbol 6566 status = U_ZERO_ERROR; 6567 DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(), status); 6568 if(U_FAILURE(status)) { 6569 dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Default)"); 6570 return; 6571 } 6572 6573 // create format instance 6574 status = U_ZERO_ERROR; 6575 DecimalFormat fmt("#####", symbols, status); 6576 if(U_FAILURE(status)) { 6577 errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, symbols*)"); 6578 } 6579 6580 // parse the text 6581 fmt.parse("5.06e-27", result, parsePos); 6582 if(result.getType() != Formattable::kDouble && 6583 result.getDouble() != 5.06E-27 && 6584 parsePos.getIndex() != 8 6585 ) 6586 { 6587 errln("ERROR: parse failed - expected 5.06E-27, 8 - returned %d, %i", 6588 result.getDouble(), parsePos.getIndex()); 6589 } 6590 } 6591 6592 void NumberFormatTest::TestExplicitParents() { 6593 6594 /* Test that number formats are properly inherited from es_419 */ 6595 /* These could be subject to change if the CLDR data changes */ 6596 static const char* parentLocaleTests[][2]= { 6597 /* locale ID */ /* expected */ 6598 {"es_CO", "1.250,75" }, 6599 {"es_CR", "1.250,75" }, 6600 {"es_ES", "1.250,75" }, 6601 {"es_GQ", "1.250,75" }, 6602 {"es_MX", "1,250.75" }, 6603 {"es_US", "1,250.75" }, 6604 {"es_VE", "1.250,75" }, 6605 }; 6606 6607 UnicodeString s; 6608 6609 for(int i=0; i < (int)(sizeof(parentLocaleTests)/sizeof(parentLocaleTests[i])); i++){ 6610 UErrorCode status = U_ZERO_ERROR; 6611 const char *localeID = parentLocaleTests[i][0]; 6612 UnicodeString expected(parentLocaleTests[i][1], -1, US_INV); 6613 expected = expected.unescape(); 6614 char loc[256]={0}; 6615 uloc_canonicalize(localeID, loc, 256, &status); 6616 NumberFormat *fmt= NumberFormat::createInstance(Locale(loc), status); 6617 if(U_FAILURE(status)){ 6618 dataerrln("Could not create number formatter for locale %s - %s",localeID, u_errorName(status)); 6619 continue; 6620 } 6621 s.remove(); 6622 fmt->format(1250.75, s); 6623 if(s!=expected){ 6624 errln(UnicodeString("FAIL: Expected: ")+expected 6625 + UnicodeString(" Got: ") + s 6626 + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); 6627 } 6628 if (U_FAILURE(status)){ 6629 errln((UnicodeString)"FAIL: Status " + (int32_t)status); 6630 } 6631 delete fmt; 6632 } 6633 6634 } 6635 6636 /** 6637 * Test available numbering systems API. 6638 */ 6639 void NumberFormatTest::TestAvailableNumberingSystems() { 6640 UErrorCode status = U_ZERO_ERROR; 6641 StringEnumeration *availableNumberingSystems = NumberingSystem::getAvailableNames(status); 6642 CHECK_DATA(status, "NumberingSystem::getAvailableNames()") 6643 6644 int32_t nsCount = availableNumberingSystems->count(status); 6645 if ( nsCount < 36 ) { 6646 errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 36, got %d",nsCount); 6647 } 6648 6649 /* A relatively simple test of the API. We call getAvailableNames() and cycle through */ 6650 /* each name returned, attempting to create a numbering system based on that name and */ 6651 /* verifying that the name returned from the resulting numbering system is the same */ 6652 /* one that we initially thought. */ 6653 6654 int32_t len; 6655 for ( int32_t i = 0 ; i < nsCount ; i++ ) { 6656 const char *nsname = availableNumberingSystems->next(&len,status); 6657 NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status); 6658 if ( uprv_strcmp(nsname,ns->getName()) ) { 6659 errln("FAIL: Numbering system name didn't match for name = %s\n",nsname); 6660 } 6661 6662 delete ns; 6663 } 6664 6665 delete availableNumberingSystems; 6666 } 6667 6668 void 6669 NumberFormatTest::Test9087(void) 6670 { 6671 U_STRING_DECL(pattern,"#",1); 6672 U_STRING_INIT(pattern,"#",1); 6673 6674 U_STRING_DECL(infstr,"INF",3); 6675 U_STRING_INIT(infstr,"INF",3); 6676 6677 U_STRING_DECL(nanstr,"NAN",3); 6678 U_STRING_INIT(nanstr,"NAN",3); 6679 6680 UChar outputbuf[50] = {0}; 6681 UErrorCode status = U_ZERO_ERROR; 6682 UNumberFormat* fmt = unum_open(UNUM_PATTERN_DECIMAL,pattern,1,NULL,NULL,&status); 6683 if ( U_FAILURE(status) ) { 6684 dataerrln("FAIL: error in unum_open() - %s", u_errorName(status)); 6685 return; 6686 } 6687 6688 unum_setSymbol(fmt,UNUM_INFINITY_SYMBOL,infstr,3,&status); 6689 unum_setSymbol(fmt,UNUM_NAN_SYMBOL,nanstr,3,&status); 6690 if ( U_FAILURE(status) ) { 6691 errln("FAIL: error setting symbols"); 6692 } 6693 6694 double inf = uprv_getInfinity(); 6695 6696 unum_setAttribute(fmt,UNUM_ROUNDING_MODE,UNUM_ROUND_HALFEVEN); 6697 unum_setDoubleAttribute(fmt,UNUM_ROUNDING_INCREMENT,0); 6698 6699 UFieldPosition position = { 0, 0, 0}; 6700 unum_formatDouble(fmt,inf,outputbuf,50,&position,&status); 6701 6702 if ( u_strcmp(infstr, outputbuf)) { 6703 errln((UnicodeString)"FAIL: unexpected result for infinity - expected " + infstr + " got " + outputbuf); 6704 } 6705 6706 unum_close(fmt); 6707 } 6708 6709 #include "dcfmtimp.h" 6710 6711 void NumberFormatTest::TestFormatFastpaths() { 6712 #if UCONFIG_FORMAT_FASTPATHS_49 6713 logln("Sizeof DecimalFormat = %d, Sizeof DecimalFormatInternal=%d, UNUM_DECIMALFORMAT_INTERNAL_SIZE=%d\n", 6714 sizeof(DecimalFormat), sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE); 6715 if(UNUM_DECIMALFORMAT_INTERNAL_SIZE < sizeof(DecimalFormatInternal)) { 6716 errln("Error: sizeof(DecimalFormatInternal)=%d but UNUM_DECIMALFORMAT_INTERNAL_SIZE is only %d. Increase the #define?\n", sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE); 6717 } else if(UNUM_DECIMALFORMAT_INTERNAL_SIZE > (sizeof(DecimalFormatInternal)+16)) { 6718 infoln("Note: sizeof(DecimalFormatInternal)=%d but UNUM_DECIMALFORMAT_INTERNAL_SIZE is %d. Decrease the #define? sizeof(DecimalFormat)=%d\n", sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE, sizeof(DecimalFormat)); 6719 } 6720 #else 6721 infoln("NOTE: UCONFIG_FORMAT_FASTPATHS not set, test skipped."); 6722 #endif 6723 6724 // get some additional case 6725 { 6726 UErrorCode status=U_ZERO_ERROR; 6727 DecimalFormat df(UnicodeString("0000",""),status); 6728 int64_t long_number = 1; 6729 UnicodeString expect = "0001"; 6730 UnicodeString result; 6731 FieldPosition pos; 6732 df.format(long_number, result, pos); 6733 if(U_FAILURE(status)||expect!=result) { 6734 errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")); 6735 } else { 6736 logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")); 6737 } 6738 } 6739 { 6740 UErrorCode status=U_ZERO_ERROR; 6741 DecimalFormat df(UnicodeString("0000000000000000000",""),status); 6742 int64_t long_number = U_INT64_MIN; // -9223372036854775808L; 6743 // uint8_t bits[8]; 6744 // memcpy(bits,&long_number,8); 6745 // for(int i=0;i<8;i++) { 6746 // logln("bits: %02X", (unsigned int)bits[i]); 6747 // } 6748 UnicodeString expect = "-9223372036854775808"; 6749 UnicodeString result; 6750 FieldPosition pos; 6751 df.format(long_number, result, pos); 6752 if(U_FAILURE(status)||expect!=result) { 6753 errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808"); 6754 } else { 6755 logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808"); 6756 } 6757 } 6758 { 6759 UErrorCode status=U_ZERO_ERROR; 6760 DecimalFormat df(UnicodeString("0000000000000000000",""),status); 6761 int64_t long_number = U_INT64_MAX; // -9223372036854775808L; 6762 // uint8_t bits[8]; 6763 // memcpy(bits,&long_number,8); 6764 // for(int i=0;i<8;i++) { 6765 // logln("bits: %02X", (unsigned int)bits[i]); 6766 // } 6767 UnicodeString expect = "9223372036854775807"; 6768 UnicodeString result; 6769 FieldPosition pos; 6770 df.format(long_number, result, pos); 6771 if(U_FAILURE(status)||expect!=result) { 6772 errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX"); 6773 } else { 6774 logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX"); 6775 } 6776 } 6777 { 6778 UErrorCode status=U_ZERO_ERROR; 6779 DecimalFormat df(UnicodeString("0000000000000000000",""),status); 6780 int64_t long_number = 0; 6781 // uint8_t bits[8]; 6782 // memcpy(bits,&long_number,8); 6783 // for(int i=0;i<8;i++) { 6784 // logln("bits: %02X", (unsigned int)bits[i]); 6785 // } 6786 UnicodeString expect = "0000000000000000000"; 6787 UnicodeString result; 6788 FieldPosition pos; 6789 df.format(long_number, result, pos); 6790 if(U_FAILURE(status)||expect!=result) { 6791 errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0"); 6792 } else { 6793 logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0"); 6794 } 6795 } 6796 { 6797 UErrorCode status=U_ZERO_ERROR; 6798 DecimalFormat df(UnicodeString("0000000000000000000",""),status); 6799 int64_t long_number = U_INT64_MIN + 1; 6800 UnicodeString expect = "-9223372036854775807"; 6801 UnicodeString result; 6802 FieldPosition pos; 6803 df.format(long_number, result, pos); 6804 if(U_FAILURE(status)||expect!=result) { 6805 errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807"); 6806 } else { 6807 logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807"); 6808 } 6809 } 6810 } 6811 6812 6813 void NumberFormatTest::TestFormattableSize(void) { 6814 if(sizeof(FmtStackData) > UNUM_INTERNAL_STACKARRAY_SIZE) { 6815 errln("Error: sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n", 6816 sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE); 6817 } else if(sizeof(FmtStackData) < UNUM_INTERNAL_STACKARRAY_SIZE) { 6818 logln("Warning: sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n", 6819 sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE); 6820 } else { 6821 logln("sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n", 6822 sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE); 6823 } 6824 } 6825 6826 UBool NumberFormatTest::testFormattableAsUFormattable(const char *file, int line, Formattable &f) { 6827 UnicodeString fileLine = UnicodeString(file)+UnicodeString(":")+line+UnicodeString(": "); 6828 6829 UFormattable *u = f.toUFormattable(); 6830 logln(); 6831 if (u == NULL) { 6832 errln("%s:%d: Error: f.toUFormattable() retuned NULL."); 6833 return FALSE; 6834 } 6835 logln("%s:%d: comparing Formattable with UFormattable", file, line); 6836 logln(fileLine + toString(f)); 6837 6838 UErrorCode status = U_ZERO_ERROR; 6839 UErrorCode valueStatus = U_ZERO_ERROR; 6840 UFormattableType expectUType = UFMT_COUNT; // invalid 6841 6842 UBool triedExact = FALSE; // did we attempt an exact comparison? 6843 UBool exactMatch = FALSE; // was the exact comparison true? 6844 6845 switch( f.getType() ) { 6846 case Formattable::kDate: 6847 expectUType = UFMT_DATE; 6848 exactMatch = (f.getDate()==ufmt_getDate(u, &valueStatus)); 6849 triedExact = TRUE; 6850 break; 6851 case Formattable::kDouble: 6852 expectUType = UFMT_DOUBLE; 6853 exactMatch = (f.getDouble()==ufmt_getDouble(u, &valueStatus)); 6854 triedExact = TRUE; 6855 break; 6856 case Formattable::kLong: 6857 expectUType = UFMT_LONG; 6858 exactMatch = (f.getLong()==ufmt_getLong(u, &valueStatus)); 6859 triedExact = TRUE; 6860 break; 6861 case Formattable::kString: 6862 expectUType = UFMT_STRING; 6863 { 6864 UnicodeString str; 6865 f.getString(str); 6866 int32_t len; 6867 const UChar* uch = ufmt_getUChars(u, &len, &valueStatus); 6868 if(U_SUCCESS(valueStatus)) { 6869 UnicodeString str2(uch, len); 6870 assertTrue("UChar* NULL-terminated", uch[len]==0); 6871 exactMatch = (str == str2); 6872 } 6873 triedExact = TRUE; 6874 } 6875 break; 6876 case Formattable::kArray: 6877 expectUType = UFMT_ARRAY; 6878 triedExact = TRUE; 6879 { 6880 int32_t count = ufmt_getArrayLength(u, &valueStatus); 6881 int32_t count2; 6882 const Formattable *array2 = f.getArray(count2); 6883 exactMatch = assertEquals(fileLine + " array count", count, count2); 6884 6885 if(exactMatch) { 6886 for(int i=0;U_SUCCESS(valueStatus) && i<count;i++) { 6887 UFormattable *uu = ufmt_getArrayItemByIndex(u, i, &valueStatus); 6888 if(*Formattable::fromUFormattable(uu) != (array2[i])) { 6889 errln("%s:%d: operator== did not match at index[%d] - %p vs %p", file, line, i, 6890 (const void*)Formattable::fromUFormattable(uu), (const void*)&(array2[i])); 6891 exactMatch = FALSE; 6892 } else { 6893 if(!testFormattableAsUFormattable("(sub item)",i,*Formattable::fromUFormattable(uu))) { 6894 exactMatch = FALSE; 6895 } 6896 } 6897 } 6898 } 6899 } 6900 break; 6901 case Formattable::kInt64: 6902 expectUType = UFMT_INT64; 6903 exactMatch = (f.getInt64()==ufmt_getInt64(u, &valueStatus)); 6904 triedExact = TRUE; 6905 break; 6906 case Formattable::kObject: 6907 expectUType = UFMT_OBJECT; 6908 exactMatch = (f.getObject()==ufmt_getObject(u, &valueStatus)); 6909 triedExact = TRUE; 6910 break; 6911 } 6912 UFormattableType uType = ufmt_getType(u, &status); 6913 6914 if(U_FAILURE(status)) { 6915 errln("%s:%d: Error calling ufmt_getType - %s", file, line, u_errorName(status)); 6916 return FALSE; 6917 } 6918 6919 if(uType != expectUType) { 6920 errln("%s:%d: got type (%d) expected (%d) from ufmt_getType", file, line, (int) uType, (int) expectUType); 6921 } 6922 6923 if(triedExact) { 6924 if(U_FAILURE(valueStatus)) { 6925 errln("%s:%d: got err %s trying to ufmt_get...() for exact match check", file, line, u_errorName(valueStatus)); 6926 } else if(!exactMatch) { 6927 errln("%s:%d: failed exact match for the Formattable type", file, line); 6928 } else { 6929 logln("%s:%d: exact match OK", file, line); 6930 } 6931 } else { 6932 logln("%s:%d: note, did not attempt exact match for this formattable type", file, line); 6933 } 6934 6935 if( assertEquals(fileLine + " isNumeric()", f.isNumeric(), ufmt_isNumeric(u)) 6936 && f.isNumeric()) { 6937 UErrorCode convStatus = U_ZERO_ERROR; 6938 6939 if(uType != UFMT_INT64) { // may fail to compare 6940 assertTrue(fileLine + " as doubles ==", f.getDouble(convStatus)==ufmt_getDouble(u, &convStatus)); 6941 } 6942 6943 if( assertSuccess(fileLine + " (numeric conversion status)", convStatus) ) { 6944 StringPiece fDecNum = f.getDecimalNumber(convStatus); 6945 #if 1 6946 int32_t len; 6947 const char *decNumChars = ufmt_getDecNumChars(u, &len, &convStatus); 6948 #else 6949 // copy version 6950 char decNumChars[200]; 6951 int32_t len = ufmt_getDecNumChars(u, decNumChars, 200, &convStatus); 6952 #endif 6953 6954 if( assertSuccess(fileLine + " (decNumbers conversion)", convStatus) ) { 6955 logln(fileLine + decNumChars); 6956 assertEquals(fileLine + " decNumChars length==", len, fDecNum.length()); 6957 assertEquals(fileLine + " decNumChars digits", decNumChars, fDecNum.data()); 6958 } 6959 6960 UErrorCode int64ConversionF = U_ZERO_ERROR; 6961 int64_t l = f.getInt64(int64ConversionF); 6962 UErrorCode int64ConversionU = U_ZERO_ERROR; 6963 int64_t r = ufmt_getInt64(u, &int64ConversionU); 6964 6965 if( (l==r) 6966 && ( uType != UFMT_INT64 ) // int64 better not overflow 6967 && (U_INVALID_FORMAT_ERROR==int64ConversionU) 6968 && (U_INVALID_FORMAT_ERROR==int64ConversionF) ) { 6969 logln("%s:%d: OK: 64 bit overflow", file, line); 6970 } else { 6971 assertEquals(fileLine + " as int64 ==", l, r); 6972 assertSuccess(fileLine + " Formattable.getnt64()", int64ConversionF); 6973 assertSuccess(fileLine + " ufmt_getInt64()", int64ConversionU); 6974 } 6975 } 6976 } 6977 return exactMatch || !triedExact; 6978 } 6979 6980 void NumberFormatTest::TestUFormattable(void) { 6981 { 6982 // test that a default formattable is equal to Formattable() 6983 UErrorCode status = U_ZERO_ERROR; 6984 LocalUFormattablePointer defaultUFormattable(ufmt_open(&status)); 6985 assertSuccess("calling umt_open", status); 6986 Formattable defaultFormattable; 6987 assertTrue((UnicodeString)"comparing ufmt_open() with Formattable()", 6988 (defaultFormattable 6989 == *(Formattable::fromUFormattable(defaultUFormattable.getAlias())))); 6990 assertTrue((UnicodeString)"comparing ufmt_open() with Formattable()", 6991 (defaultFormattable 6992 == *(Formattable::fromUFormattable(defaultUFormattable.getAlias())))); 6993 assertTrue((UnicodeString)"comparing Formattable() round tripped through UFormattable", 6994 (defaultFormattable 6995 == *(Formattable::fromUFormattable(defaultFormattable.toUFormattable())))); 6996 assertTrue((UnicodeString)"comparing &Formattable() round tripped through UFormattable", 6997 ((&defaultFormattable) 6998 == Formattable::fromUFormattable(defaultFormattable.toUFormattable()))); 6999 assertFalse((UnicodeString)"comparing &Formattable() with ufmt_open()", 7000 ((&defaultFormattable) 7001 == Formattable::fromUFormattable(defaultUFormattable.getAlias()))); 7002 testFormattableAsUFormattable(__FILE__, __LINE__, defaultFormattable); 7003 } 7004 // test some random Formattables 7005 { 7006 Formattable f(ucal_getNow(), Formattable::kIsDate); 7007 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7008 } 7009 { 7010 Formattable f((double)1.61803398874989484820); // golden ratio 7011 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7012 } 7013 { 7014 Formattable f((int64_t)80994231587905127LL); // weight of the moon, in kilotons http://solarsystem.nasa.gov/planets/profile.cfm?Display=Facts&Object=Moon 7015 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7016 } 7017 { 7018 Formattable f((int32_t)4); // random number, source: http://www.xkcd.com/221/ 7019 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7020 } 7021 { 7022 Formattable f("Hello world."); // should be invariant? 7023 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7024 } 7025 { 7026 UErrorCode status2 = U_ZERO_ERROR; 7027 Formattable f(StringPiece("73476730924573500000000.0"), status2); // weight of the moon, kg 7028 assertSuccess("Constructing a StringPiece", status2); 7029 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7030 } 7031 { 7032 UErrorCode status2 = U_ZERO_ERROR; 7033 UObject *obj = new Locale(); 7034 Formattable f(obj); 7035 assertSuccess("Constructing a Formattable from a default constructed Locale()", status2); 7036 testFormattableAsUFormattable(__FILE__, __LINE__, f); 7037 } 7038 { 7039 const Formattable array[] = { 7040 Formattable(ucal_getNow(), Formattable::kIsDate), 7041 Formattable((int32_t)4), 7042 Formattable((double)1.234), 7043 }; 7044 7045 Formattable fa(array, 3); 7046 testFormattableAsUFormattable(__FILE__, __LINE__, fa); 7047 } 7048 } 7049 7050 void NumberFormatTest::TestSignificantDigits(void) { 7051 double input[] = { 7052 0, 0, 7053 0.1, -0.1, 7054 123, -123, 7055 12345, -12345, 7056 123.45, -123.45, 7057 123.44501, -123.44501, 7058 0.001234, -0.001234, 7059 0.00000000123, -0.00000000123, 7060 0.0000000000000000000123, -0.0000000000000000000123, 7061 1.2, -1.2, 7062 0.0000000012344501, -0.0000000012344501, 7063 123445.01, -123445.01, 7064 12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0, 7065 }; 7066 const char* expected[] = { 7067 "0.00", "0.00", 7068 "0.100", "-0.100", 7069 "123", "-123", 7070 "12345", "-12345", 7071 "123.45", "-123.45", 7072 "123.45", "-123.45", 7073 "0.001234", "-0.001234", 7074 "0.00000000123", "-0.00000000123", 7075 "0.0000000000000000000123", "-0.0000000000000000000123", 7076 "1.20", "-1.20", 7077 "0.0000000012345", "-0.0000000012345", 7078 "123450", "-123450", 7079 "12345000000000000000000000000000000", "-12345000000000000000000000000000000", 7080 }; 7081 7082 UErrorCode status = U_ZERO_ERROR; 7083 Locale locale("en_US"); 7084 LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>( 7085 NumberFormat::createInstance(locale, status))); 7086 CHECK_DATA(status,"NumberFormat::createInstance") 7087 7088 numberFormat->setSignificantDigitsUsed(TRUE); 7089 numberFormat->setMinimumSignificantDigits(3); 7090 numberFormat->setMaximumSignificantDigits(5); 7091 numberFormat->setGroupingUsed(false); 7092 7093 UnicodeString result; 7094 UnicodeString expectedResult; 7095 for (unsigned int i = 0; i < sizeof(input)/sizeof(double); ++i) { 7096 numberFormat->format(input[i], result); 7097 UnicodeString expectedResult(expected[i]); 7098 if (result != expectedResult) { 7099 errln((UnicodeString)"Expected: '" + expectedResult + "' got '" + result); 7100 } 7101 result.remove(); 7102 } 7103 } 7104 7105 void NumberFormatTest::TestShowZero() { 7106 UErrorCode status = U_ZERO_ERROR; 7107 Locale locale("en_US"); 7108 LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>( 7109 NumberFormat::createInstance(locale, status))); 7110 CHECK_DATA(status, "NumberFormat::createInstance") 7111 7112 numberFormat->setSignificantDigitsUsed(TRUE); 7113 numberFormat->setMaximumSignificantDigits(3); 7114 7115 UnicodeString result; 7116 numberFormat->format(0.0, result); 7117 if (result != "0") { 7118 errln((UnicodeString)"Expected: 0, got " + result); 7119 } 7120 } 7121 7122 void NumberFormatTest::TestBug9936() { 7123 UErrorCode status = U_ZERO_ERROR; 7124 Locale locale("en_US"); 7125 LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>( 7126 NumberFormat::createInstance(locale, status))); 7127 if (U_FAILURE(status)) { 7128 dataerrln("File %s, Line %d: status = %s.\n", __FILE__, __LINE__, u_errorName(status)); 7129 return; 7130 } 7131 7132 if (numberFormat->areSignificantDigitsUsed() == TRUE) { 7133 errln("File %s, Line %d: areSignificantDigitsUsed() was TRUE, expected FALSE.\n", __FILE__, __LINE__); 7134 } 7135 numberFormat->setSignificantDigitsUsed(TRUE); 7136 if (numberFormat->areSignificantDigitsUsed() == FALSE) { 7137 errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__); 7138 } 7139 7140 numberFormat->setSignificantDigitsUsed(FALSE); 7141 if (numberFormat->areSignificantDigitsUsed() == TRUE) { 7142 errln("File %s, Line %d: areSignificantDigitsUsed() was TRUE, expected FALSE.\n", __FILE__, __LINE__); 7143 } 7144 7145 numberFormat->setMinimumSignificantDigits(3); 7146 if (numberFormat->areSignificantDigitsUsed() == FALSE) { 7147 errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__); 7148 } 7149 7150 numberFormat->setSignificantDigitsUsed(FALSE); 7151 numberFormat->setMaximumSignificantDigits(6); 7152 if (numberFormat->areSignificantDigitsUsed() == FALSE) { 7153 errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__); 7154 } 7155 7156 } 7157 7158 void NumberFormatTest::TestParseNegativeWithFaLocale() { 7159 UErrorCode status = U_ZERO_ERROR; 7160 DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("fa", status); 7161 CHECK_DATA(status, "NumberFormat::createInstance") 7162 test->setLenient(TRUE); 7163 Formattable af; 7164 ParsePosition ppos; 7165 UnicodeString value("\\u200e-0,5"); 7166 value = value.unescape(); 7167 test->parse(value, af, ppos); 7168 if (ppos.getIndex() == 0) { 7169 errln("Expected -0,5 to parse for Farsi."); 7170 } 7171 delete test; 7172 } 7173 7174 void NumberFormatTest::TestParseNegativeWithAlternateMinusSign() { 7175 UErrorCode status = U_ZERO_ERROR; 7176 DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("en", status); 7177 CHECK_DATA(status, "NumberFormat::createInstance") 7178 test->setLenient(TRUE); 7179 Formattable af; 7180 ParsePosition ppos; 7181 UnicodeString value("\\u208B0.5"); 7182 value = value.unescape(); 7183 test->parse(value, af, ppos); 7184 if (ppos.getIndex() == 0) { 7185 errln(UnicodeString("Expected ") + value + UnicodeString(" to parse.")); 7186 } 7187 delete test; 7188 } 7189 7190 void NumberFormatTest::TestCustomCurrencySignAndSeparator() { 7191 UErrorCode status = U_ZERO_ERROR; 7192 DecimalFormatSymbols custom(Locale::getUS(), status); 7193 CHECK(status, "DecimalFormatSymbols constructor"); 7194 7195 custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "*"); 7196 custom.setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, "^"); 7197 custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, ":"); 7198 7199 UnicodeString pat(" #,##0.00"); 7200 pat.insert(0, (UChar)0x00A4); 7201 7202 DecimalFormat fmt(pat, custom, status); 7203 CHECK(status, "DecimalFormat constructor"); 7204 7205 UnicodeString numstr("* 1^234:56"); 7206 expect2(fmt, (Formattable)((double)1234.56), numstr); 7207 } 7208 7209 typedef struct { 7210 const char * locale; 7211 UBool lenient; 7212 UnicodeString numString; 7213 double value; 7214 } SignsAndMarksItem; 7215 7216 7217 void NumberFormatTest::TestParseSignsAndMarks() { 7218 const SignsAndMarksItem items[] = { 7219 // locale lenient numString value 7220 { "en", FALSE, CharsToUnicodeString("12"), 12 }, 7221 { "en", TRUE, CharsToUnicodeString("12"), 12 }, 7222 { "en", FALSE, CharsToUnicodeString("-23"), -23 }, 7223 { "en", TRUE, CharsToUnicodeString("-23"), -23 }, 7224 { "en", TRUE, CharsToUnicodeString("- 23"), -23 }, 7225 { "en", FALSE, CharsToUnicodeString("\\u200E-23"), -23 }, 7226 { "en", TRUE, CharsToUnicodeString("\\u200E-23"), -23 }, 7227 { "en", TRUE, CharsToUnicodeString("\\u200E- 23"), -23 }, 7228 7229 { "en@numbers=arab", FALSE, CharsToUnicodeString("\\u0663\\u0664"), 34 }, 7230 { "en@numbers=arab", TRUE, CharsToUnicodeString("\\u0663\\u0664"), 34 }, 7231 { "en@numbers=arab", FALSE, CharsToUnicodeString("-\\u0664\\u0665"), -45 }, 7232 { "en@numbers=arab", TRUE, CharsToUnicodeString("-\\u0664\\u0665"), -45 }, 7233 { "en@numbers=arab", TRUE, CharsToUnicodeString("- \\u0664\\u0665"), -45 }, 7234 { "en@numbers=arab", FALSE, CharsToUnicodeString("\\u200F-\\u0664\\u0665"), -45 }, 7235 { "en@numbers=arab", TRUE, CharsToUnicodeString("\\u200F-\\u0664\\u0665"), -45 }, 7236 { "en@numbers=arab", TRUE, CharsToUnicodeString("\\u200F- \\u0664\\u0665"), -45 }, 7237 7238 { "en@numbers=arabext", FALSE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7239 { "en@numbers=arabext", TRUE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7240 { "en@numbers=arabext", FALSE, CharsToUnicodeString("-\\u06F6\\u06F7"), -67 }, 7241 { "en@numbers=arabext", TRUE, CharsToUnicodeString("-\\u06F6\\u06F7"), -67 }, 7242 { "en@numbers=arabext", TRUE, CharsToUnicodeString("- \\u06F6\\u06F7"), -67 }, 7243 { "en@numbers=arabext", FALSE, CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"), -67 }, 7244 { "en@numbers=arabext", TRUE, CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"), -67 }, 7245 { "en@numbers=arabext", TRUE, CharsToUnicodeString("\\u200E-\\u200E \\u06F6\\u06F7"), -67 }, 7246 7247 { "he", FALSE, CharsToUnicodeString("12"), 12 }, 7248 { "he", TRUE, CharsToUnicodeString("12"), 12 }, 7249 { "he", FALSE, CharsToUnicodeString("-23"), -23 }, 7250 { "he", TRUE, CharsToUnicodeString("-23"), -23 }, 7251 { "he", TRUE, CharsToUnicodeString("- 23"), -23 }, 7252 { "he", FALSE, CharsToUnicodeString("\\u200E-23"), -23 }, 7253 { "he", TRUE, CharsToUnicodeString("\\u200E-23"), -23 }, 7254 { "he", TRUE, CharsToUnicodeString("\\u200E- 23"), -23 }, 7255 7256 { "ar", FALSE, CharsToUnicodeString("\\u0663\\u0664"), 34 }, 7257 { "ar", TRUE, CharsToUnicodeString("\\u0663\\u0664"), 34 }, 7258 { "ar", FALSE, CharsToUnicodeString("-\\u0664\\u0665"), -45 }, 7259 { "ar", TRUE, CharsToUnicodeString("-\\u0664\\u0665"), -45 }, 7260 { "ar", TRUE, CharsToUnicodeString("- \\u0664\\u0665"), -45 }, 7261 { "ar", FALSE, CharsToUnicodeString("\\u200F-\\u0664\\u0665"), -45 }, 7262 { "ar", TRUE, CharsToUnicodeString("\\u200F-\\u0664\\u0665"), -45 }, 7263 { "ar", TRUE, CharsToUnicodeString("\\u200F- \\u0664\\u0665"), -45 }, 7264 7265 { "ar_MA", FALSE, CharsToUnicodeString("12"), 12 }, 7266 { "ar_MA", TRUE, CharsToUnicodeString("12"), 12 }, 7267 { "ar_MA", FALSE, CharsToUnicodeString("-23"), -23 }, 7268 { "ar_MA", TRUE, CharsToUnicodeString("-23"), -23 }, 7269 { "ar_MA", TRUE, CharsToUnicodeString("- 23"), -23 }, 7270 { "ar_MA", FALSE, CharsToUnicodeString("\\u200E-23"), -23 }, 7271 { "ar_MA", TRUE, CharsToUnicodeString("\\u200E-23"), -23 }, 7272 { "ar_MA", TRUE, CharsToUnicodeString("\\u200E- 23"), -23 }, 7273 7274 { "fa", FALSE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7275 { "fa", TRUE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7276 { "fa", FALSE, CharsToUnicodeString("\\u2212\\u06F6\\u06F7"), -67 }, 7277 { "fa", TRUE, CharsToUnicodeString("\\u2212\\u06F6\\u06F7"), -67 }, 7278 { "fa", TRUE, CharsToUnicodeString("\\u2212 \\u06F6\\u06F7"), -67 }, 7279 { "fa", FALSE, CharsToUnicodeString("\\u200E\\u2212\\u200E\\u06F6\\u06F7"), -67 }, 7280 { "fa", TRUE, CharsToUnicodeString("\\u200E\\u2212\\u200E\\u06F6\\u06F7"), -67 }, 7281 { "fa", TRUE, CharsToUnicodeString("\\u200E\\u2212\\u200E \\u06F6\\u06F7"), -67 }, 7282 7283 { "ps", FALSE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7284 { "ps", TRUE, CharsToUnicodeString("\\u06F5\\u06F6"), 56 }, 7285 { "ps", FALSE, CharsToUnicodeString("-\\u06F6\\u06F7"), -67 }, 7286 { "ps", TRUE, CharsToUnicodeString("-\\u06F6\\u06F7"), -67 }, 7287 { "ps", TRUE, CharsToUnicodeString("- \\u06F6\\u06F7"), -67 }, 7288 { "ps", FALSE, CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"), -67 }, 7289 { "ps", TRUE, CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"), -67 }, 7290 { "ps", TRUE, CharsToUnicodeString("\\u200E-\\u200E \\u06F6\\u06F7"), -67 }, 7291 { "ps", FALSE, CharsToUnicodeString("-\\u200E\\u06F6\\u06F7"), -67 }, 7292 { "ps", TRUE, CharsToUnicodeString("-\\u200E\\u06F6\\u06F7"), -67 }, 7293 { "ps", TRUE, CharsToUnicodeString("-\\u200E \\u06F6\\u06F7"), -67 }, 7294 // terminator 7295 { NULL, 0, UnicodeString(""), 0 }, 7296 }; 7297 7298 const SignsAndMarksItem * itemPtr; 7299 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { 7300 UErrorCode status = U_ZERO_ERROR; 7301 NumberFormat *numfmt = NumberFormat::createInstance(Locale(itemPtr->locale), status); 7302 if (U_SUCCESS(status)) { 7303 numfmt->setLenient(itemPtr->lenient); 7304 Formattable fmtobj; 7305 ParsePosition ppos; 7306 numfmt->parse(itemPtr->numString, fmtobj, ppos); 7307 if (ppos.getIndex() == itemPtr->numString.length()) { 7308 double parsedValue = fmtobj.getDouble(status); 7309 if (U_FAILURE(status) || parsedValue != itemPtr->value) { 7310 errln((UnicodeString)"FAIL: locale " + itemPtr->locale + ", lenient " + itemPtr->lenient + ", parse of \"" + itemPtr->numString + "\" gives value " + parsedValue); 7311 } 7312 } else { 7313 errln((UnicodeString)"FAIL: locale " + itemPtr->locale + ", lenient " + itemPtr->lenient + ", parse of \"" + itemPtr->numString + "\" gives position " + ppos.getIndex()); 7314 } 7315 } else { 7316 dataerrln("FAIL: NumberFormat::createInstance for locale % gives error %s", itemPtr->locale, u_errorName(status)); 7317 } 7318 delete numfmt; 7319 } 7320 } 7321 7322 typedef struct { 7323 DecimalFormat::ERoundingMode mode; 7324 double value; 7325 UnicodeString expected; 7326 } Test10419Data; 7327 7328 7329 // Tests that rounding works right when fractional digits is set to 0. 7330 void NumberFormatTest::Test10419RoundingWith0FractionDigits() { 7331 const Test10419Data items[] = { 7332 { DecimalFormat::kRoundCeiling, 1.488, "2"}, 7333 { DecimalFormat::kRoundDown, 1.588, "1"}, 7334 { DecimalFormat::kRoundFloor, 1.888, "1"}, 7335 { DecimalFormat::kRoundHalfDown, 1.5, "1"}, 7336 { DecimalFormat::kRoundHalfEven, 2.5, "2"}, 7337 { DecimalFormat::kRoundHalfUp, 2.5, "3"}, 7338 { DecimalFormat::kRoundUp, 1.5, "2"}, 7339 }; 7340 UErrorCode status = U_ZERO_ERROR; 7341 LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createInstance(Locale("en_US"), status)); 7342 if (U_FAILURE(status)) { 7343 dataerrln("Failure creating DecimalFormat %s", u_errorName(status)); 7344 return; 7345 } 7346 for (int32_t i = 0; i < (int32_t) (sizeof(items) / sizeof(items[0])); ++i) { 7347 decfmt->setRoundingMode(items[i].mode); 7348 decfmt->setMaximumFractionDigits(0); 7349 UnicodeString actual; 7350 if (items[i].expected != decfmt->format(items[i].value, actual)) { 7351 errln("Expected " + items[i].expected + ", got " + actual); 7352 } 7353 } 7354 } 7355 7356 void NumberFormatTest::Test10468ApplyPattern() { 7357 // Padding char of fmt is now 'a' 7358 UErrorCode status = U_ZERO_ERROR; 7359 DecimalFormat fmt("'I''ll'*a###.##", status); 7360 7361 if (U_FAILURE(status)) { 7362 errcheckln(status, "DecimalFormat constructor failed - %s", u_errorName(status)); 7363 return; 7364 } 7365 7366 if (fmt.getPadCharacterString() != UnicodeString("a")) { 7367 errln("Padding character should be 'a'."); 7368 return; 7369 } 7370 7371 // Padding char of fmt ought to be '*' since that is the default and no 7372 // explicit padding char is specified in the new pattern. 7373 fmt.applyPattern("AA#,##0.00ZZ", status); 7374 7375 // Oops this still prints 'a' even though we changed the pattern. 7376 if (fmt.getPadCharacterString() != UnicodeString("*")) { 7377 errln("applyPattern did not clear padding character."); 7378 } 7379 } 7380 7381 void NumberFormatTest::TestRoundingScientific10542() { 7382 UErrorCode status = U_ZERO_ERROR; 7383 DecimalFormat format("0.00E0", status); 7384 if (U_FAILURE(status)) { 7385 errcheckln(status, "DecimalFormat constructor failed - %s", u_errorName(status)); 7386 return; 7387 } 7388 7389 DecimalFormat::ERoundingMode roundingModes[] = { 7390 DecimalFormat::kRoundCeiling, 7391 DecimalFormat::kRoundDown, 7392 DecimalFormat::kRoundFloor, 7393 DecimalFormat::kRoundHalfDown, 7394 DecimalFormat::kRoundHalfEven, 7395 DecimalFormat::kRoundHalfUp, 7396 DecimalFormat::kRoundUp}; 7397 const char *descriptions[] = { 7398 "Round Ceiling", 7399 "Round Down", 7400 "Round Floor", 7401 "Round half down", 7402 "Round half even", 7403 "Round half up", 7404 "Round up"}; 7405 7406 { 7407 double values[] = {-0.003006, -0.003005, -0.003004, 0.003014, 0.003015, 0.003016}; 7408 // The order of these expected values correspond to the order of roundingModes and the order of values. 7409 const char *expected[] = { 7410 "-3.00E-3", "-3.00E-3", "-3.00E-3", "3.02E-3", "3.02E-3", "3.02E-3", 7411 "-3.00E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.01E-3", 7412 "-3.01E-3", "-3.01E-3", "-3.01E-3", "3.01E-3", "3.01E-3", "3.01E-3", 7413 "-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.02E-3", 7414 "-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3", 7415 "-3.01E-3", "-3.01E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3", 7416 "-3.01E-3", "-3.01E-3", "-3.01E-3", "3.02E-3", "3.02E-3", "3.02E-3"}; 7417 verifyRounding( 7418 format, 7419 values, 7420 expected, 7421 roundingModes, 7422 descriptions, 7423 (int32_t) (sizeof(values) / sizeof(values[0])), 7424 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7425 } 7426 { 7427 double values[] = {-3006.0, -3005, -3004, 3014, 3015, 3016}; 7428 // The order of these expected values correspond to the order of roundingModes and the order of values. 7429 const char *expected[] = { 7430 "-3.00E3", "-3.00E3", "-3.00E3", "3.02E3", "3.02E3", "3.02E3", 7431 "-3.00E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.01E3", 7432 "-3.01E3", "-3.01E3", "-3.01E3", "3.01E3", "3.01E3", "3.01E3", 7433 "-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.02E3", 7434 "-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3", 7435 "-3.01E3", "-3.01E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3", 7436 "-3.01E3", "-3.01E3", "-3.01E3", "3.02E3", "3.02E3", "3.02E3"}; 7437 verifyRounding( 7438 format, 7439 values, 7440 expected, 7441 roundingModes, 7442 descriptions, 7443 (int32_t) (sizeof(values) / sizeof(values[0])), 7444 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7445 } 7446 /* Commented out for now until we decide how rounding to zero should work, +0 vs. -0 7447 { 7448 double values[] = {0.0, -0.0}; 7449 // The order of these expected values correspond to the order of roundingModes and the order of values. 7450 const char *expected[] = { 7451 "0.00E0", "-0.00E0", 7452 "0.00E0", "-0.00E0", 7453 "0.00E0", "-0.00E0", 7454 "0.00E0", "-0.00E0", 7455 "0.00E0", "-0.00E0", 7456 "0.00E0", "-0.00E0", 7457 "0.00E0", "-0.00E0"}; 7458 verifyRounding( 7459 format, 7460 values, 7461 expected, 7462 roundingModes, 7463 descriptions, 7464 (int32_t) (sizeof(values) / sizeof(values[0])), 7465 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7466 } 7467 */ 7468 { 7469 7470 double values[] = {1e25, 1e25 + 1e15, 1e25 - 1e15}; 7471 // The order of these expected values correspond to the order of roundingModes and the order of values. 7472 const char *expected[] = { 7473 "1.00E25", "1.01E25", "1.00E25", 7474 "1.00E25", "1.00E25", "9.99E24", 7475 "1.00E25", "1.00E25", "9.99E24", 7476 "1.00E25", "1.00E25", "1.00E25", 7477 "1.00E25", "1.00E25", "1.00E25", 7478 "1.00E25", "1.00E25", "1.00E25", 7479 "1.00E25", "1.01E25", "1.00E25"}; 7480 verifyRounding( 7481 format, 7482 values, 7483 expected, 7484 roundingModes, 7485 descriptions, 7486 (int32_t) (sizeof(values) / sizeof(values[0])), 7487 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7488 } 7489 { 7490 double values[] = {-1e25, -1e25 + 1e15, -1e25 - 1e15}; 7491 // The order of these expected values correspond to the order of roundingModes and the order of values. 7492 const char *expected[] = { 7493 "-1.00E25", "-9.99E24", "-1.00E25", 7494 "-1.00E25", "-9.99E24", "-1.00E25", 7495 "-1.00E25", "-1.00E25", "-1.01E25", 7496 "-1.00E25", "-1.00E25", "-1.00E25", 7497 "-1.00E25", "-1.00E25", "-1.00E25", 7498 "-1.00E25", "-1.00E25", "-1.00E25", 7499 "-1.00E25", "-1.00E25", "-1.01E25"}; 7500 verifyRounding( 7501 format, 7502 values, 7503 expected, 7504 roundingModes, 7505 descriptions, 7506 (int32_t) (sizeof(values) / sizeof(values[0])), 7507 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7508 } 7509 { 7510 double values[] = {1e-25, 1e-25 + 1e-35, 1e-25 - 1e-35}; 7511 // The order of these expected values correspond to the order of roundingModes and the order of values. 7512 const char *expected[] = { 7513 "1.00E-25", "1.01E-25", "1.00E-25", 7514 "1.00E-25", "1.00E-25", "9.99E-26", 7515 "1.00E-25", "1.00E-25", "9.99E-26", 7516 "1.00E-25", "1.00E-25", "1.00E-25", 7517 "1.00E-25", "1.00E-25", "1.00E-25", 7518 "1.00E-25", "1.00E-25", "1.00E-25", 7519 "1.00E-25", "1.01E-25", "1.00E-25"}; 7520 verifyRounding( 7521 format, 7522 values, 7523 expected, 7524 roundingModes, 7525 descriptions, 7526 (int32_t) (sizeof(values) / sizeof(values[0])), 7527 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7528 } 7529 { 7530 double values[] = {-1e-25, -1e-25 + 1e-35, -1e-25 - 1e-35}; 7531 // The order of these expected values correspond to the order of roundingModes and the order of values. 7532 const char *expected[] = { 7533 "-1.00E-25", "-9.99E-26", "-1.00E-25", 7534 "-1.00E-25", "-9.99E-26", "-1.00E-25", 7535 "-1.00E-25", "-1.00E-25", "-1.01E-25", 7536 "-1.00E-25", "-1.00E-25", "-1.00E-25", 7537 "-1.00E-25", "-1.00E-25", "-1.00E-25", 7538 "-1.00E-25", "-1.00E-25", "-1.00E-25", 7539 "-1.00E-25", "-1.00E-25", "-1.01E-25"}; 7540 verifyRounding( 7541 format, 7542 values, 7543 expected, 7544 roundingModes, 7545 descriptions, 7546 (int32_t) (sizeof(values) / sizeof(values[0])), 7547 (int32_t) (sizeof(roundingModes) / sizeof(roundingModes[0]))); 7548 } 7549 } 7550 7551 void NumberFormatTest::TestZeroScientific10547() { 7552 UErrorCode status = U_ZERO_ERROR; 7553 DecimalFormat fmt("0.00E0", status); 7554 if (!assertSuccess("Formt creation", status)) { 7555 return; 7556 } 7557 UnicodeString out; 7558 fmt.format(-0.0, out); 7559 assertEquals("format", "-0.00E0", out); 7560 } 7561 7562 void NumberFormatTest::verifyRounding( 7563 DecimalFormat& format, 7564 const double *values, 7565 const char * const *expected, 7566 const DecimalFormat::ERoundingMode *roundingModes, 7567 const char * const *descriptions, 7568 int32_t valueSize, 7569 int32_t roundingModeSize) { 7570 for (int32_t i = 0; i < roundingModeSize; ++i) { 7571 format.setRoundingMode(roundingModes[i]); 7572 for (int32_t j = 0; j < valueSize; j++) { 7573 UnicodeString currentExpected(expected[i * valueSize + j]); 7574 currentExpected = currentExpected.unescape(); 7575 UnicodeString actual; 7576 format.format(values[j], actual); 7577 if (currentExpected != actual) { 7578 char buffer[256]; 7579 sprintf( 7580 buffer, 7581 "For %s value %f, expected ", 7582 descriptions[i], 7583 values[j]); 7584 errln(UnicodeString(buffer) + currentExpected + ", got " + actual); 7585 } 7586 } 7587 } 7588 } 7589 7590 void NumberFormatTest::TestAccountingCurrency() { 7591 UErrorCode status = U_ZERO_ERROR; 7592 UNumberFormatStyle style = UNUM_CURRENCY_ACCOUNTING; 7593 7594 expect(NumberFormat::createInstance("en_US", style, status), 7595 (Formattable)1234.5, "$1,234.50", TRUE, status); 7596 expect(NumberFormat::createInstance("en_US", style, status), 7597 (Formattable)-1234.5, "($1,234.50)", TRUE, status); 7598 expect(NumberFormat::createInstance("en_US", style, status), 7599 (Formattable)0, "$0.00", TRUE, status); 7600 expect(NumberFormat::createInstance("en_US", style, status), 7601 (Formattable)-0.2, "($0.20)", TRUE, status); 7602 expect(NumberFormat::createInstance("ja_JP", style, status), 7603 (Formattable)10000, UnicodeString("\\uFFE510,000").unescape(), TRUE, status); 7604 expect(NumberFormat::createInstance("ja_JP", style, status), 7605 (Formattable)-1000.5, UnicodeString("(\\uFFE51,000)").unescape(), FALSE, status); 7606 expect(NumberFormat::createInstance("de_DE", style, status), 7607 (Formattable)-23456.7, UnicodeString("-23.456,70\\u00A0\\u20AC").unescape(), TRUE, status); 7608 } 7609 7610 // for #5186 7611 void NumberFormatTest::TestEquality() { 7612 UErrorCode status = U_ZERO_ERROR; 7613 DecimalFormatSymbols* symbols = new DecimalFormatSymbols(Locale("root"), status); 7614 if (U_FAILURE(status)) { 7615 dataerrln("Fail: can't create DecimalFormatSymbols for root"); 7616 return; 7617 } 7618 UnicodeString pattern("#,##0.###"); 7619 DecimalFormat* fmtBase = new DecimalFormat(pattern, symbols, status); 7620 if (U_FAILURE(status)) { 7621 dataerrln("Fail: can't create DecimalFormat using root symbols"); 7622 return; 7623 } 7624 7625 DecimalFormat* fmtClone = (DecimalFormat*)fmtBase->clone(); 7626 fmtClone->setFormatWidth(fmtBase->getFormatWidth() + 32); 7627 if (*fmtClone == *fmtBase) { 7628 errln("Error: DecimalFormat == does not distinguish objects that differ only in FormatWidth"); 7629 } 7630 delete fmtClone; 7631 7632 delete fmtBase; 7633 } 7634 7635 void NumberFormatTest::TestCurrencyUsage() { 7636 double agent = 123.567; 7637 7638 UErrorCode status; 7639 DecimalFormat *fmt; 7640 7641 // compare the Currency and Currency Cash Digits 7642 // Note that as of CLDR 26: 7643 // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that 7644 // * CAD and all other currencies that rounded to .05 no longer do 7645 // 1st time for getter/setter, 2nd time for factory method 7646 Locale enUS_PKR("en_US@currency=PKR"); 7647 7648 for(int i=0; i<2; i++){ 7649 status = U_ZERO_ERROR; 7650 if(i == 0){ 7651 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_PKR, UNUM_CURRENCY, status); 7652 if (assertSuccess("en_US@currency=PKR/CURRENCY", status, TRUE) == FALSE) { 7653 continue; 7654 } 7655 7656 UnicodeString original; 7657 fmt->format(agent,original); 7658 assertEquals("Test Currency Usage 1", UnicodeString("PKR124"), original); 7659 7660 // test the getter here 7661 UCurrencyUsage curUsage = fmt->getCurrencyUsage(); 7662 assertEquals("Test usage getter - standard", curUsage, UCURR_USAGE_STANDARD); 7663 7664 fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status); 7665 }else{ 7666 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_PKR, UNUM_CASH_CURRENCY, status); 7667 if (assertSuccess("en_US@currency=PKR/CASH", status, TRUE) == FALSE) { 7668 continue; 7669 } 7670 } 7671 7672 // must be usage = cash 7673 UCurrencyUsage curUsage = fmt->getCurrencyUsage(); 7674 assertEquals("Test usage getter - cash", curUsage, UCURR_USAGE_CASH); 7675 7676 UnicodeString cash_currency; 7677 fmt->format(agent,cash_currency); 7678 assertEquals("Test Currency Usage 2", UnicodeString("PKR124"), cash_currency); 7679 delete fmt; 7680 } 7681 7682 // compare the Currency and Currency Cash Rounding 7683 // 1st time for getter/setter, 2nd time for factory method 7684 Locale enUS_CAD("en_US@currency=CAD"); 7685 for(int i=0; i<2; i++){ 7686 status = U_ZERO_ERROR; 7687 if(i == 0){ 7688 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CURRENCY, status); 7689 if (assertSuccess("en_US@currency=CAD/CURRENCY", status, TRUE) == FALSE) { 7690 continue; 7691 } 7692 7693 UnicodeString original_rounding; 7694 fmt->format(agent, original_rounding); 7695 assertEquals("Test Currency Usage 3", UnicodeString("CA$123.57"), original_rounding); 7696 fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status); 7697 }else{ 7698 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status); 7699 if (assertSuccess("en_US@currency=CAD/CASH", status, TRUE) == FALSE) { 7700 continue; 7701 } 7702 } 7703 7704 UnicodeString cash_rounding_currency; 7705 fmt->format(agent, cash_rounding_currency); 7706 assertEquals("Test Currency Usage 4", UnicodeString("CA$123.57"), cash_rounding_currency); 7707 delete fmt; 7708 } 7709 7710 // Test the currency change 7711 // 1st time for getter/setter, 2nd time for factory method 7712 const UChar CUR_PKR[] = {0x50, 0x4B, 0x52, 0}; 7713 for(int i=0; i<2; i++){ 7714 status = U_ZERO_ERROR; 7715 if(i == 0){ 7716 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CURRENCY, status); 7717 if (assertSuccess("en_US@currency=CAD/CURRENCY", status, TRUE) == FALSE) { 7718 continue; 7719 } 7720 fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status); 7721 }else{ 7722 fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status); 7723 if (assertSuccess("en_US@currency=CAD/CASH", status, TRUE) == FALSE) { 7724 continue; 7725 } 7726 } 7727 7728 UnicodeString cur_original; 7729 fmt->format(agent, cur_original); 7730 assertEquals("Test Currency Usage 5", UnicodeString("CA$123.57"), cur_original); 7731 7732 fmt->setCurrency(CUR_PKR, status); 7733 assertSuccess("Set currency to PKR", status); 7734 7735 UnicodeString PKR_changed; 7736 fmt->format(agent, PKR_changed); 7737 assertEquals("Test Currency Usage 6", UnicodeString("PKR124"), PKR_changed); 7738 delete fmt; 7739 } 7740 } 7741 7742 7743 // Check the constant MAX_INT64_IN_DOUBLE. 7744 // The value should convert to a double with no loss of precision. 7745 // A failure may indicate a platform with a different double format, requiring 7746 // a revision to the constant. 7747 // 7748 // Note that this is actually hard to test, because the language standard gives 7749 // compilers considerable flexibility to do unexpected things with rounding and 7750 // with overflow in simple int to/from float conversions. Some compilers will completely optimize 7751 // away a simple round-trip conversion from int64_t -> double -> int64_t. 7752 7753 void NumberFormatTest::TestDoubleLimit11439() { 7754 char buf[50]; 7755 for (int64_t num = MAX_INT64_IN_DOUBLE-10; num<=MAX_INT64_IN_DOUBLE; num++) { 7756 sprintf(buf, "%lld", (long long)num); 7757 double fNum = 0.0; 7758 sscanf(buf, "%lf", &fNum); 7759 int64_t rtNum = fNum; 7760 if (num != rtNum) { 7761 errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum); 7762 return; 7763 } 7764 } 7765 for (int64_t num = -MAX_INT64_IN_DOUBLE+10; num>=-MAX_INT64_IN_DOUBLE; num--) { 7766 sprintf(buf, "%lld", (long long)num); 7767 double fNum = 0.0; 7768 sscanf(buf, "%lf", &fNum); 7769 int64_t rtNum = fNum; 7770 if (num != rtNum) { 7771 errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum); 7772 return; 7773 } 7774 } 7775 } 7776 7777 void NumberFormatTest::TestFastPathConsistent11524() { 7778 UErrorCode status = U_ZERO_ERROR; 7779 NumberFormat *fmt = NumberFormat::createInstance("en", status); 7780 if (U_FAILURE(status) || fmt == NULL) { 7781 dataerrln("Failed call to NumberFormat::createInstance() - %s", u_errorName(status)); 7782 return; 7783 } 7784 fmt->setMaximumIntegerDigits(INT32_MIN); 7785 UnicodeString appendTo; 7786 assertEquals("", "0", fmt->format(123, appendTo)); 7787 appendTo.remove(); 7788 assertEquals("", "0", fmt->format(12345, appendTo)); 7789 delete fmt; 7790 } 7791 7792 7793 #endif /* #if !UCONFIG_NO_FORMATTING */ 7794