OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 1997-2010, 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/ucurr.h" |
| 19 #include "unicode/ustring.h" |
| 20 #include "unicode/measfmt.h" |
| 21 #include "unicode/curramt.h" |
| 22 #include "digitlst.h" |
| 23 #include "textfile.h" |
| 24 #include "tokiter.h" |
| 25 #include "charstr.h" |
| 26 #include "putilimp.h" |
| 27 #include "winnmtst.h" |
| 28 #include <float.h> |
| 29 #include <string.h> |
| 30 #include <stdlib.h> |
| 31 #include "cstring.h" |
| 32 #include "unicode/numsys.h" |
| 33 |
| 34 //#define NUMFMTST_CACHE_DEBUG 1 |
| 35 #include "stdio.h" /* for sprintf */ |
| 36 // #include "iostream" // for cout |
| 37 |
| 38 //#define NUMFMTST_DEBUG 1 |
| 39 |
| 40 |
| 41 static const UChar EUR[] = {69,85,82,0}; // "EUR" |
| 42 static const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD" |
| 43 |
| 44 // ***************************************************************************** |
| 45 // class NumberFormatTest |
| 46 // ***************************************************************************** |
| 47 |
| 48 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); log
ln((UnicodeString)""); test(); } break |
| 49 |
| 50 #define CHECK(status,str) if (U_FAILURE(status)) { errcheckln(status, UnicodeStr
ing("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* &n
ame, char* /*par*/ ) |
| 54 { |
| 55 // if (exec) logln((UnicodeString)"TestSuite DateFormatTest"); |
| 56 switch (index) { |
| 57 CASE(0,TestCurrencySign); |
| 58 CASE(1,TestCurrency); |
| 59 CASE(2,TestParse); |
| 60 CASE(3,TestRounding487); |
| 61 CASE(4,TestQuotes); |
| 62 CASE(5,TestExponential); |
| 63 CASE(6,TestPatterns); |
| 64 |
| 65 // Upgrade to alphaWorks - liu 5/99 |
| 66 CASE(7,TestExponent); |
| 67 CASE(8,TestScientific); |
| 68 CASE(9,TestPad); |
| 69 CASE(10,TestPatterns2); |
| 70 CASE(11,TestSecondaryGrouping); |
| 71 CASE(12,TestSurrogateSupport); |
| 72 CASE(13,TestAPI); |
| 73 |
| 74 CASE(14,TestCurrencyObject); |
| 75 CASE(15,TestCurrencyPatterns); |
| 76 //CASE(16,TestDigitList); |
| 77 CASE(16,TestWhiteSpaceParsing); |
| 78 CASE(17,TestComplexCurrency); // This test removed because CLDR no long
er uses choice formats in currency symbols. |
| 79 CASE(18,TestRegCurrency); |
| 80 CASE(19,TestSymbolsWithBadLocale); |
| 81 CASE(20,TestAdoptDecimalFormatSymbols); |
| 82 |
| 83 CASE(21,TestScientific2); |
| 84 CASE(22,TestScientificGrouping); |
| 85 CASE(23,TestInt64); |
| 86 |
| 87 CASE(24,TestPerMill); |
| 88 CASE(25,TestIllegalPatterns); |
| 89 CASE(26,TestCases); |
| 90 |
| 91 CASE(27,TestCurrencyNames); |
| 92 CASE(28,TestCurrencyAmount); |
| 93 CASE(29,TestCurrencyUnit); |
| 94 CASE(30,TestCoverage); |
| 95 CASE(31,TestJB3832); |
| 96 CASE(32,TestHost); |
| 97 CASE(33,TestHostClone); |
| 98 CASE(34,TestCurrencyFormat); |
| 99 CASE(35,TestRounding); |
| 100 CASE(36,TestNonpositiveMultiplier); |
| 101 CASE(37,TestNumberingSystems); |
| 102 CASE(38,TestSpaceParsing); |
| 103 CASE(39,TestMultiCurrencySign); |
| 104 CASE(40,TestCurrencyFormatForMixParsing); |
| 105 CASE(41,TestDecimalFormatCurrencyParse); |
| 106 CASE(42,TestCurrencyIsoPluralFormat); |
| 107 CASE(43,TestCurrencyParsing); |
| 108 CASE(44,TestParseCurrencyInUCurr); |
| 109 CASE(45,TestFormatAttributes); |
| 110 CASE(46,TestFieldPositionIterator); |
| 111 CASE(47,TestDecimal); |
| 112 CASE(48,TestCurrencyFractionDigits); |
| 113 CASE(49,TestExponentParse); |
| 114 default: name = ""; break; |
| 115 } |
| 116 } |
| 117 |
| 118 // ------------------------------------- |
| 119 |
| 120 // Test API (increase code coverage) |
| 121 void |
| 122 NumberFormatTest::TestAPI(void) |
| 123 { |
| 124 logln("Test API"); |
| 125 UErrorCode status = U_ZERO_ERROR; |
| 126 NumberFormat *test = NumberFormat::createInstance("root", status); |
| 127 if(U_FAILURE(status)) { |
| 128 dataerrln("unable to create format object - %s", u_errorName(status)); |
| 129 } |
| 130 if(test != NULL) { |
| 131 test->setMinimumIntegerDigits(10); |
| 132 test->setMaximumIntegerDigits(2); |
| 133 |
| 134 test->setMinimumFractionDigits(10); |
| 135 test->setMaximumFractionDigits(2); |
| 136 |
| 137 UnicodeString result; |
| 138 FieldPosition pos; |
| 139 Formattable bla("Paja Patak"); // Donald Duck for non Serbian speakers |
| 140 test->format(bla, result, pos, status); |
| 141 if(U_SUCCESS(status)) { |
| 142 errln("Yuck... Formatted a duck... As a number!"); |
| 143 } else { |
| 144 status = U_ZERO_ERROR; |
| 145 } |
| 146 |
| 147 result.remove(); |
| 148 int64_t ll = 12; |
| 149 test->format(ll, result); |
| 150 if (result != "12.00"){ |
| 151 errln("format int64_t error"); |
| 152 } |
| 153 |
| 154 ParsePosition ppos; |
| 155 test->parseCurrency("",bla,ppos); |
| 156 if(U_FAILURE(status)) { |
| 157 errln("Problems accessing the parseCurrency function for NumberFormat"); |
| 158 } |
| 159 |
| 160 delete test; |
| 161 } |
| 162 } |
| 163 |
| 164 class StubNumberForamt :public NumberFormat{ |
| 165 public: |
| 166 StubNumberForamt(){}; |
| 167 virtual UnicodeString& format(double ,UnicodeString& appendTo,FieldPosition&
) const { |
| 168 return appendTo; |
| 169 } |
| 170 virtual UnicodeString& format(int32_t ,UnicodeString& appendTo,FieldPosition
& ) const { |
| 171 return appendTo.append((UChar)0x0033); |
| 172 } |
| 173 virtual UnicodeString& format(int64_t number,UnicodeString& appendTo,FieldPo
sition& pos) const { |
| 174 return NumberFormat::format(number, appendTo, pos); |
| 175 } |
| 176 virtual UnicodeString& format(const Formattable& , UnicodeString& appendTo,
FieldPosition& , UErrorCode& ) const { |
| 177 return appendTo; |
| 178 } |
| 179 virtual void parse(const UnicodeString& , |
| 180 Formattable& , |
| 181 ParsePosition& ) const {} |
| 182 virtual void parse( const UnicodeString& , |
| 183 Formattable& , |
| 184 UErrorCode& ) const {} |
| 185 virtual UClassID getDynamicClassID(void) const { |
| 186 static char classID = 0; |
| 187 return (UClassID)&classID; |
| 188 } |
| 189 virtual Format* clone() const {return NULL;} |
| 190 }; |
| 191 |
| 192 void |
| 193 NumberFormatTest::TestCoverage(void){ |
| 194 StubNumberForamt stub; |
| 195 UnicodeString agent("agent"); |
| 196 FieldPosition pos; |
| 197 int64_t num = 4; |
| 198 if (stub.format(num, agent, pos) != UnicodeString("agent3")){ |
| 199 errln("NumberFormat::format(int64, UnicodString&, FieldPosition&) should
delegate to (int32, ,)"); |
| 200 }; |
| 201 } |
| 202 |
| 203 // Test various patterns |
| 204 void |
| 205 NumberFormatTest::TestPatterns(void) |
| 206 { |
| 207 UErrorCode status = U_ZERO_ERROR; |
| 208 DecimalFormatSymbols sym(Locale::getUS(), status); |
| 209 if (U_FAILURE(status)) { errcheckln(status, "FAIL: Could not construct Decim
alFormatSymbols - %s", u_errorName(status)); return; } |
| 210 |
| 211 const char* pat[] = { "#.#", "#.", ".#", "#" }; |
| 212 int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); |
| 213 const char* newpat[] = { "#0.#", "#0.", "#.0", "#" }; |
| 214 const char* num[] = { "0", "0.", ".0", "0" }; |
| 215 for (int32_t i=0; i<pat_length; ++i) |
| 216 { |
| 217 status = U_ZERO_ERROR; |
| 218 DecimalFormat fmt(pat[i], sym, status); |
| 219 if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: DecimalFormat const
ructor failed for " + pat[i]); continue; } |
| 220 UnicodeString newp; fmt.toPattern(newp); |
| 221 if (!(newp == newpat[i])) |
| 222 errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should transmute
to " + newpat[i] + |
| 223 "; " + newp + " seen instead"); |
| 224 |
| 225 UnicodeString s; (*(NumberFormat*)&fmt).format((int32_t)0, s); |
| 226 if (!(s == num[i])) |
| 227 { |
| 228 errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should format zer
o as " + num[i] + |
| 229 "; " + s + " seen instead"); |
| 230 logln((UnicodeString)"Min integer digits = " + fmt.getMinimumInteger
Digits()); |
| 231 } |
| 232 } |
| 233 } |
| 234 |
| 235 /* |
| 236 icu_2_4::DigitList::operator== 0 0 2 icuuc24d.dll digitlst.cpp Doug |
| 237 icu_2_4::DigitList::append 0 0 4 icuin24d.dll digitlst.h Doug |
| 238 icu_2_4::DigitList::operator!= 0 0 1 icuuc24d.dll digitlst.h Doug |
| 239 */ |
| 240 /* |
| 241 void |
| 242 NumberFormatTest::TestDigitList(void) |
| 243 { |
| 244 // API coverage for DigitList |
| 245 DigitList list1; |
| 246 list1.append('1'); |
| 247 list1.fDecimalAt = 1; |
| 248 DigitList list2; |
| 249 list2.set((int32_t)1); |
| 250 if (list1 != list2) { |
| 251 errln("digitlist append, operator!= or set failed "); |
| 252 } |
| 253 if (!(list1 == list2)) { |
| 254 errln("digitlist append, operator== or set failed "); |
| 255 } |
| 256 } |
| 257 */ |
| 258 |
| 259 // ------------------------------------- |
| 260 |
| 261 // Test exponential pattern |
| 262 void |
| 263 NumberFormatTest::TestExponential(void) |
| 264 { |
| 265 UErrorCode status = U_ZERO_ERROR; |
| 266 DecimalFormatSymbols sym(Locale::getUS(), status); |
| 267 if (U_FAILURE(status)) { errcheckln(status, "FAIL: Bad status returned by De
cimalFormatSymbols ct - %s", u_errorName(status)); return; } |
| 268 const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0
.###E0]" }; |
| 269 int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); |
| 270 |
| 271 // The following #if statements allow this test to be built and run on |
| 272 // platforms that do not have standard IEEE numerics. For example, |
| 273 // S/390 doubles have an exponent range of -78 to +75. For the |
| 274 // following #if statements to work, float.h must define |
| 275 // DBL_MAX_10_EXP to be a compile-time constant. |
| 276 |
| 277 // This section may be expanded as needed. |
| 278 |
| 279 #if DBL_MAX_10_EXP > 300 |
| 280 double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; |
| 281 int32_t val_length = (int32_t)(sizeof(val) / sizeof(val[0])); |
| 282 const char* valFormat[] = |
| 283 { |
| 284 // 0.####E0 |
| 285 "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", |
| 286 // 00.000E00 |
| 287 "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", |
| 288 // ##0.######E000 |
| 289 "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", |
| 290 // 0.###E0;[0.###E0] |
| 291 "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" |
| 292 }; |
| 293 double valParse[] = |
| 294 { |
| 295 0.01234, 123460000, 1.23E300, -3.1416E-271, |
| 296 0.01234, 123460000, 1.23E300, -3.1416E-271, |
| 297 0.01234, 123456800, 1.23E300, -3.141593E-271, |
| 298 0.01234, 123500000, 1.23E300, -3.142E-271, |
| 299 }; |
| 300 #elif DBL_MAX_10_EXP > 70 |
| 301 double val[] = { 0.01234, 123456789, 1.23e70, -3.141592653e-71 }; |
| 302 int32_t val_length = sizeof(val) / sizeof(val[0]); |
| 303 char* valFormat[] = |
| 304 { |
| 305 // 0.####E0 |
| 306 "1.234E-2", "1.2346E8", "1.23E70", "-3.1416E-71", |
| 307 // 00.000E00 |
| 308 "12.340E-03", "12.346E07", "12.300E69", "-31.416E-72", |
| 309 // ##0.######E000 |
| 310 "12.34E-003", "123.4568E006", "12.3E069", "-31.41593E-072", |
| 311 // 0.###E0;[0.###E0] |
| 312 "1.234E-2", "1.235E8", "1.23E70", "[3.142E-71]" |
| 313 }; |
| 314 double valParse[] = |
| 315 { |
| 316 0.01234, 123460000, 1.23E70, -3.1416E-71, |
| 317 0.01234, 123460000, 1.23E70, -3.1416E-71, |
| 318 0.01234, 123456800, 1.23E70, -3.141593E-71, |
| 319 0.01234, 123500000, 1.23E70, -3.142E-71, |
| 320 }; |
| 321 #else |
| 322 // Don't test double conversion |
| 323 double* val = 0; |
| 324 int32_t val_length = 0; |
| 325 char** valFormat = 0; |
| 326 double* valParse = 0; |
| 327 logln("Warning: Skipping double conversion tests"); |
| 328 #endif |
| 329 |
| 330 int32_t lval[] = { 0, -1, 1, 123456789 }; |
| 331 int32_t lval_length = (int32_t)(sizeof(lval) / sizeof(lval[0])); |
| 332 const char* lvalFormat[] = |
| 333 { |
| 334 // 0.####E0 |
| 335 "0E0", "-1E0", "1E0", "1.2346E8", |
| 336 // 00.000E00 |
| 337 "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", |
| 338 // ##0.######E000 |
| 339 "0E000", "-1E000", "1E000", "123.4568E006", |
| 340 // 0.###E0;[0.###E0] |
| 341 "0E0", "[1E0]", "1E0", "1.235E8" |
| 342 }; |
| 343 int32_t lvalParse[] = |
| 344 { |
| 345 0, -1, 1, 123460000, |
| 346 0, -1, 1, 123460000, |
| 347 0, -1, 1, 123456800, |
| 348 0, -1, 1, 123500000, |
| 349 }; |
| 350 int32_t ival = 0, ilval = 0; |
| 351 for (int32_t p=0; p<pat_length; ++p) |
| 352 { |
| 353 DecimalFormat fmt(pat[p], sym, status); |
| 354 if (U_FAILURE(status)) { errln("FAIL: Bad status returned by DecimalForm
at ct"); continue; } |
| 355 UnicodeString pattern; |
| 356 logln((UnicodeString)"Pattern \"" + pat[p] + "\" -toPattern-> \"" + |
| 357 fmt.toPattern(pattern) + "\""); |
| 358 int32_t v; |
| 359 for (v=0; v<val_length; ++v) |
| 360 { |
| 361 UnicodeString s; (*(NumberFormat*)&fmt).format(val[v], s); |
| 362 logln((UnicodeString)" " + val[v] + " -format-> " + s); |
| 363 if (s != valFormat[v+ival]) |
| 364 errln((UnicodeString)"FAIL: Expected " + valFormat[v+ival]); |
| 365 |
| 366 ParsePosition pos(0); |
| 367 Formattable af; |
| 368 fmt.parse(s, af, pos); |
| 369 double a; |
| 370 UBool useEpsilon = FALSE; |
| 371 if (af.getType() == Formattable::kLong) |
| 372 a = af.getLong(); |
| 373 else if (af.getType() == Formattable::kDouble) { |
| 374 a = af.getDouble(); |
| 375 #if defined(OS390) || defined(OS400) |
| 376 // S/390 will show a failure like this: |
| 377 //| -3.141592652999999e-271 -format-> -3.1416E-271 |
| 378 //| -parse-> -3.1416e-271 |
| 379 //| FAIL: Expected -3.141599999999999e-271 |
| 380 // To compensate, we use an epsilon-based equality |
| 381 // test on S/390 only. We don't want to do this in |
| 382 // general because it's less exacting. |
| 383 useEpsilon = TRUE; |
| 384 #endif |
| 385 } |
| 386 else { |
| 387 errln((UnicodeString)"FAIL: Non-numeric Formattable returned"); |
| 388 continue; |
| 389 } |
| 390 if (pos.getIndex() == s.length()) |
| 391 { |
| 392 logln((UnicodeString)" -parse-> " + a); |
| 393 // Use epsilon comparison as necessary |
| 394 if ((useEpsilon && |
| 395 (uprv_fabs(a - valParse[v+ival]) / a > (2*DBL_EPSILON))) || |
| 396 (!useEpsilon && a != valParse[v+ival])) |
| 397 { |
| 398 errln((UnicodeString)"FAIL: Expected " + valParse[v+ival]); |
| 399 } |
| 400 } |
| 401 else { |
| 402 errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() +
" chars) -> " + a); |
| 403 errln((UnicodeString)" should be (" + s.length() + " chars) ->
" + valParse[v+ival]); |
| 404 } |
| 405 } |
| 406 for (v=0; v<lval_length; ++v) |
| 407 { |
| 408 UnicodeString s; |
| 409 (*(NumberFormat*)&fmt).format(lval[v], s); |
| 410 logln((UnicodeString)" " + lval[v] + "L -format-> " + s); |
| 411 if (s != lvalFormat[v+ilval]) |
| 412 errln((UnicodeString)"ERROR: Expected " + lvalFormat[v+ilval] +
" Got: " + s); |
| 413 |
| 414 ParsePosition pos(0); |
| 415 Formattable af; |
| 416 fmt.parse(s, af, pos); |
| 417 if (af.getType() == Formattable::kLong || |
| 418 af.getType() == Formattable::kInt64) { |
| 419 UErrorCode status = U_ZERO_ERROR; |
| 420 int32_t a = af.getLong(status); |
| 421 if (pos.getIndex() == s.length()) |
| 422 { |
| 423 logln((UnicodeString)" -parse-> " + a); |
| 424 if (a != lvalParse[v+ilval]) |
| 425 errln((UnicodeString)"FAIL: Expected " + lvalParse[v+ilv
al]); |
| 426 } |
| 427 else |
| 428 errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex(
) + " chars) -> " + a); |
| 429 } |
| 430 else |
| 431 errln((UnicodeString)"FAIL: Non-long Formattable returned for "
+ s |
| 432 + " Double: " + af.getDouble() |
| 433 + ", Long: " + af.getLong()); |
| 434 } |
| 435 ival += val_length; |
| 436 ilval += lval_length; |
| 437 } |
| 438 } |
| 439 |
| 440 void |
| 441 NumberFormatTest::TestScientific2() { |
| 442 // jb 2552 |
| 443 UErrorCode status = U_ZERO_ERROR; |
| 444 DecimalFormat* fmt = (DecimalFormat*)NumberFormat::createCurrencyInstance("e
n_US", status); |
| 445 if (U_SUCCESS(status)) { |
| 446 double num = 12.34; |
| 447 expect(*fmt, num, "$12.34"); |
| 448 fmt->setScientificNotation(TRUE); |
| 449 expect(*fmt, num, "$1.23E1"); |
| 450 fmt->setScientificNotation(FALSE); |
| 451 expect(*fmt, num, "$12.34"); |
| 452 } |
| 453 delete fmt; |
| 454 } |
| 455 |
| 456 void |
| 457 NumberFormatTest::TestScientificGrouping() { |
| 458 // jb 2552 |
| 459 UErrorCode status = U_ZERO_ERROR; |
| 460 DecimalFormat fmt("##0.00E0",status); |
| 461 if (U_SUCCESS(status)) { |
| 462 expect(fmt, .01234, "12.3E-3"); |
| 463 expect(fmt, .1234, "123E-3"); |
| 464 expect(fmt, 1.234, "1.23E0"); |
| 465 expect(fmt, 12.34, "12.3E0"); |
| 466 expect(fmt, 123.4, "123E0"); |
| 467 expect(fmt, 1234., "1.23E3"); |
| 468 } |
| 469 } |
| 470 |
| 471 /*static void setFromString(DigitList& dl, const char* str) { |
| 472 char c; |
| 473 UBool decimalSet = FALSE; |
| 474 dl.clear(); |
| 475 while ((c = *str++)) { |
| 476 if (c == '-') { |
| 477 dl.fIsPositive = FALSE; |
| 478 } else if (c == '+') { |
| 479 dl.fIsPositive = TRUE; |
| 480 } else if (c == '.') { |
| 481 dl.fDecimalAt = dl.fCount; |
| 482 decimalSet = TRUE; |
| 483 } else { |
| 484 dl.append(c); |
| 485 } |
| 486 } |
| 487 if (!decimalSet) { |
| 488 dl.fDecimalAt = dl.fCount; |
| 489 } |
| 490 }*/ |
| 491 |
| 492 void |
| 493 NumberFormatTest::TestInt64() { |
| 494 UErrorCode status = U_ZERO_ERROR; |
| 495 DecimalFormat fmt("#.#E0",status); |
| 496 fmt.setMaximumFractionDigits(20); |
| 497 if (U_SUCCESS(status)) { |
| 498 expect(fmt, (Formattable)(int64_t)0, "0E0"); |
| 499 expect(fmt, (Formattable)(int64_t)-1, "-1E0"); |
| 500 expect(fmt, (Formattable)(int64_t)1, "1E0"); |
| 501 expect(fmt, (Formattable)(int64_t)2147483647, "2.147483647E9"); |
| 502 expect(fmt, (Formattable)((int64_t)-2147483647-1), "-2.147483648E9"); |
| 503 expect(fmt, (Formattable)(int64_t)U_INT64_MAX, "9.223372036854775807E18"
); |
| 504 expect(fmt, (Formattable)(int64_t)U_INT64_MIN, "-9.223372036854775808E18
"); |
| 505 } |
| 506 |
| 507 // also test digitlist |
| 508 /* int64_t int64max = U_INT64_MAX; |
| 509 int64_t int64min = U_INT64_MIN; |
| 510 const char* int64maxstr = "9223372036854775807"; |
| 511 const char* int64minstr = "-9223372036854775808"; |
| 512 UnicodeString fail("fail: "); |
| 513 |
| 514 // test max int64 value |
| 515 DigitList dl; |
| 516 setFromString(dl, int64maxstr); |
| 517 { |
| 518 if (!dl.fitsIntoInt64(FALSE)) { |
| 519 errln(fail + int64maxstr + " didn't fit"); |
| 520 } |
| 521 int64_t int64Value = dl.getInt64(); |
| 522 if (int64Value != int64max) { |
| 523 errln(fail + int64maxstr); |
| 524 } |
| 525 dl.set(int64Value); |
| 526 int64Value = dl.getInt64(); |
| 527 if (int64Value != int64max) { |
| 528 errln(fail + int64maxstr); |
| 529 } |
| 530 } |
| 531 // test negative of max int64 value (1 shy of min int64 value) |
| 532 dl.fIsPositive = FALSE; |
| 533 { |
| 534 if (!dl.fitsIntoInt64(FALSE)) { |
| 535 errln(fail + "-" + int64maxstr + " didn't fit"); |
| 536 } |
| 537 int64_t int64Value = dl.getInt64(); |
| 538 if (int64Value != -int64max) { |
| 539 errln(fail + "-" + int64maxstr); |
| 540 } |
| 541 dl.set(int64Value); |
| 542 int64Value = dl.getInt64(); |
| 543 if (int64Value != -int64max) { |
| 544 errln(fail + "-" + int64maxstr); |
| 545 } |
| 546 } |
| 547 // test min int64 value |
| 548 setFromString(dl, int64minstr); |
| 549 { |
| 550 if (!dl.fitsIntoInt64(FALSE)) { |
| 551 errln(fail + "-" + int64minstr + " didn't fit"); |
| 552 } |
| 553 int64_t int64Value = dl.getInt64(); |
| 554 if (int64Value != int64min) { |
| 555 errln(fail + int64minstr); |
| 556 } |
| 557 dl.set(int64Value); |
| 558 int64Value = dl.getInt64(); |
| 559 if (int64Value != int64min) { |
| 560 errln(fail + int64minstr); |
| 561 } |
| 562 } |
| 563 // test negative of min int 64 value (1 more than max int64 value) |
| 564 dl.fIsPositive = TRUE; // won't fit |
| 565 { |
| 566 if (dl.fitsIntoInt64(FALSE)) { |
| 567 errln(fail + "-(" + int64minstr + ") didn't fit"); |
| 568 } |
| 569 }*/ |
| 570 } |
| 571 |
| 572 // ------------------------------------- |
| 573 |
| 574 // Test the handling of quotes |
| 575 void |
| 576 NumberFormatTest::TestQuotes(void) |
| 577 { |
| 578 UErrorCode status = U_ZERO_ERROR; |
| 579 UnicodeString *pat; |
| 580 DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), status
); |
| 581 if (U_FAILURE(status)) { |
| 582 errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorNa
me(status)); |
| 583 delete sym; |
| 584 return; |
| 585 } |
| 586 pat = new UnicodeString("a'fo''o'b#"); |
| 587 DecimalFormat *fmt = new DecimalFormat(*pat, *sym, status); |
| 588 UnicodeString s; |
| 589 ((NumberFormat*)fmt)->format((int32_t)123, s); |
| 590 logln((UnicodeString)"Pattern \"" + *pat + "\""); |
| 591 logln((UnicodeString)" Format 123 -> " + escape(s)); |
| 592 if (!(s=="afo'ob123")) |
| 593 errln((UnicodeString)"FAIL: Expected afo'ob123"); |
| 594 |
| 595 s.truncate(0); |
| 596 delete fmt; |
| 597 delete pat; |
| 598 |
| 599 pat = new UnicodeString("a''b#"); |
| 600 fmt = new DecimalFormat(*pat, *sym, status); |
| 601 ((NumberFormat*)fmt)->format((int32_t)123, s); |
| 602 logln((UnicodeString)"Pattern \"" + *pat + "\""); |
| 603 logln((UnicodeString)" Format 123 -> " + escape(s)); |
| 604 if (!(s=="a'b123")) |
| 605 errln((UnicodeString)"FAIL: Expected a'b123"); |
| 606 delete fmt; |
| 607 delete pat; |
| 608 delete sym; |
| 609 } |
| 610 |
| 611 /** |
| 612 * Test the handling of the currency symbol in patterns. |
| 613 */ |
| 614 void |
| 615 NumberFormatTest::TestCurrencySign(void) |
| 616 { |
| 617 UErrorCode status = U_ZERO_ERROR; |
| 618 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale::getUS(), status
); |
| 619 UnicodeString pat; |
| 620 UChar currency = 0x00A4; |
| 621 if (U_FAILURE(status)) { |
| 622 errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorNa
me(status)); |
| 623 delete sym; |
| 624 return; |
| 625 } |
| 626 // "\xA4#,##0.00;-\xA4#,##0.00" |
| 627 pat.append(currency).append("#,##0.00;-"). |
| 628 append(currency).append("#,##0.00"); |
| 629 DecimalFormat *fmt = new DecimalFormat(pat, *sym, status); |
| 630 UnicodeString s; ((NumberFormat*)fmt)->format(1234.56, s); |
| 631 pat.truncate(0); |
| 632 logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); |
| 633 logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); |
| 634 if (s != "$1,234.56") dataerrln((UnicodeString)"FAIL: Expected $1,234.56"); |
| 635 s.truncate(0); |
| 636 ((NumberFormat*)fmt)->format(- 1234.56, s); |
| 637 logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); |
| 638 if (s != "-$1,234.56") dataerrln((UnicodeString)"FAIL: Expected -$1,234.56")
; |
| 639 delete fmt; |
| 640 pat.truncate(0); |
| 641 // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00" |
| 642 pat.append(currency).append(currency). |
| 643 append(" #,##0.00;"). |
| 644 append(currency).append(currency). |
| 645 append(" -#,##0.00"); |
| 646 fmt = new DecimalFormat(pat, *sym, status); |
| 647 s.truncate(0); |
| 648 ((NumberFormat*)fmt)->format(1234.56, s); |
| 649 logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); |
| 650 logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); |
| 651 if (s != "USD 1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD 1,234.
56"); |
| 652 s.truncate(0); |
| 653 ((NumberFormat*)fmt)->format(-1234.56, s); |
| 654 logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); |
| 655 if (s != "USD -1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD -1,23
4.56"); |
| 656 delete fmt; |
| 657 delete sym; |
| 658 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + u_errorName(st
atus)); |
| 659 } |
| 660 |
| 661 // ------------------------------------- |
| 662 |
| 663 static UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41
- 10))); } |
| 664 |
| 665 UnicodeString& |
| 666 NumberFormatTest::escape(UnicodeString& s) |
| 667 { |
| 668 UnicodeString buf; |
| 669 for (int32_t i=0; i<s.length(); ++i) |
| 670 { |
| 671 UChar c = s[(int32_t)i]; |
| 672 if (c <= (UChar)0x7F) buf += c; |
| 673 else { |
| 674 buf += (UChar)0x5c; buf += (UChar)0x55; |
| 675 buf += toHexString((c & 0xF000) >> 12); |
| 676 buf += toHexString((c & 0x0F00) >> 8); |
| 677 buf += toHexString((c & 0x00F0) >> 4); |
| 678 buf += toHexString(c & 0x000F); |
| 679 } |
| 680 } |
| 681 return (s = buf); |
| 682 } |
| 683 |
| 684 |
| 685 // ------------------------------------- |
| 686 static const char* testCases[][2]= { |
| 687 /* locale ID */ /* expected */ |
| 688 {"ca_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
| 689 {"de_LU_PREEURO", "1,150\\u00A0F" }, |
| 690 {"el_GR_PREEURO", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" }, |
| 691 {"en_BE_PREEURO", "1.150,50\\u00A0BF" }, |
| 692 {"es_ES_PREEURO", "\\u20A7\\u00A01.150" }, |
| 693 {"eu_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
| 694 {"gl_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
| 695 {"it_IT_PREEURO", "IT\\u20A4\\u00A01.150" }, |
| 696 {"pt_PT_PREEURO", "1,150$50\\u00A0Esc."}, |
| 697 {"en_US@currency=JPY", "\\u00A51,150"}, |
| 698 {"en_US@currency=jpy", "\\u00A51,150"}, |
| 699 {"en-US-u-cu-jpy", "\\u00A51,150"} |
| 700 }; |
| 701 /** |
| 702 * Test localized currency patterns. |
| 703 */ |
| 704 void |
| 705 NumberFormatTest::TestCurrency(void) |
| 706 { |
| 707 UErrorCode status = U_ZERO_ERROR; |
| 708 NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(Locale::get
CanadaFrench(), status); |
| 709 if (U_FAILURE(status)) { |
| 710 dataerrln("Error calling NumberFormat::createCurrencyInstance()"); |
| 711 return; |
| 712 } |
| 713 |
| 714 UnicodeString s; currencyFmt->format(1.50, s); |
| 715 logln((UnicodeString)"Un pauvre ici a..........." + s); |
| 716 if (!(s==CharsToUnicodeString("1,50\\u00A0$"))) |
| 717 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>$"); |
| 718 delete currencyFmt; |
| 719 s.truncate(0); |
| 720 char loc[256]={0}; |
| 721 int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); |
| 722 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status); |
| 723 currencyFmt->format(1.50, s); |
| 724 logln((UnicodeString)"Un pauvre en Allemagne a.." + s); |
| 725 if (!(s==CharsToUnicodeString("1,50\\u00A0DM"))) |
| 726 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>DM"); |
| 727 delete currencyFmt; |
| 728 s.truncate(0); |
| 729 len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); |
| 730 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); |
| 731 currencyFmt->format(1.50, s); |
| 732 logln((UnicodeString)"Un pauvre en France a....." + s); |
| 733 if (!(s==CharsToUnicodeString("1,50\\u00A0F"))) |
| 734 errln((UnicodeString)"FAIL: Expected 1,50<nbsp>F"); |
| 735 delete currencyFmt; |
| 736 if (U_FAILURE(status)) |
| 737 errln((UnicodeString)"FAIL: Status " + (int32_t)status); |
| 738 |
| 739 for(int i=0; i < (int)(sizeof(testCases)/sizeof(testCases[i])); i++){ |
| 740 status = U_ZERO_ERROR; |
| 741 const char *localeID = testCases[i][0]; |
| 742 UnicodeString expected(testCases[i][1], -1, US_INV); |
| 743 expected = expected.unescape(); |
| 744 s.truncate(0); |
| 745 char loc[256]={0}; |
| 746 uloc_canonicalize(localeID, loc, 256, &status); |
| 747 currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); |
| 748 if(U_FAILURE(status)){ |
| 749 errln("Could not create currency formatter for locale %s",localeID); |
| 750 continue; |
| 751 } |
| 752 currencyFmt->format(1150.50, s); |
| 753 if(s!=expected){ |
| 754 errln(UnicodeString("FAIL: Expected: ")+expected |
| 755 + UnicodeString(" Got: ") + s |
| 756 + UnicodeString( " for locale: ")+ UnicodeString(localeID) )
; |
| 757 } |
| 758 if (U_FAILURE(status)){ |
| 759 errln((UnicodeString)"FAIL: Status " + (int32_t)status); |
| 760 } |
| 761 delete currencyFmt; |
| 762 } |
| 763 } |
| 764 |
| 765 // ------------------------------------- |
| 766 |
| 767 /** |
| 768 * Test the Currency object handling, new as of ICU 2.2. |
| 769 */ |
| 770 void NumberFormatTest::TestCurrencyObject() { |
| 771 UErrorCode ec = U_ZERO_ERROR; |
| 772 NumberFormat* fmt = |
| 773 NumberFormat::createCurrencyInstance(Locale::getUS(), ec); |
| 774 |
| 775 if (U_FAILURE(ec)) { |
| 776 dataerrln("FAIL: getCurrencyInstance(US) - %s", u_errorName(ec)); |
| 777 delete fmt; |
| 778 return; |
| 779 } |
| 780 |
| 781 Locale null("", "", ""); |
| 782 |
| 783 expectCurrency(*fmt, null, 1234.56, "$1,234.56"); |
| 784 |
| 785 expectCurrency(*fmt, Locale::getFrance(), |
| 786 1234.56, CharsToUnicodeString("\\u20AC1,234.56")); // Euro |
| 787 |
| 788 expectCurrency(*fmt, Locale::getJapan(), |
| 789 1234.56, CharsToUnicodeString("\\u00A51,235")); // Yen |
| 790 |
| 791 expectCurrency(*fmt, Locale("fr", "CH", ""), |
| 792 1234.56, "CHF1,234.55"); // 0.05 rounding |
| 793 |
| 794 expectCurrency(*fmt, Locale::getUS(), |
| 795 1234.56, "$1,234.56"); |
| 796 |
| 797 delete fmt; |
| 798 fmt = NumberFormat::createCurrencyInstance(Locale::getFrance(), ec); |
| 799 |
| 800 if (U_FAILURE(ec)) { |
| 801 errln("FAIL: getCurrencyInstance(FRANCE)"); |
| 802 delete fmt; |
| 803 return; |
| 804 } |
| 805 |
| 806 expectCurrency(*fmt, null, 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")
); |
| 807 |
| 808 expectCurrency(*fmt, Locale::getJapan(), |
| 809 1234.56, CharsToUnicodeString("1 235 \\u00A5JP")); // Yen |
| 810 |
| 811 expectCurrency(*fmt, Locale("fr", "CH", ""), |
| 812 1234.56, "1 234,55 CHF"); // 0.05 rounding |
| 813 |
| 814 expectCurrency(*fmt, Locale::getUS(), |
| 815 1234.56, "1 234,56 $US"); |
| 816 |
| 817 expectCurrency(*fmt, Locale::getFrance(), |
| 818 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); // Euro |
| 819 |
| 820 delete fmt; |
| 821 } |
| 822 |
| 823 // ------------------------------------- |
| 824 |
| 825 /** |
| 826 * Do rudimentary testing of parsing. |
| 827 */ |
| 828 void |
| 829 NumberFormatTest::TestParse(void) |
| 830 { |
| 831 UErrorCode status = U_ZERO_ERROR; |
| 832 UnicodeString arg("0"); |
| 833 DecimalFormat* format = new DecimalFormat("00", status); |
| 834 //try { |
| 835 Formattable n; format->parse(arg, n, status); |
| 836 logln((UnicodeString)"parse(" + arg + ") = " + n.getLong()); |
| 837 if (n.getType() != Formattable::kLong || |
| 838 n.getLong() != 0) errln((UnicodeString)"FAIL: Expected 0"); |
| 839 delete format; |
| 840 if (U_FAILURE(status)) errcheckln(status, (UnicodeString)"FAIL: Status " + u
_errorName(status)); |
| 841 //} |
| 842 //catch(Exception e) { |
| 843 // errln((UnicodeString)"Exception caught: " + e); |
| 844 //} |
| 845 } |
| 846 |
| 847 // ------------------------------------- |
| 848 |
| 849 /** |
| 850 * Test proper rounding by the format method. |
| 851 */ |
| 852 void |
| 853 NumberFormatTest::TestRounding487(void) |
| 854 { |
| 855 UErrorCode status = U_ZERO_ERROR; |
| 856 NumberFormat *nf = NumberFormat::createInstance(status); |
| 857 if (U_FAILURE(status)) { |
| 858 dataerrln("Error calling NumberFormat::createInstance()"); |
| 859 return; |
| 860 } |
| 861 |
| 862 roundingTest(*nf, 0.00159999, 4, "0.0016"); |
| 863 roundingTest(*nf, 0.00995, 4, "0.01"); |
| 864 |
| 865 roundingTest(*nf, 12.3995, 3, "12.4"); |
| 866 |
| 867 roundingTest(*nf, 12.4999, 0, "12"); |
| 868 roundingTest(*nf, - 19.5, 0, "-20"); |
| 869 delete nf; |
| 870 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)statu
s); |
| 871 } |
| 872 |
| 873 /** |
| 874 * Test the functioning of the secondary grouping value. |
| 875 */ |
| 876 void NumberFormatTest::TestSecondaryGrouping(void) { |
| 877 UErrorCode status = U_ZERO_ERROR; |
| 878 DecimalFormatSymbols US(Locale::getUS(), status); |
| 879 CHECK(status, "DecimalFormatSymbols ct"); |
| 880 |
| 881 DecimalFormat f("#,##,###", US, status); |
| 882 CHECK(status, "DecimalFormat ct"); |
| 883 |
| 884 expect2(f, (int32_t)123456789L, "12,34,56,789"); |
| 885 expectPat(f, "#,##,###"); |
| 886 f.applyPattern("#,###", status); |
| 887 CHECK(status, "applyPattern"); |
| 888 |
| 889 f.setSecondaryGroupingSize(4); |
| 890 expect2(f, (int32_t)123456789L, "12,3456,789"); |
| 891 expectPat(f, "#,####,###"); |
| 892 NumberFormat *g = NumberFormat::createInstance(Locale("hi", "IN"), status); |
| 893 CHECK_DATA(status, "createInstance(hi_IN)"); |
| 894 |
| 895 UnicodeString out; |
| 896 int32_t l = (int32_t)1876543210L; |
| 897 g->format(l, out); |
| 898 delete g; |
| 899 // expect "1,87,65,43,210", but with Hindi digits |
| 900 // 01234567890123 |
| 901 UBool ok = TRUE; |
| 902 if (out.length() != 14) { |
| 903 ok = FALSE; |
| 904 } else { |
| 905 for (int32_t i=0; i<out.length(); ++i) { |
| 906 UBool expectGroup = FALSE; |
| 907 switch (i) { |
| 908 case 1: |
| 909 case 4: |
| 910 case 7: |
| 911 case 10: |
| 912 expectGroup = TRUE; |
| 913 break; |
| 914 } |
| 915 // Later -- fix this to get the actual grouping |
| 916 // character from the resource bundle. |
| 917 UBool isGroup = (out.charAt(i) == 0x002C); |
| 918 if (isGroup != expectGroup) { |
| 919 ok = FALSE; |
| 920 break; |
| 921 } |
| 922 } |
| 923 } |
| 924 if (!ok) { |
| 925 errln((UnicodeString)"FAIL Expected " + l + |
| 926 " x hi_IN -> \"1,87,65,43,210\" (with Hindi digits), got \"" + |
| 927 escape(out) + "\""); |
| 928 } else { |
| 929 logln((UnicodeString)"Ok " + l + |
| 930 " x hi_IN -> \"" + |
| 931 escape(out) + "\""); |
| 932 } |
| 933 } |
| 934 |
| 935 void NumberFormatTest::TestWhiteSpaceParsing(void) { |
| 936 UErrorCode ec = U_ZERO_ERROR; |
| 937 DecimalFormatSymbols US(Locale::getUS(), ec); |
| 938 DecimalFormat fmt("a b#0c ", US, ec); |
| 939 if (U_FAILURE(ec)) { |
| 940 errcheckln(ec, "FAIL: Constructor - %s", u_errorName(ec)); |
| 941 return; |
| 942 } |
| 943 int32_t n = 1234; |
| 944 expect(fmt, "a b1234c ", n); |
| 945 expect(fmt, "a b1234c ", n); |
| 946 } |
| 947 |
| 948 /** |
| 949 * Test currencies whose display name is a ChoiceFormat. |
| 950 */ |
| 951 void NumberFormatTest::TestComplexCurrency() { |
| 952 |
| 953 // UErrorCode ec = U_ZERO_ERROR; |
| 954 // Locale loc("kn", "IN", ""); |
| 955 // NumberFormat* fmt = NumberFormat::createCurrencyInstance(loc, ec); |
| 956 // if (U_SUCCESS(ec)) { |
| 957 // expect2(*fmt, 1.0, CharsToUnicodeString("Re.\\u00A01.00")); |
| 958 // Use .00392625 because that's 2^-8. Any value less than 0.005 is fine. |
| 959 // expect(*fmt, 1.00390625, CharsToUnicodeString("Re.\\u00A01.00")); // t
ricky |
| 960 // expect2(*fmt, 12345678.0, CharsToUnicodeString("Rs.\\u00A01,23,45,678.
00")); |
| 961 // expect2(*fmt, 0.5, CharsToUnicodeString("Rs.\\u00A00.50")); |
| 962 // expect2(*fmt, -1.0, CharsToUnicodeString("-Re.\\u00A01.00")); |
| 963 // expect2(*fmt, -10.0, CharsToUnicodeString("-Rs.\\u00A010.00")); |
| 964 // } else { |
| 965 // errln("FAIL: getCurrencyInstance(kn_IN)"); |
| 966 // } |
| 967 // delete fmt; |
| 968 |
| 969 } |
| 970 |
| 971 // ------------------------------------- |
| 972 |
| 973 void |
| 974 NumberFormatTest::roundingTest(NumberFormat& nf, double x, int32_t maxFractionDi
gits, const char* expected) |
| 975 { |
| 976 nf.setMaximumFractionDigits(maxFractionDigits); |
| 977 UnicodeString out; nf.format(x, out); |
| 978 logln((UnicodeString)"" + x + " formats with " + maxFractionDigits + " fract
ional digits to " + out); |
| 979 if (!(out==expected)) errln((UnicodeString)"FAIL: Expected " + expected); |
| 980 } |
| 981 |
| 982 /** |
| 983 * Upgrade to alphaWorks |
| 984 */ |
| 985 void NumberFormatTest::TestExponent(void) { |
| 986 UErrorCode status = U_ZERO_ERROR; |
| 987 DecimalFormatSymbols US(Locale::getUS(), status); |
| 988 CHECK(status, "DecimalFormatSymbols constructor"); |
| 989 DecimalFormat fmt1(UnicodeString("0.###E0"), US, status); |
| 990 CHECK(status, "DecimalFormat(0.###E0)"); |
| 991 DecimalFormat fmt2(UnicodeString("0.###E+0"), US, status); |
| 992 CHECK(status, "DecimalFormat(0.###E+0)"); |
| 993 int32_t n = 1234; |
| 994 expect2(fmt1, n, "1.234E3"); |
| 995 expect2(fmt2, n, "1.234E+3"); |
| 996 expect(fmt1, "1.234E+3", n); // Either format should parse "E+3" |
| 997 } |
| 998 |
| 999 /** |
| 1000 * Upgrade to alphaWorks |
| 1001 */ |
| 1002 void NumberFormatTest::TestScientific(void) { |
| 1003 UErrorCode status = U_ZERO_ERROR; |
| 1004 DecimalFormatSymbols US(Locale::getUS(), status); |
| 1005 CHECK(status, "DecimalFormatSymbols constructor"); |
| 1006 |
| 1007 // Test pattern round-trip |
| 1008 const char* PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", |
| 1009 "0.###E0;[0.###E0]" }; |
| 1010 int32_t PAT_length = (int32_t)(sizeof(PAT) / sizeof(PAT[0])); |
| 1011 int32_t DIGITS[] = { |
| 1012 // min int, max int, min frac, max frac |
| 1013 0, 1, 0, 0, // "#E0" |
| 1014 1, 1, 0, 4, // "0.####E0" |
| 1015 2, 2, 3, 3, // "00.000E00" |
| 1016 1, 3, 0, 4, // "##0.####E000" |
| 1017 1, 1, 0, 3, // "0.###E0;[0.###E0]" |
| 1018 }; |
| 1019 for (int32_t i=0; i<PAT_length; ++i) { |
| 1020 UnicodeString pat(PAT[i]); |
| 1021 DecimalFormat df(pat, US, status); |
| 1022 CHECK(status, "DecimalFormat constructor"); |
| 1023 UnicodeString pat2; |
| 1024 df.toPattern(pat2); |
| 1025 if (pat == pat2) { |
| 1026 logln(UnicodeString("Ok Pattern rt \"") + |
| 1027 pat + "\" -> \"" + |
| 1028 pat2 + "\""); |
| 1029 } else { |
| 1030 errln(UnicodeString("FAIL Pattern rt \"") + |
| 1031 pat + "\" -> \"" + |
| 1032 pat2 + "\""); |
| 1033 } |
| 1034 // Make sure digit counts match what we expect |
| 1035 if (df.getMinimumIntegerDigits() != DIGITS[4*i] || |
| 1036 df.getMaximumIntegerDigits() != DIGITS[4*i+1] || |
| 1037 df.getMinimumFractionDigits() != DIGITS[4*i+2] || |
| 1038 df.getMaximumFractionDigits() != DIGITS[4*i+3]) { |
| 1039 errln(UnicodeString("FAIL \"" + pat + |
| 1040 "\" min/max int; min/max frac = ") + |
| 1041 df.getMinimumIntegerDigits() + "/" + |
| 1042 df.getMaximumIntegerDigits() + ";" + |
| 1043 df.getMinimumFractionDigits() + "/" + |
| 1044 df.getMaximumFractionDigits() + ", expect " + |
| 1045 DIGITS[4*i] + "/" + |
| 1046 DIGITS[4*i+1] + ";" + |
| 1047 DIGITS[4*i+2] + "/" + |
| 1048 DIGITS[4*i+3]); |
| 1049 } |
| 1050 } |
| 1051 |
| 1052 |
| 1053 // Test the constructor for default locale. We have to |
| 1054 // manually set the default locale, as there is no |
| 1055 // guarantee that the default locale has the same |
| 1056 // scientific format. |
| 1057 Locale def = Locale::getDefault(); |
| 1058 Locale::setDefault(Locale::getUS(), status); |
| 1059 expect2(NumberFormat::createScientificInstance(status), |
| 1060 12345.678901, |
| 1061 "1.2345678901E4", status); |
| 1062 Locale::setDefault(def, status); |
| 1063 |
| 1064 expect2(new DecimalFormat("#E0", US, status), |
| 1065 12345.0, |
| 1066 "1.2345E4", status); |
| 1067 expect(new DecimalFormat("0E0", US, status), |
| 1068 12345.0, |
| 1069 "1E4", status); |
| 1070 expect2(NumberFormat::createScientificInstance(Locale::getUS(), status), |
| 1071 12345.678901, |
| 1072 "1.2345678901E4", status); |
| 1073 expect(new DecimalFormat("##0.###E0", US, status), |
| 1074 12345.0, |
| 1075 "12.34E3", status); |
| 1076 expect(new DecimalFormat("##0.###E0", US, status), |
| 1077 12345.00001, |
| 1078 "12.35E3", status); |
| 1079 expect2(new DecimalFormat("##0.####E0", US, status), |
| 1080 (int32_t) 12345, |
| 1081 "12.345E3", status); |
| 1082 expect2(NumberFormat::createScientificInstance(Locale::getFrance(), status), |
| 1083 12345.678901, |
| 1084 "1,2345678901E4", status); |
| 1085 expect(new DecimalFormat("##0.####E0", US, status), |
| 1086 789.12345e-9, |
| 1087 "789.12E-9", status); |
| 1088 expect2(new DecimalFormat("##0.####E0", US, status), |
| 1089 780.e-9, |
| 1090 "780E-9", status); |
| 1091 expect(new DecimalFormat(".###E0", US, status), |
| 1092 45678.0, |
| 1093 ".457E5", status); |
| 1094 expect2(new DecimalFormat(".###E0", US, status), |
| 1095 (int32_t) 0, |
| 1096 ".0E0", status); |
| 1097 /* |
| 1098 expect(new DecimalFormat[] { new DecimalFormat("#E0", US), |
| 1099 new DecimalFormat("##E0", US), |
| 1100 new DecimalFormat("####E0", US), |
| 1101 new DecimalFormat("0E0", US), |
| 1102 new DecimalFormat("00E0", US), |
| 1103 new DecimalFormat("000E0", US), |
| 1104 }, |
| 1105 new Long(45678000), |
| 1106 new String[] { "4.5678E7", |
| 1107 "45.678E6", |
| 1108 "4567.8E4", |
| 1109 "5E7", |
| 1110 "46E6", |
| 1111 "457E5", |
| 1112 } |
| 1113 ); |
| 1114 ! |
| 1115 ! Unroll this test into individual tests below... |
| 1116 ! |
| 1117 */ |
| 1118 expect2(new DecimalFormat("#E0", US, status), |
| 1119 (int32_t) 45678000, "4.5678E7", status); |
| 1120 expect2(new DecimalFormat("##E0", US, status), |
| 1121 (int32_t) 45678000, "45.678E6", status); |
| 1122 expect2(new DecimalFormat("####E0", US, status), |
| 1123 (int32_t) 45678000, "4567.8E4", status); |
| 1124 expect(new DecimalFormat("0E0", US, status), |
| 1125 (int32_t) 45678000, "5E7", status); |
| 1126 expect(new DecimalFormat("00E0", US, status), |
| 1127 (int32_t) 45678000, "46E6", status); |
| 1128 expect(new DecimalFormat("000E0", US, status), |
| 1129 (int32_t) 45678000, "457E5", status); |
| 1130 /* |
| 1131 expect(new DecimalFormat("###E0", US, status), |
| 1132 new Object[] { new Double(0.0000123), "12.3E-6", |
| 1133 new Double(0.000123), "123E-6", |
| 1134 new Double(0.00123), "1.23E-3", |
| 1135 new Double(0.0123), "12.3E-3", |
| 1136 new Double(0.123), "123E-3", |
| 1137 new Double(1.23), "1.23E0", |
| 1138 new Double(12.3), "12.3E0", |
| 1139 new Double(123), "123E0", |
| 1140 new Double(1230), "1.23E3", |
| 1141 }); |
| 1142 ! |
| 1143 ! Unroll this test into individual tests below... |
| 1144 ! |
| 1145 */ |
| 1146 expect2(new DecimalFormat("###E0", US, status), |
| 1147 0.0000123, "12.3E-6", status); |
| 1148 expect2(new DecimalFormat("###E0", US, status), |
| 1149 0.000123, "123E-6", status); |
| 1150 expect2(new DecimalFormat("###E0", US, status), |
| 1151 0.00123, "1.23E-3", status); |
| 1152 expect2(new DecimalFormat("###E0", US, status), |
| 1153 0.0123, "12.3E-3", status); |
| 1154 expect2(new DecimalFormat("###E0", US, status), |
| 1155 0.123, "123E-3", status); |
| 1156 expect2(new DecimalFormat("###E0", US, status), |
| 1157 1.23, "1.23E0", status); |
| 1158 expect2(new DecimalFormat("###E0", US, status), |
| 1159 12.3, "12.3E0", status); |
| 1160 expect2(new DecimalFormat("###E0", US, status), |
| 1161 123.0, "123E0", status); |
| 1162 expect2(new DecimalFormat("###E0", US, status), |
| 1163 1230.0, "1.23E3", status); |
| 1164 /* |
| 1165 expect(new DecimalFormat("0.#E+00", US, status), |
| 1166 new Object[] { new Double(0.00012), "1.2E-04", |
| 1167 new Long(12000), "1.2E+04", |
| 1168 }); |
| 1169 ! |
| 1170 ! Unroll this test into individual tests below... |
| 1171 ! |
| 1172 */ |
| 1173 expect2(new DecimalFormat("0.#E+00", US, status), |
| 1174 0.00012, "1.2E-04", status); |
| 1175 expect2(new DecimalFormat("0.#E+00", US, status), |
| 1176 (int32_t) 12000, "1.2E+04", status); |
| 1177 } |
| 1178 |
| 1179 /** |
| 1180 * Upgrade to alphaWorks |
| 1181 */ |
| 1182 void NumberFormatTest::TestPad(void) { |
| 1183 UErrorCode status = U_ZERO_ERROR; |
| 1184 DecimalFormatSymbols US(Locale::getUS(), status); |
| 1185 CHECK(status, "DecimalFormatSymbols constructor"); |
| 1186 |
| 1187 expect2(new DecimalFormat("*^##.##", US, status), |
| 1188 int32_t(0), "^^^^0", status); |
| 1189 expect2(new DecimalFormat("*^##.##", US, status), |
| 1190 -1.3, "^-1.3", status); |
| 1191 expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), |
| 1192 int32_t(0), "0.0E0______ g-m/s^2", status); |
| 1193 expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), |
| 1194 1.0/3, "333.333E-3_ g-m/s^2", status); |
| 1195 expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), |
| 1196 int32_t(0), "0.0______ g-m/s^2", status); |
| 1197 expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), |
| 1198 1.0/3, "0.33333__ g-m/s^2", status); |
| 1199 |
| 1200 // Test padding before a sign |
| 1201 const char *formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)"; |
| 1202 expect2(new DecimalFormat(formatStr, US, status), |
| 1203 int32_t(-10), "xxxxxxxxxx(10.0)", status); |
| 1204 expect2(new DecimalFormat(formatStr, US, status), |
| 1205 int32_t(-1000),"xxxxxxx(1,000.0)", status); |
| 1206 expect2(new DecimalFormat(formatStr, US, status), |
| 1207 int32_t(-1000000),"xxx(1,000,000.0)", status); |
| 1208 expect2(new DecimalFormat(formatStr, US, status), |
| 1209 -100.37, "xxxxxxxx(100.37)", status); |
| 1210 expect2(new DecimalFormat(formatStr, US, status), |
| 1211 -10456.37, "xxxxx(10,456.37)", status); |
| 1212 expect2(new DecimalFormat(formatStr, US, status), |
| 1213 -1120456.37, "xx(1,120,456.37)", status); |
| 1214 expect2(new DecimalFormat(formatStr, US, status), |
| 1215 -112045600.37, "(112,045,600.37)", status); |
| 1216 expect2(new DecimalFormat(formatStr, US, status), |
| 1217 -1252045600.37,"(1,252,045,600.37)", status); |
| 1218 |
| 1219 expect2(new DecimalFormat(formatStr, US, status), |
| 1220 int32_t(10), "xxxxxxxxxxxx10.0", status); |
| 1221 expect2(new DecimalFormat(formatStr, US, status), |
| 1222 int32_t(1000),"xxxxxxxxx1,000.0", status); |
| 1223 expect2(new DecimalFormat(formatStr, US, status), |
| 1224 int32_t(1000000),"xxxxx1,000,000.0", status); |
| 1225 expect2(new DecimalFormat(formatStr, US, status), |
| 1226 100.37, "xxxxxxxxxx100.37", status); |
| 1227 expect2(new DecimalFormat(formatStr, US, status), |
| 1228 10456.37, "xxxxxxx10,456.37", status); |
| 1229 expect2(new DecimalFormat(formatStr, US, status), |
| 1230 1120456.37, "xxxx1,120,456.37", status); |
| 1231 expect2(new DecimalFormat(formatStr, US, status), |
| 1232 112045600.37, "xx112,045,600.37", status); |
| 1233 expect2(new DecimalFormat(formatStr, US, status), |
| 1234 10252045600.37,"10,252,045,600.37", status); |
| 1235 |
| 1236 |
| 1237 // Test padding between a sign and a number |
| 1238 const char *formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)"; |
| 1239 expect2(new DecimalFormat(formatStr2, US, status), |
| 1240 int32_t(-10), "(10.0xxxxxxxxxx)", status); |
| 1241 expect2(new DecimalFormat(formatStr2, US, status), |
| 1242 int32_t(-1000),"(1,000.0xxxxxxx)", status); |
| 1243 expect2(new DecimalFormat(formatStr2, US, status), |
| 1244 int32_t(-1000000),"(1,000,000.0xxx)", status); |
| 1245 expect2(new DecimalFormat(formatStr2, US, status), |
| 1246 -100.37, "(100.37xxxxxxxx)", status); |
| 1247 expect2(new DecimalFormat(formatStr2, US, status), |
| 1248 -10456.37, "(10,456.37xxxxx)", status); |
| 1249 expect2(new DecimalFormat(formatStr2, US, status), |
| 1250 -1120456.37, "(1,120,456.37xx)", status); |
| 1251 expect2(new DecimalFormat(formatStr2, US, status), |
| 1252 -112045600.37, "(112,045,600.37)", status); |
| 1253 expect2(new DecimalFormat(formatStr2, US, status), |
| 1254 -1252045600.37,"(1,252,045,600.37)", status); |
| 1255 |
| 1256 expect2(new DecimalFormat(formatStr2, US, status), |
| 1257 int32_t(10), "10.0xxxxxxxxxxxx", status); |
| 1258 expect2(new DecimalFormat(formatStr2, US, status), |
| 1259 int32_t(1000),"1,000.0xxxxxxxxx", status); |
| 1260 expect2(new DecimalFormat(formatStr2, US, status), |
| 1261 int32_t(1000000),"1,000,000.0xxxxx", status); |
| 1262 expect2(new DecimalFormat(formatStr2, US, status), |
| 1263 100.37, "100.37xxxxxxxxxx", status); |
| 1264 expect2(new DecimalFormat(formatStr2, US, status), |
| 1265 10456.37, "10,456.37xxxxxxx", status); |
| 1266 expect2(new DecimalFormat(formatStr2, US, status), |
| 1267 1120456.37, "1,120,456.37xxxx", status); |
| 1268 expect2(new DecimalFormat(formatStr2, US, status), |
| 1269 112045600.37, "112,045,600.37xx", status); |
| 1270 expect2(new DecimalFormat(formatStr2, US, status), |
| 1271 10252045600.37,"10,252,045,600.37", status); |
| 1272 |
| 1273 //testing the setPadCharacter(UnicodeString) and getPadCharacterString() |
| 1274 DecimalFormat fmt("#", US, status); |
| 1275 CHECK(status, "DecimalFormat constructor"); |
| 1276 UnicodeString padString("P"); |
| 1277 fmt.setPadCharacter(padString); |
| 1278 expectPad(fmt, "*P##.##", DecimalFormat::kPadBeforePrefix, 5, padString); |
| 1279 fmt.setPadCharacter((UnicodeString)"^"); |
| 1280 expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, (UnicodeString)"^"
); |
| 1281 //commented untill implementation is complete |
| 1282 /* fmt.setPadCharacter((UnicodeString)"^^^"); |
| 1283 expectPad(fmt, "*^^^#", DecimalFormat::kPadBeforePrefix, 3, (UnicodeString)"
^^^"); |
| 1284 padString.remove(); |
| 1285 padString.append((UChar)0x0061); |
| 1286 padString.append((UChar)0x0302); |
| 1287 fmt.setPadCharacter(padString); |
| 1288 UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000
}; |
| 1289 UnicodeString pattern(patternChars); |
| 1290 expectPad(fmt, pattern , DecimalFormat::kPadBeforePrefix, 4, padString); |
| 1291 */ |
| 1292 |
| 1293 } |
| 1294 |
| 1295 /** |
| 1296 * Upgrade to alphaWorks |
| 1297 */ |
| 1298 void NumberFormatTest::TestPatterns2(void) { |
| 1299 UErrorCode status = U_ZERO_ERROR; |
| 1300 DecimalFormatSymbols US(Locale::getUS(), status); |
| 1301 CHECK(status, "DecimalFormatSymbols constructor"); |
| 1302 |
| 1303 DecimalFormat fmt("#", US, status); |
| 1304 CHECK(status, "DecimalFormat constructor"); |
| 1305 |
| 1306 UChar hat = 0x005E; /*^*/ |
| 1307 |
| 1308 expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, hat); |
| 1309 expectPad(fmt, "$*^#", DecimalFormat::kPadAfterPrefix, 2, hat); |
| 1310 expectPad(fmt, "#*^", DecimalFormat::kPadBeforeSuffix, 1, hat); |
| 1311 expectPad(fmt, "#$*^", DecimalFormat::kPadAfterSuffix, 2, hat); |
| 1312 expectPad(fmt, "$*^$#", ILLEGAL); |
| 1313 expectPad(fmt, "#$*^$", ILLEGAL); |
| 1314 expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat::kPadBeforeSuffix, |
| 1315 12, (UChar)0x0078 /*x*/); |
| 1316 expectPad(fmt, "''#0*x", DecimalFormat::kPadBeforeSuffix, |
| 1317 3, (UChar)0x0078 /*x*/); |
| 1318 expectPad(fmt, "'I''ll'*a###.##", DecimalFormat::kPadAfterPrefix, |
| 1319 10, (UChar)0x0061 /*a*/); |
| 1320 |
| 1321 fmt.applyPattern("AA#,##0.00ZZ", status); |
| 1322 CHECK(status, "applyPattern"); |
| 1323 fmt.setPadCharacter(hat); |
| 1324 |
| 1325 fmt.setFormatWidth(10); |
| 1326 |
| 1327 fmt.setPadPosition(DecimalFormat::kPadBeforePrefix); |
| 1328 expectPat(fmt, "*^AA#,##0.00ZZ"); |
| 1329 |
| 1330 fmt.setPadPosition(DecimalFormat::kPadBeforeSuffix); |
| 1331 expectPat(fmt, "AA#,##0.00*^ZZ"); |
| 1332 |
| 1333 fmt.setPadPosition(DecimalFormat::kPadAfterSuffix); |
| 1334 expectPat(fmt, "AA#,##0.00ZZ*^"); |
| 1335 |
| 1336 // 12 3456789012 |
| 1337 UnicodeString exp("AA*^#,##0.00ZZ", ""); |
| 1338 fmt.setFormatWidth(12); |
| 1339 fmt.setPadPosition(DecimalFormat::kPadAfterPrefix); |
| 1340 expectPat(fmt, exp); |
| 1341 |
| 1342 fmt.setFormatWidth(13); |
| 1343 // 12 34567890123 |
| 1344 expectPat(fmt, "AA*^##,##0.00ZZ"); |
| 1345 |
| 1346 fmt.setFormatWidth(14); |
| 1347 // 12 345678901234 |
| 1348 expectPat(fmt, "AA*^###,##0.00ZZ"); |
| 1349 |
| 1350 fmt.setFormatWidth(15); |
| 1351 // 12 3456789012345 |
| 1352 expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case |
| 1353 |
| 1354 fmt.setFormatWidth(16); |
| 1355 // 12 34567890123456 |
| 1356 expectPat(fmt, "AA*^#,###,##0.00ZZ"); |
| 1357 } |
| 1358 |
| 1359 void NumberFormatTest::TestSurrogateSupport(void) { |
| 1360 UErrorCode status = U_ZERO_ERROR; |
| 1361 DecimalFormatSymbols custom(Locale::getUS(), status); |
| 1362 CHECK(status, "DecimalFormatSymbols constructor"); |
| 1363 |
| 1364 custom.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, "decimal"); |
| 1365 custom.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, "plus"); |
| 1366 custom.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, " minus "); |
| 1367 custom.setSymbol(DecimalFormatSymbols::kExponentialSymbol, "exponent"); |
| 1368 |
| 1369 UnicodeString patternStr("*\\U00010000##.##", ""); |
| 1370 patternStr = patternStr.unescape(); |
| 1371 UnicodeString expStr("\\U00010000\\U00010000\\U00010000\\U000100000", ""); |
| 1372 expStr = expStr.unescape(); |
| 1373 expect2(new DecimalFormat(patternStr, custom, status), |
| 1374 int32_t(0), expStr, status); |
| 1375 |
| 1376 status = U_ZERO_ERROR; |
| 1377 expect2(new DecimalFormat("*^##.##", custom, status), |
| 1378 int32_t(0), "^^^^0", status); |
| 1379 status = U_ZERO_ERROR; |
| 1380 expect2(new DecimalFormat("##.##", custom, status), |
| 1381 -1.3, " minus 1decimal3", status); |
| 1382 status = U_ZERO_ERROR; |
| 1383 expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), |
| 1384 int32_t(0), "0decimal0exponent0 g-m/s^2", status); |
| 1385 status = U_ZERO_ERROR; |
| 1386 expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), |
| 1387 1.0/3, "333decimal333exponent minus 3 g-m/s^2", status); |
| 1388 status = U_ZERO_ERROR; |
| 1389 expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), |
| 1390 int32_t(0), "0decimal0 g-m/s^2", status); |
| 1391 status = U_ZERO_ERROR; |
| 1392 expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), |
| 1393 1.0/3, "0decimal33333 g-m/s^2", status); |
| 1394 |
| 1395 UnicodeString zero((UChar32)0x10000); |
| 1396 UnicodeString one((UChar32)0x10001); |
| 1397 UnicodeString two((UChar32)0x10002); |
| 1398 UnicodeString five((UChar32)0x10005); |
| 1399 custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero); |
| 1400 custom.setSymbol(DecimalFormatSymbols::kOneDigitSymbol, one); |
| 1401 custom.setSymbol(DecimalFormatSymbols::kTwoDigitSymbol, two); |
| 1402 custom.setSymbol(DecimalFormatSymbols::kFiveDigitSymbol, five); |
| 1403 expStr = UnicodeString("\\U00010001decimal\\U00010002\\U00010005\\U00010000"
, ""); |
| 1404 expStr = expStr.unescape(); |
| 1405 status = U_ZERO_ERROR; |
| 1406 expect2(new DecimalFormat("##0.000", custom, status), |
| 1407 1.25, expStr, status); |
| 1408 |
| 1409 custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, (UChar)0x30); |
| 1410 custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "units of money"); |
| 1411 custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, "money sepa
rator"); |
| 1412 patternStr = UNICODE_STRING_SIMPLE("0.00 \\u00A4' in your bank account'"); |
| 1413 patternStr = patternStr.unescape(); |
| 1414 expStr = UnicodeString(" minus 20money separator00 units of money in your ba
nk account", ""); |
| 1415 status = U_ZERO_ERROR; |
| 1416 expect2(new DecimalFormat(patternStr, custom, status), |
| 1417 int32_t(-20), expStr, status); |
| 1418 |
| 1419 custom.setSymbol(DecimalFormatSymbols::kPercentSymbol, "percent"); |
| 1420 patternStr = "'You''ve lost ' -0.00 %' of your money today'"; |
| 1421 patternStr = patternStr.unescape(); |
| 1422 expStr = UnicodeString(" minus You've lost minus 2000decimal00 percent of
your money today", ""); |
| 1423 status = U_ZERO_ERROR; |
| 1424 expect2(new DecimalFormat(patternStr, custom, status), |
| 1425 int32_t(-20), expStr, status); |
| 1426 } |
| 1427 |
| 1428 void NumberFormatTest::TestCurrencyPatterns(void) { |
| 1429 int32_t i, locCount; |
| 1430 const Locale* locs = NumberFormat::getAvailableLocales(locCount); |
| 1431 for (i=0; i<locCount; ++i) { |
| 1432 UErrorCode ec = U_ZERO_ERROR; |
| 1433 NumberFormat* nf = NumberFormat::createCurrencyInstance(locs[i], ec); |
| 1434 if (U_FAILURE(ec)) { |
| 1435 errln("FAIL: Can't create NumberFormat(%s) - %s", locs[i].getName(),
u_errorName(ec)); |
| 1436 } else { |
| 1437 // Make sure currency formats do not have a variable number |
| 1438 // of fraction digits |
| 1439 int32_t min = nf->getMinimumFractionDigits(); |
| 1440 int32_t max = nf->getMaximumFractionDigits(); |
| 1441 if (min != max) { |
| 1442 UnicodeString a, b; |
| 1443 nf->format(1.0, a); |
| 1444 nf->format(1.125, b); |
| 1445 errln((UnicodeString)"FAIL: " + locs[i].getName() + |
| 1446 " min fraction digits != max fraction digits; " |
| 1447 "x 1.0 => " + escape(a) + |
| 1448 "; x 1.125 => " + escape(b)); |
| 1449 } |
| 1450 |
| 1451 // Make sure EURO currency formats have exactly 2 fraction digits |
| 1452 DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf); |
| 1453 if (df != NULL) { |
| 1454 if (u_strcmp(EUR, df->getCurrency()) == 0) { |
| 1455 if (min != 2 || max != 2) { |
| 1456 UnicodeString a; |
| 1457 nf->format(1.0, a); |
| 1458 errln((UnicodeString)"FAIL: " + locs[i].getName() + |
| 1459 " is a EURO format but it does not have 2 fraction
digits; " |
| 1460 "x 1.0 => " + |
| 1461 escape(a)); |
| 1462 } |
| 1463 } |
| 1464 } |
| 1465 } |
| 1466 delete nf; |
| 1467 } |
| 1468 } |
| 1469 |
| 1470 void NumberFormatTest::TestRegCurrency(void) { |
| 1471 #if !UCONFIG_NO_SERVICE |
| 1472 UErrorCode status = U_ZERO_ERROR; |
| 1473 UChar USD[4]; |
| 1474 ucurr_forLocale("en_US", USD, 4, &status); |
| 1475 UChar YEN[4]; |
| 1476 ucurr_forLocale("ja_JP", YEN, 4, &status); |
| 1477 UChar TMP[4]; |
| 1478 static const UChar QQQ[] = {0x51, 0x51, 0x51, 0}; |
| 1479 if(U_FAILURE(status)) { |
| 1480 errcheckln(status, "Unable to get currency for locale, error %s", u_erro
rName(status)); |
| 1481 return; |
| 1482 } |
| 1483 |
| 1484 UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status); |
| 1485 UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status); |
| 1486 |
| 1487 ucurr_forLocale("en_US", TMP, 4, &status); |
| 1488 if (u_strcmp(YEN, TMP) != 0) { |
| 1489 errln("FAIL: didn't return YEN registered for en_US"); |
| 1490 } |
| 1491 |
| 1492 ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
| 1493 if (u_strcmp(QQQ, TMP) != 0) { |
| 1494 errln("FAIL: didn't return QQQ for en_US_EURO"); |
| 1495 } |
| 1496 |
| 1497 int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status); |
| 1498 if (fallbackLen) { |
| 1499 errln("FAIL: tried to fallback en_XX_BAR"); |
| 1500 } |
| 1501 status = U_ZERO_ERROR; // reset |
| 1502 |
| 1503 if (!ucurr_unregister(enkey, &status)) { |
| 1504 errln("FAIL: couldn't unregister enkey"); |
| 1505 } |
| 1506 |
| 1507 ucurr_forLocale("en_US", TMP, 4, &status); |
| 1508 if (u_strcmp(USD, TMP) != 0) { |
| 1509 errln("FAIL: didn't return USD for en_US after unregister of en_US"); |
| 1510 } |
| 1511 status = U_ZERO_ERROR; // reset |
| 1512 |
| 1513 ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
| 1514 if (u_strcmp(QQQ, TMP) != 0) { |
| 1515 errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US"
); |
| 1516 } |
| 1517 |
| 1518 ucurr_forLocale("en_US_BLAH", TMP, 4, &status); |
| 1519 if (u_strcmp(USD, TMP) != 0) { |
| 1520 errln("FAIL: could not find USD for en_US_BLAH after unregister of en"); |
| 1521 } |
| 1522 status = U_ZERO_ERROR; // reset |
| 1523 |
| 1524 if (!ucurr_unregister(enUSEUROkey, &status)) { |
| 1525 errln("FAIL: couldn't unregister enUSEUROkey"); |
| 1526 } |
| 1527 |
| 1528 ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
| 1529 if (u_strcmp(EUR, TMP) != 0) { |
| 1530 errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_
EURO"); |
| 1531 } |
| 1532 status = U_ZERO_ERROR; // reset |
| 1533 #endif |
| 1534 } |
| 1535 |
| 1536 void NumberFormatTest::TestCurrencyNames(void) { |
| 1537 // Do a basic check of getName() |
| 1538 // USD { "US$", "US Dollar" } // 04/04/1792- |
| 1539 UErrorCode ec = U_ZERO_ERROR; |
| 1540 static const UChar USD[] = {0x55, 0x53, 0x44, 0}; /*USD*/ |
| 1541 static const UChar USX[] = {0x55, 0x53, 0x58, 0}; /*USX*/ |
| 1542 static const UChar CAD[] = {0x43, 0x41, 0x44, 0}; /*CAD*/ |
| 1543 static const UChar ITL[] = {0x49, 0x54, 0x4C, 0}; /*ITL*/ |
| 1544 UBool isChoiceFormat; |
| 1545 int32_t len; |
| 1546 const UBool possibleDataError = TRUE; |
| 1547 // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK |
| 1548 // THE LOCALE DATA before diving into the code. |
| 1549 assertEquals("USD.getName(SYMBOL_NAME)", |
| 1550 UnicodeString("$"), |
| 1551 UnicodeString(ucurr_getName(USD, "en", |
| 1552 UCURR_SYMBOL_NAME, |
| 1553 &isChoiceFormat, &len, &ec)), |
| 1554 possibleDataError); |
| 1555 assertEquals("USD.getName(LONG_NAME)", |
| 1556 UnicodeString("US Dollar"), |
| 1557 UnicodeString(ucurr_getName(USD, "en", |
| 1558 UCURR_LONG_NAME, |
| 1559 &isChoiceFormat, &len, &ec)), |
| 1560 possibleDataError); |
| 1561 assertEquals("CAD.getName(SYMBOL_NAME)", |
| 1562 UnicodeString("CA$"), |
| 1563 UnicodeString(ucurr_getName(CAD, "en", |
| 1564 UCURR_SYMBOL_NAME, |
| 1565 &isChoiceFormat, &len, &ec)), |
| 1566 possibleDataError); |
| 1567 assertEquals("CAD.getName(SYMBOL_NAME)", |
| 1568 UnicodeString("$"), |
| 1569 UnicodeString(ucurr_getName(CAD, "en_CA", |
| 1570 UCURR_SYMBOL_NAME, |
| 1571 &isChoiceFormat, &len, &ec)), |
| 1572 possibleDataError); |
| 1573 assertEquals("USD.getName(SYMBOL_NAME)", |
| 1574 UnicodeString("US$"), |
| 1575 UnicodeString(ucurr_getName(USD, "en_AU", |
| 1576 UCURR_SYMBOL_NAME, |
| 1577 &isChoiceFormat, &len, &ec)), |
| 1578 possibleDataError); |
| 1579 assertEquals("CAD.getName(SYMBOL_NAME)", |
| 1580 UnicodeString("CA$"), |
| 1581 UnicodeString(ucurr_getName(CAD, "en_AU", |
| 1582 UCURR_SYMBOL_NAME, |
| 1583 &isChoiceFormat, &len, &ec)), |
| 1584 possibleDataError); |
| 1585 assertEquals("USX.getName(LONG_NAME)", |
| 1586 UnicodeString("USX"), |
| 1587 UnicodeString(ucurr_getName(USX, "en_US", |
| 1588 UCURR_LONG_NAME, |
| 1589 &isChoiceFormat, &len, &ec)), |
| 1590 possibleDataError); |
| 1591 assertSuccess("ucurr_getName", ec); |
| 1592 |
| 1593 ec = U_ZERO_ERROR; |
| 1594 |
| 1595 // Test that a default or fallback warning is being returned. JB 4239. |
| 1596 ucurr_getName(CAD, "es_ES", UCURR_LONG_NAME, &isChoiceFormat, |
| 1597 &len, &ec); |
| 1598 assertTrue("ucurr_getName (es_ES fallback)", |
| 1599 U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); |
| 1600 |
| 1601 ucurr_getName(CAD, "zh_TW", UCURR_LONG_NAME, &isChoiceFormat, |
| 1602 &len, &ec); |
| 1603 assertTrue("ucurr_getName (zh_TW fallback)", |
| 1604 U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); |
| 1605 |
| 1606 ucurr_getName(CAD, "en_US", UCURR_LONG_NAME, &isChoiceFormat, |
| 1607 &len, &ec); |
| 1608 assertTrue("ucurr_getName (en_US default)", |
| 1609 U_USING_DEFAULT_WARNING == ec || U_USING_FALLBACK_WARNING ==
ec, TRUE); |
| 1610 |
| 1611 ucurr_getName(CAD, "vi", UCURR_LONG_NAME, &isChoiceFormat, |
| 1612 &len, &ec); |
| 1613 assertTrue("ucurr_getName (vi default)", |
| 1614 U_USING_DEFAULT_WARNING == ec, TRUE); |
| 1615 |
| 1616 // Test that a default warning is being returned when falling back to root.
JB 4536. |
| 1617 ucurr_getName(ITL, "cy", UCURR_LONG_NAME, &isChoiceFormat, |
| 1618 &len, &ec); |
| 1619 assertTrue("ucurr_getName (cy default to root)", |
| 1620 U_USING_DEFAULT_WARNING == ec, TRUE); |
| 1621 |
| 1622 // TODO add more tests later |
| 1623 } |
| 1624 |
| 1625 void NumberFormatTest::TestCurrencyUnit(void){ |
| 1626 UErrorCode ec = U_ZERO_ERROR; |
| 1627 static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ |
| 1628 CurrencyUnit cu(USD, ec); |
| 1629 assertSuccess("CurrencyUnit", ec); |
| 1630 |
| 1631 const UChar * r = cu.getISOCurrency(); // who is the buffer owner ? |
| 1632 assertEquals("getISOCurrency()", USD, r); |
| 1633 |
| 1634 CurrencyUnit cu2(cu); |
| 1635 if (!(cu2 == cu)){ |
| 1636 errln("CurrencyUnit copy constructed object should be same"); |
| 1637 } |
| 1638 |
| 1639 CurrencyUnit * cu3 = (CurrencyUnit *)cu.clone(); |
| 1640 if (!(*cu3 == cu)){ |
| 1641 errln("CurrencyUnit cloned object should be same"); |
| 1642 } |
| 1643 delete cu3; |
| 1644 } |
| 1645 |
| 1646 void NumberFormatTest::TestCurrencyAmount(void){ |
| 1647 UErrorCode ec = U_ZERO_ERROR; |
| 1648 static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ |
| 1649 CurrencyAmount ca(9, USD, ec); |
| 1650 assertSuccess("CurrencyAmount", ec); |
| 1651 |
| 1652 CurrencyAmount ca2(ca); |
| 1653 if (!(ca2 == ca)){ |
| 1654 errln("CurrencyAmount copy constructed object should be same"); |
| 1655 } |
| 1656 |
| 1657 ca2=ca; |
| 1658 if (!(ca2 == ca)){ |
| 1659 errln("CurrencyAmount assigned object should be same"); |
| 1660 } |
| 1661 |
| 1662 CurrencyAmount *ca3 = (CurrencyAmount *)ca.clone(); |
| 1663 if (!(*ca3 == ca)){ |
| 1664 errln("CurrencyAmount cloned object should be same"); |
| 1665 } |
| 1666 delete ca3; |
| 1667 } |
| 1668 |
| 1669 void NumberFormatTest::TestSymbolsWithBadLocale(void) { |
| 1670 Locale locDefault; |
| 1671 Locale locBad("x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_V
ARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME"); |
| 1672 UErrorCode status = U_ZERO_ERROR; |
| 1673 UnicodeString intlCurrencySymbol((UChar)0xa4); |
| 1674 |
| 1675 intlCurrencySymbol.append((UChar)0xa4); |
| 1676 |
| 1677 logln("Current locale is %s", Locale::getDefault().getName()); |
| 1678 Locale::setDefault(locBad, status); |
| 1679 logln("Current locale is %s", Locale::getDefault().getName()); |
| 1680 DecimalFormatSymbols mySymbols(status); |
| 1681 if (status != U_USING_FALLBACK_WARNING) { |
| 1682 errln("DecimalFormatSymbols should returned U_USING_FALLBACK_WARNING."); |
| 1683 } |
| 1684 if (strcmp(mySymbols.getLocale().getName(), locBad.getName()) != 0) { |
| 1685 errln("DecimalFormatSymbols does not have the right locale."); |
| 1686 } |
| 1687 int symbolEnum = (int)DecimalFormatSymbols::kDecimalSeparatorSymbol; |
| 1688 for (; symbolEnum < (int)DecimalFormatSymbols::kFormatSymbolCount; symbolEnu
m++) { |
| 1689 logln(UnicodeString("DecimalFormatSymbols[") + symbolEnum + UnicodeStrin
g("] = ") |
| 1690 + prettify(mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatS
ymbol)symbolEnum))); |
| 1691 |
| 1692 if (mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbo
lEnum).length() == 0 |
| 1693 && symbolEnum != (int)DecimalFormatSymbols::kGroupingSeparatorSymbol |
| 1694 && symbolEnum != (int)DecimalFormatSymbols::kMonetaryGroupingSeparat
orSymbol) |
| 1695 { |
| 1696 errln("DecimalFormatSymbols has an empty string at index %d.", symbo
lEnum); |
| 1697 } |
| 1698 } |
| 1699 status = U_ZERO_ERROR; |
| 1700 Locale::setDefault(locDefault, status); |
| 1701 logln("Current locale is %s", Locale::getDefault().getName()); |
| 1702 } |
| 1703 |
| 1704 /** |
| 1705 * Check that adoptDecimalFormatSymbols and setDecimalFormatSymbols |
| 1706 * behave the same, except for memory ownership semantics. (No |
| 1707 * version of this test on Java, since Java has only one method.) |
| 1708 */ |
| 1709 void NumberFormatTest::TestAdoptDecimalFormatSymbols(void) { |
| 1710 UErrorCode ec = U_ZERO_ERROR; |
| 1711 DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
| 1712 if (U_FAILURE(ec)) { |
| 1713 errcheckln(ec, "Fail: DecimalFormatSymbols constructor - %s", u_errorNam
e(ec)); |
| 1714 delete sym; |
| 1715 return; |
| 1716 } |
| 1717 UnicodeString pat(" #,##0.00"); |
| 1718 pat.insert(0, (UChar)0x00A4); |
| 1719 DecimalFormat fmt(pat, sym, ec); |
| 1720 if (U_FAILURE(ec)) { |
| 1721 errln("Fail: DecimalFormat constructor"); |
| 1722 return; |
| 1723 } |
| 1724 |
| 1725 UnicodeString str; |
| 1726 fmt.format(2350.75, str); |
| 1727 if (str == "$ 2,350.75") { |
| 1728 logln(str); |
| 1729 } else { |
| 1730 dataerrln("Fail: " + str + ", expected $ 2,350.75"); |
| 1731 } |
| 1732 |
| 1733 sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
| 1734 if (U_FAILURE(ec)) { |
| 1735 errln("Fail: DecimalFormatSymbols constructor"); |
| 1736 delete sym; |
| 1737 return; |
| 1738 } |
| 1739 sym->setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); |
| 1740 fmt.adoptDecimalFormatSymbols(sym); |
| 1741 |
| 1742 str.truncate(0); |
| 1743 fmt.format(2350.75, str); |
| 1744 if (str == "Q 2,350.75") { |
| 1745 logln(str); |
| 1746 } else { |
| 1747 dataerrln("Fail: adoptDecimalFormatSymbols -> " + str + ", expected Q 2,
350.75"); |
| 1748 } |
| 1749 |
| 1750 sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
| 1751 if (U_FAILURE(ec)) { |
| 1752 errln("Fail: DecimalFormatSymbols constructor"); |
| 1753 delete sym; |
| 1754 return; |
| 1755 } |
| 1756 DecimalFormat fmt2(pat, sym, ec); |
| 1757 if (U_FAILURE(ec)) { |
| 1758 errln("Fail: DecimalFormat constructor"); |
| 1759 return; |
| 1760 } |
| 1761 |
| 1762 DecimalFormatSymbols sym2(Locale::getUS(), ec); |
| 1763 if (U_FAILURE(ec)) { |
| 1764 errln("Fail: DecimalFormatSymbols constructor"); |
| 1765 return; |
| 1766 } |
| 1767 sym2.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); |
| 1768 fmt2.setDecimalFormatSymbols(sym2); |
| 1769 |
| 1770 str.truncate(0); |
| 1771 fmt2.format(2350.75, str); |
| 1772 if (str == "Q 2,350.75") { |
| 1773 logln(str); |
| 1774 } else { |
| 1775 dataerrln("Fail: setDecimalFormatSymbols -> " + str + ", expected Q 2,35
0.75"); |
| 1776 } |
| 1777 } |
| 1778 |
| 1779 void NumberFormatTest::TestPerMill() { |
| 1780 UErrorCode ec = U_ZERO_ERROR; |
| 1781 UnicodeString str; |
| 1782 DecimalFormat fmt(ctou("###.###\\u2030"), ec); |
| 1783 if (!assertSuccess("DecimalFormat ct", ec)) return; |
| 1784 assertEquals("0.4857 x ###.###\\u2030", |
| 1785 ctou("485.7\\u2030"), fmt.format(0.4857, str)); |
| 1786 |
| 1787 DecimalFormatSymbols sym(Locale::getUS(), ec); |
| 1788 sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, ctou("m")); |
| 1789 DecimalFormat fmt2("", sym, ec); |
| 1790 fmt2.applyLocalizedPattern("###.###m", ec); |
| 1791 if (!assertSuccess("setup", ec)) return; |
| 1792 str.truncate(0); |
| 1793 assertEquals("0.4857 x ###.###m", |
| 1794 "485.7m", fmt2.format(0.4857, str)); |
| 1795 } |
| 1796 |
| 1797 /** |
| 1798 * Generic test for patterns that should be legal/illegal. |
| 1799 */ |
| 1800 void NumberFormatTest::TestIllegalPatterns() { |
| 1801 // Test cases: |
| 1802 // Prefix with "-:" for illegal patterns |
| 1803 // Prefix with "+:" for legal patterns |
| 1804 const char* DATA[] = { |
| 1805 // Unquoted special characters in the suffix are illegal |
| 1806 "-:000.000|###", |
| 1807 "+:000.000'|###'", |
| 1808 0 |
| 1809 }; |
| 1810 for (int32_t i=0; DATA[i]; ++i) { |
| 1811 const char* pat=DATA[i]; |
| 1812 UBool valid = (*pat) == '+'; |
| 1813 pat += 2; |
| 1814 UErrorCode ec = U_ZERO_ERROR; |
| 1815 DecimalFormat fmt(pat, ec); // locale doesn't matter here |
| 1816 if (U_SUCCESS(ec) == valid) { |
| 1817 logln("Ok: pattern \"%s\": %s", |
| 1818 pat, u_errorName(ec)); |
| 1819 } else { |
| 1820 errcheckln(ec, "FAIL: pattern \"%s\" should have %s; got %s", |
| 1821 pat, (valid?"succeeded":"failed"), |
| 1822 u_errorName(ec)); |
| 1823 } |
| 1824 } |
| 1825 } |
| 1826 |
| 1827 //---------------------------------------------------------------------- |
| 1828 |
| 1829 static const char* KEYWORDS[] = { |
| 1830 /*0*/ "ref=", // <reference pattern to parse numbers> |
| 1831 /*1*/ "loc=", // <locale for formats> |
| 1832 /*2*/ "f:", // <pattern or '-'> <number> <exp. string> |
| 1833 /*3*/ "fp:", // <pattern or '-'> <number> <exp. string> <exp. number> |
| 1834 /*4*/ "rt:", // <pattern or '-'> <(exp.) number> <(exp.) string> |
| 1835 /*5*/ "p:", // <pattern or '-'> <string> <exp. number> |
| 1836 /*6*/ "perr:", // <pattern or '-'> <invalid string> |
| 1837 /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'> |
| 1838 /*8*/ "fpc:", // <pattern or '-'> <curr.amt> <exp. string> <exp. curr.amt> |
| 1839 0 |
| 1840 }; |
| 1841 |
| 1842 /** |
| 1843 * Return an integer representing the next token from this |
| 1844 * iterator. The integer will be an index into the given list, or |
| 1845 * -1 if there are no more tokens, or -2 if the token is not on |
| 1846 * the list. |
| 1847 */ |
| 1848 static int32_t keywordIndex(const UnicodeString& tok) { |
| 1849 for (int32_t i=0; KEYWORDS[i]!=0; ++i) { |
| 1850 if (tok==KEYWORDS[i]) { |
| 1851 return i; |
| 1852 } |
| 1853 } |
| 1854 return -1; |
| 1855 } |
| 1856 |
| 1857 /** |
| 1858 * Parse a CurrencyAmount using the given NumberFormat, with |
| 1859 * the 'delim' character separating the number and the currency. |
| 1860 */ |
| 1861 static void parseCurrencyAmount(const UnicodeString& str, |
| 1862 const NumberFormat& fmt, |
| 1863 UChar delim, |
| 1864 Formattable& result, |
| 1865 UErrorCode& ec) { |
| 1866 UnicodeString num, cur; |
| 1867 int32_t i = str.indexOf(delim); |
| 1868 str.extractBetween(0, i, num); |
| 1869 str.extractBetween(i+1, INT32_MAX, cur); |
| 1870 Formattable n; |
| 1871 fmt.parse(num, n, ec); |
| 1872 result.adoptObject(new CurrencyAmount(n, cur.getTerminatedBuffer(), ec)); |
| 1873 } |
| 1874 |
| 1875 void NumberFormatTest::TestCases() { |
| 1876 UErrorCode ec = U_ZERO_ERROR; |
| 1877 TextFile reader("NumberFormatTestCases.txt", "UTF8", ec); |
| 1878 if (U_FAILURE(ec)) { |
| 1879 dataerrln("Couldn't open NumberFormatTestCases.txt"); |
| 1880 return; |
| 1881 } |
| 1882 TokenIterator tokens(&reader); |
| 1883 |
| 1884 Locale loc("en", "US", ""); |
| 1885 DecimalFormat *ref = 0, *fmt = 0; |
| 1886 MeasureFormat *mfmt = 0; |
| 1887 UnicodeString pat, tok, mloc, str, out, where, currAmt; |
| 1888 Formattable n; |
| 1889 |
| 1890 for (;;) { |
| 1891 ec = U_ZERO_ERROR; |
| 1892 if (!tokens.next(tok, ec)) { |
| 1893 break; |
| 1894 } |
| 1895 where = UnicodeString("(") + tokens.getLineNumber() + ") "; |
| 1896 int32_t cmd = keywordIndex(tok); |
| 1897 switch (cmd) { |
| 1898 case 0: |
| 1899 // ref= <reference pattern> |
| 1900 if (!tokens.next(tok, ec)) goto error; |
| 1901 delete ref; |
| 1902 ref = new DecimalFormat(tok, |
| 1903 new DecimalFormatSymbols(Locale::getUS(), ec), ec); |
| 1904 if (U_FAILURE(ec)) { |
| 1905 dataerrln("Error constructing DecimalFormat"); |
| 1906 goto error; |
| 1907 } |
| 1908 break; |
| 1909 case 1: |
| 1910 // loc= <locale> |
| 1911 if (!tokens.next(tok, ec)) goto error; |
| 1912 loc = Locale::createFromName(CharString().appendInvariantChars(tok,
ec).data()); |
| 1913 break; |
| 1914 case 2: // f: |
| 1915 case 3: // fp: |
| 1916 case 4: // rt: |
| 1917 case 5: // p: |
| 1918 if (!tokens.next(tok, ec)) goto error; |
| 1919 if (tok != "-") { |
| 1920 pat = tok; |
| 1921 delete fmt; |
| 1922 fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc, ec),
ec); |
| 1923 if (U_FAILURE(ec)) { |
| 1924 errln("FAIL: " + where + "Pattern \"" + pat + "\": " + u_err
orName(ec)); |
| 1925 ec = U_ZERO_ERROR; |
| 1926 if (!tokens.next(tok, ec)) goto error; |
| 1927 if (!tokens.next(tok, ec)) goto error; |
| 1928 if (cmd == 3) { |
| 1929 if (!tokens.next(tok, ec)) goto error; |
| 1930 } |
| 1931 continue; |
| 1932 } |
| 1933 } |
| 1934 if (cmd == 2 || cmd == 3 || cmd == 4) { |
| 1935 // f: <pattern or '-'> <number> <exp. string> |
| 1936 // fp: <pattern or '-'> <number> <exp. string> <exp. number> |
| 1937 // rt: <pattern or '-'> <number> <string> |
| 1938 UnicodeString num; |
| 1939 if (!tokens.next(num, ec)) goto error; |
| 1940 if (!tokens.next(str, ec)) goto error; |
| 1941 ref->parse(num, n, ec); |
| 1942 assertSuccess("parse", ec); |
| 1943 assertEquals(where + "\"" + pat + "\".format(" + num + ")", |
| 1944 str, fmt->format(n, out.remove(), ec)); |
| 1945 assertSuccess("format", ec); |
| 1946 if (cmd == 3) { // fp: |
| 1947 if (!tokens.next(num, ec)) goto error; |
| 1948 ref->parse(num, n, ec); |
| 1949 assertSuccess("parse", ec); |
| 1950 } |
| 1951 if (cmd != 2) { // != f: |
| 1952 Formattable m; |
| 1953 fmt->parse(str, m, ec); |
| 1954 assertSuccess("parse", ec); |
| 1955 assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")
", |
| 1956 n, m); |
| 1957 } |
| 1958 } |
| 1959 // p: <pattern or '-'> <string to parse> <exp. number> |
| 1960 else { |
| 1961 UnicodeString expstr; |
| 1962 if (!tokens.next(str, ec)) goto error; |
| 1963 if (!tokens.next(expstr, ec)) goto error; |
| 1964 Formattable exp, n; |
| 1965 ref->parse(expstr, exp, ec); |
| 1966 assertSuccess("parse", ec); |
| 1967 fmt->parse(str, n, ec); |
| 1968 assertSuccess("parse", ec); |
| 1969 assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", |
| 1970 exp, n); |
| 1971 } |
| 1972 break; |
| 1973 case 8: // fpc: |
| 1974 if (!tokens.next(tok, ec)) goto error; |
| 1975 if (tok != "-") { |
| 1976 mloc = tok; |
| 1977 delete mfmt; |
| 1978 mfmt = MeasureFormat::createCurrencyFormat( |
| 1979 Locale::createFromName( |
| 1980 CharString().appendInvariantChars(mloc, ec).data()), ec)
; |
| 1981 if (U_FAILURE(ec)) { |
| 1982 errln("FAIL: " + where + "Loc \"" + mloc + "\": " + u_errorN
ame(ec)); |
| 1983 ec = U_ZERO_ERROR; |
| 1984 if (!tokens.next(tok, ec)) goto error; |
| 1985 if (!tokens.next(tok, ec)) goto error; |
| 1986 if (!tokens.next(tok, ec)) goto error; |
| 1987 continue; |
| 1988 } |
| 1989 } |
| 1990 // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> |
| 1991 if (!tokens.next(currAmt, ec)) goto error; |
| 1992 if (!tokens.next(str, ec)) goto error; |
| 1993 parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); |
| 1994 if (assertSuccess("parseCurrencyAmount", ec)) { |
| 1995 assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" +
currAmt + ")", |
| 1996 str, mfmt->format(n, out.remove(), ec)); |
| 1997 assertSuccess("format", ec); |
| 1998 } |
| 1999 if (!tokens.next(currAmt, ec)) goto error; |
| 2000 parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); |
| 2001 if (assertSuccess("parseCurrencyAmount", ec)) { |
| 2002 Formattable m; |
| 2003 |
| 2004 mfmt->parseObject(str, m, ec); |
| 2005 if (assertSuccess("parseCurrency", ec)) { |
| 2006 assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(
\"" + str + "\")", |
| 2007 n, m); |
| 2008 } else { |
| 2009 errln("FAIL: source " + str); |
| 2010 } |
| 2011 } |
| 2012 break; |
| 2013 case 6: |
| 2014 // perr: <pattern or '-'> <invalid string> |
| 2015 errln("FAIL: Under construction"); |
| 2016 goto done; |
| 2017 case 7: { |
| 2018 // pat: <pattern> <exp. toPattern, or '-' or 'err'> |
| 2019 UnicodeString testpat; |
| 2020 UnicodeString exppat; |
| 2021 if (!tokens.next(testpat, ec)) goto error; |
| 2022 if (!tokens.next(exppat, ec)) goto error; |
| 2023 UBool err = exppat == "err"; |
| 2024 UBool existingPat = FALSE; |
| 2025 if (testpat == "-") { |
| 2026 if (err) { |
| 2027 errln("FAIL: " + where + "Invalid command \"pat: - err\""); |
| 2028 continue; |
| 2029 } |
| 2030 existingPat = TRUE; |
| 2031 testpat = pat; |
| 2032 } |
| 2033 if (exppat == "-") exppat = testpat; |
| 2034 DecimalFormat* f = 0; |
| 2035 UErrorCode ec2 = U_ZERO_ERROR; |
| 2036 if (existingPat) { |
| 2037 f = fmt; |
| 2038 } else { |
| 2039 f = new DecimalFormat(testpat, ec2); |
| 2040 } |
| 2041 if (U_SUCCESS(ec2)) { |
| 2042 if (err) { |
| 2043 errln("FAIL: " + where + "Invalid pattern \"" + testpat + |
| 2044 "\" was accepted"); |
| 2045 } else { |
| 2046 UnicodeString pat2; |
| 2047 assertEquals(where + "\"" + testpat + "\".toPattern()", |
| 2048 exppat, f->toPattern(pat2)); |
| 2049 } |
| 2050 } else { |
| 2051 if (err) { |
| 2052 logln("Ok: " + where + "Invalid pattern \"" + testpat + |
| 2053 "\" failed: " + u_errorName(ec2)); |
| 2054 } else { |
| 2055 errln("FAIL: " + where + "Valid pattern \"" + testpat + |
| 2056 "\" failed: " + u_errorName(ec2)); |
| 2057 } |
| 2058 } |
| 2059 if (!existingPat) delete f; |
| 2060 } break; |
| 2061 case -1: |
| 2062 errln("FAIL: " + where + "Unknown command \"" + tok + "\""); |
| 2063 goto done; |
| 2064 } |
| 2065 } |
| 2066 goto done; |
| 2067 |
| 2068 error: |
| 2069 if (U_SUCCESS(ec)) { |
| 2070 errln("FAIL: Unexpected EOF"); |
| 2071 } else { |
| 2072 errcheckln(ec, "FAIL: " + where + "Unexpected " + u_errorName(ec)); |
| 2073 } |
| 2074 |
| 2075 done: |
| 2076 delete mfmt; |
| 2077 delete fmt; |
| 2078 delete ref; |
| 2079 } |
| 2080 |
| 2081 |
| 2082 //---------------------------------------------------------------------- |
| 2083 // Support methods |
| 2084 //---------------------------------------------------------------------- |
| 2085 |
| 2086 UBool NumberFormatTest::equalValue(const Formattable& a, const Formattable& b) { |
| 2087 if (a.getType() == b.getType()) { |
| 2088 return a == b; |
| 2089 } |
| 2090 |
| 2091 if (a.getType() == Formattable::kLong) { |
| 2092 if (b.getType() == Formattable::kInt64) { |
| 2093 return a.getLong() == b.getLong(); |
| 2094 } else if (b.getType() == Formattable::kDouble) { |
| 2095 return (double) a.getLong() == b.getDouble(); // TODO check use of d
ouble instead of long |
| 2096 } |
| 2097 } else if (a.getType() == Formattable::kDouble) { |
| 2098 if (b.getType() == Formattable::kLong) { |
| 2099 return a.getDouble() == (double) b.getLong(); |
| 2100 } else if (b.getType() == Formattable::kInt64) { |
| 2101 return a.getDouble() == (double)b.getInt64(); |
| 2102 } |
| 2103 } else if (a.getType() == Formattable::kInt64) { |
| 2104 if (b.getType() == Formattable::kLong) { |
| 2105 return a.getInt64() == (int64_t)b.getLong(); |
| 2106 } else if (b.getType() == Formattable::kDouble) { |
| 2107 return a.getInt64() == (int64_t)b.getDouble(); |
| 2108 } |
| 2109 } |
| 2110 return FALSE; |
| 2111 } |
| 2112 |
| 2113 void NumberFormatTest::expect3(NumberFormat& fmt, const Formattable& n, const Un
icodeString& str) { |
| 2114 // Don't round-trip format test, since we explicitly do it |
| 2115 expect_rbnf(fmt, n, str, FALSE); |
| 2116 expect_rbnf(fmt, str, n); |
| 2117 } |
| 2118 |
| 2119 void NumberFormatTest::expect2(NumberFormat& fmt, const Formattable& n, const Un
icodeString& str) { |
| 2120 // Don't round-trip format test, since we explicitly do it |
| 2121 expect(fmt, n, str, FALSE); |
| 2122 expect(fmt, str, n); |
| 2123 } |
| 2124 |
| 2125 void NumberFormatTest::expect2(NumberFormat* fmt, const Formattable& n, |
| 2126 const UnicodeString& exp, |
| 2127 UErrorCode status) { |
| 2128 if (fmt == NULL || U_FAILURE(status)) { |
| 2129 dataerrln("FAIL: NumberFormat constructor"); |
| 2130 } else { |
| 2131 expect2(*fmt, n, exp); |
| 2132 } |
| 2133 delete fmt; |
| 2134 } |
| 2135 |
| 2136 void NumberFormatTest::expect(NumberFormat& fmt, const UnicodeString& str, const
Formattable& n) { |
| 2137 UErrorCode status = U_ZERO_ERROR; |
| 2138 Formattable num; |
| 2139 fmt.parse(str, num, status); |
| 2140 if (U_FAILURE(status)) { |
| 2141 dataerrln(UnicodeString("FAIL: Parse failed for \"") + str + "\" - " + u
_errorName(status)); |
| 2142 return; |
| 2143 } |
| 2144 UnicodeString pat; |
| 2145 ((DecimalFormat*) &fmt)->toPattern(pat); |
| 2146 if (equalValue(num, n)) { |
| 2147 logln(UnicodeString("Ok \"") + str + "\" x " + |
| 2148 pat + " = " + |
| 2149 toString(num)); |
| 2150 } else { |
| 2151 dataerrln(UnicodeString("FAIL \"") + str + "\" x " + |
| 2152 pat + " = " + |
| 2153 toString(num) + ", expected " + toString(n)); |
| 2154 } |
| 2155 } |
| 2156 |
| 2157 void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const UnicodeString& str,
const Formattable& n) { |
| 2158 UErrorCode status = U_ZERO_ERROR; |
| 2159 Formattable num; |
| 2160 fmt.parse(str, num, status); |
| 2161 if (U_FAILURE(status)) { |
| 2162 errln(UnicodeString("FAIL: Parse failed for \"") + str + "\""); |
| 2163 return; |
| 2164 } |
| 2165 if (equalValue(num, n)) { |
| 2166 logln(UnicodeString("Ok \"") + str + " = " + |
| 2167 toString(num)); |
| 2168 } else { |
| 2169 errln(UnicodeString("FAIL \"") + str + " = " + |
| 2170 toString(num) + ", expected " + toString(n)); |
| 2171 } |
| 2172 } |
| 2173 |
| 2174 void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const Formattable& n, |
| 2175 const UnicodeString& exp, UBool rt) { |
| 2176 UnicodeString saw; |
| 2177 FieldPosition pos; |
| 2178 UErrorCode status = U_ZERO_ERROR; |
| 2179 fmt.format(n, saw, pos, status); |
| 2180 CHECK(status, "NumberFormat::format"); |
| 2181 if (saw == exp) { |
| 2182 logln(UnicodeString("Ok ") + toString(n) + |
| 2183 " = \"" + |
| 2184 escape(saw) + "\""); |
| 2185 // We should be able to round-trip the formatted string => |
| 2186 // number => string (but not the other way around: number |
| 2187 // => string => number2, might have number2 != number): |
| 2188 if (rt) { |
| 2189 Formattable n2; |
| 2190 fmt.parse(exp, n2, status); |
| 2191 if (U_FAILURE(status)) { |
| 2192 errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\""); |
| 2193 return; |
| 2194 } |
| 2195 UnicodeString saw2; |
| 2196 fmt.format(n2, saw2, pos, status); |
| 2197 CHECK(status, "NumberFormat::format"); |
| 2198 if (saw2 != exp) { |
| 2199 errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + |
| 2200 " => \"" + saw2 + "\""); |
| 2201 } |
| 2202 } |
| 2203 } else { |
| 2204 errln(UnicodeString("FAIL ") + toString(n) + |
| 2205 " = \"" + |
| 2206 escape(saw) + "\", expected \"" + exp + "\""); |
| 2207 } |
| 2208 } |
| 2209 |
| 2210 void NumberFormatTest::expect(NumberFormat& fmt, const Formattable& n, |
| 2211 const UnicodeString& exp, UBool rt) { |
| 2212 UnicodeString saw; |
| 2213 FieldPosition pos; |
| 2214 UErrorCode status = U_ZERO_ERROR; |
| 2215 fmt.format(n, saw, pos, status); |
| 2216 CHECK(status, "NumberFormat::format"); |
| 2217 UnicodeString pat; |
| 2218 ((DecimalFormat*) &fmt)->toPattern(pat); |
| 2219 if (saw == exp) { |
| 2220 logln(UnicodeString("Ok ") + toString(n) + " x " + |
| 2221 escape(pat) + " = \"" + |
| 2222 escape(saw) + "\""); |
| 2223 // We should be able to round-trip the formatted string => |
| 2224 // number => string (but not the other way around: number |
| 2225 // => string => number2, might have number2 != number): |
| 2226 if (rt) { |
| 2227 Formattable n2; |
| 2228 fmt.parse(exp, n2, status); |
| 2229 if (U_FAILURE(status)) { |
| 2230 errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\" - "
+ u_errorName(status)); |
| 2231 return; |
| 2232 } |
| 2233 UnicodeString saw2; |
| 2234 fmt.format(n2, saw2, pos, status); |
| 2235 CHECK(status, "NumberFormat::format"); |
| 2236 if (saw2 != exp) { |
| 2237 errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + |
| 2238 " => \"" + saw2 + "\""); |
| 2239 } |
| 2240 } |
| 2241 } else { |
| 2242 dataerrln(UnicodeString("FAIL ") + toString(n) + " x " + |
| 2243 escape(pat) + " = \"" + |
| 2244 escape(saw) + "\", expected \"" + exp + "\""); |
| 2245 } |
| 2246 } |
| 2247 |
| 2248 void NumberFormatTest::expect(NumberFormat* fmt, const Formattable& n, |
| 2249 const UnicodeString& exp, |
| 2250 UErrorCode status) { |
| 2251 if (fmt == NULL || U_FAILURE(status)) { |
| 2252 dataerrln("FAIL: NumberFormat constructor"); |
| 2253 } else { |
| 2254 expect(*fmt, n, exp); |
| 2255 } |
| 2256 delete fmt; |
| 2257 } |
| 2258 |
| 2259 void NumberFormatTest::expectCurrency(NumberFormat& nf, const Locale& locale, |
| 2260 double value, const UnicodeString& string)
{ |
| 2261 UErrorCode ec = U_ZERO_ERROR; |
| 2262 DecimalFormat& fmt = * (DecimalFormat*) &nf; |
| 2263 const UChar DEFAULT_CURR[] = {45/*-*/,0}; |
| 2264 UChar curr[4]; |
| 2265 u_strcpy(curr, DEFAULT_CURR); |
| 2266 if (*locale.getLanguage() != 0) { |
| 2267 ucurr_forLocale(locale.getName(), curr, 4, &ec); |
| 2268 assertSuccess("ucurr_forLocale", ec); |
| 2269 fmt.setCurrency(curr, ec); |
| 2270 assertSuccess("DecimalFormat::setCurrency", ec); |
| 2271 fmt.setCurrency(curr); //Deprecated variant, for coverage only |
| 2272 } |
| 2273 UnicodeString s; |
| 2274 fmt.format(value, s); |
| 2275 s.findAndReplace((UChar32)0x00A0, (UChar32)0x0020); |
| 2276 |
| 2277 // Default display of the number yields "1234.5599999999999" |
| 2278 // instead of "1234.56". Use a formatter to fix this. |
| 2279 NumberFormat* f = |
| 2280 NumberFormat::createInstance(Locale::getUS(), ec); |
| 2281 UnicodeString v; |
| 2282 if (U_FAILURE(ec)) { |
| 2283 // Oops; bad formatter. Use default op+= display. |
| 2284 v = (UnicodeString)"" + value; |
| 2285 } else { |
| 2286 f->setMaximumFractionDigits(4); |
| 2287 f->setGroupingUsed(FALSE); |
| 2288 f->format(value, v); |
| 2289 } |
| 2290 delete f; |
| 2291 |
| 2292 if (s == string) { |
| 2293 logln((UnicodeString)"Ok: " + v + " x " + curr + " => " + prettify(s)); |
| 2294 } else { |
| 2295 errln((UnicodeString)"FAIL: " + v + " x " + curr + " => " + prettify(s)
+ |
| 2296 ", expected " + prettify(string)); |
| 2297 } |
| 2298 } |
| 2299 |
| 2300 void NumberFormatTest::expectPat(DecimalFormat& fmt, const UnicodeString& exp) { |
| 2301 UnicodeString pat; |
| 2302 fmt.toPattern(pat); |
| 2303 if (pat == exp) { |
| 2304 logln(UnicodeString("Ok \"") + pat + "\""); |
| 2305 } else { |
| 2306 errln(UnicodeString("FAIL \"") + pat + "\", expected \"" + exp + "\""); |
| 2307 } |
| 2308 } |
| 2309 |
| 2310 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
| 2311 int32_t pos) { |
| 2312 expectPad(fmt, pat, pos, 0, (UnicodeString)""); |
| 2313 } |
| 2314 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
| 2315 int32_t pos, int32_t width, UChar pad) { |
| 2316 expectPad(fmt, pat, pos, width, UnicodeString(pad)); |
| 2317 } |
| 2318 void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
| 2319 int32_t pos, int32_t width, const UnicodeString
& pad) { |
| 2320 int32_t apos = 0, awidth = 0; |
| 2321 UnicodeString apadStr; |
| 2322 UErrorCode status = U_ZERO_ERROR; |
| 2323 fmt.applyPattern(pat, status); |
| 2324 if (U_SUCCESS(status)) { |
| 2325 apos = fmt.getPadPosition(); |
| 2326 awidth = fmt.getFormatWidth(); |
| 2327 apadStr=fmt.getPadCharacterString(); |
| 2328 } else { |
| 2329 apos = -1; |
| 2330 awidth = width; |
| 2331 apadStr = pad; |
| 2332 } |
| 2333 if (apos == pos && awidth == width && apadStr == pad) { |
| 2334 UnicodeString infoStr; |
| 2335 if (pos == ILLEGAL) { |
| 2336 infoStr = UnicodeString(" width=", "") + awidth + UnicodeString(" pa
d=", "") + apadStr; |
| 2337 } |
| 2338 logln(UnicodeString("Ok \"") + pat + "\" pos=" + apos + infoStr); |
| 2339 } else { |
| 2340 errln(UnicodeString("FAIL \"") + pat + "\" pos=" + apos + |
| 2341 " width=" + awidth + " pad=" + apadStr + |
| 2342 ", expected " + pos + " " + width + " " + pad); |
| 2343 } |
| 2344 } |
| 2345 void NumberFormatTest::TestJB3832(){ |
| 2346 const char* localeID = "pt_PT@currency=PTE"; |
| 2347 Locale loc(localeID); |
| 2348 UErrorCode status = U_ZERO_ERROR; |
| 2349 UnicodeString expected(CharsToUnicodeString("1,150$50\\u00A0Esc.")); |
| 2350 UnicodeString s; |
| 2351 NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(loc, status
); |
| 2352 if(U_FAILURE(status)){ |
| 2353 dataerrln("Could not create currency formatter for locale %s - %s", loca
leID, u_errorName(status)); |
| 2354 return; |
| 2355 } |
| 2356 currencyFmt->format(1150.50, s); |
| 2357 if(s!=expected){ |
| 2358 errln(UnicodeString("FAIL: Expected: ")+expected |
| 2359 + UnicodeString(" Got: ") + s |
| 2360 + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); |
| 2361 } |
| 2362 if (U_FAILURE(status)){ |
| 2363 errln("FAIL: Status %s", u_errorName(status)); |
| 2364 } |
| 2365 delete currencyFmt; |
| 2366 } |
| 2367 |
| 2368 void NumberFormatTest::TestHost() |
| 2369 { |
| 2370 #ifdef U_WINDOWS |
| 2371 Win32NumberTest::testLocales(this); |
| 2372 #endif |
| 2373 for (NumberFormat::EStyles k = NumberFormat::kNumberStyle; |
| 2374 k < NumberFormat::kStyleCount; k = (NumberFormat::EStyles)(k+1)) { |
| 2375 UErrorCode status = U_ZERO_ERROR; |
| 2376 Locale loc("en_US@compat=host"); |
| 2377 NumberFormat *full = NumberFormat::createInstance(loc, status); |
| 2378 if (full == NULL || U_FAILURE(status)) { |
| 2379 dataerrln("FAIL: Can't create number instance for host - %s", u_erro
rName(status)); |
| 2380 return; |
| 2381 } |
| 2382 UnicodeString result1; |
| 2383 Formattable number(10.00); |
| 2384 full->format(number, result1, status); |
| 2385 if (U_FAILURE(status)) { |
| 2386 errln("FAIL: Can't format for host"); |
| 2387 return; |
| 2388 } |
| 2389 Formattable formattable; |
| 2390 full->parse(result1, formattable, status); |
| 2391 if (U_FAILURE(status)) { |
| 2392 errln("FAIL: Can't parse for host"); |
| 2393 return; |
| 2394 } |
| 2395 delete full; |
| 2396 } |
| 2397 } |
| 2398 |
| 2399 void NumberFormatTest::TestHostClone() |
| 2400 { |
| 2401 /* |
| 2402 Verify that a cloned formatter gives the same results |
| 2403 and is useable after the original has been deleted. |
| 2404 */ |
| 2405 // This is mainly important on Windows. |
| 2406 UErrorCode status = U_ZERO_ERROR; |
| 2407 Locale loc("en_US@compat=host"); |
| 2408 UDate now = Calendar::getNow(); |
| 2409 NumberFormat *full = NumberFormat::createInstance(loc, status); |
| 2410 if (full == NULL || U_FAILURE(status)) { |
| 2411 dataerrln("FAIL: Can't create Relative date instance - %s", u_errorName(
status)); |
| 2412 return; |
| 2413 } |
| 2414 UnicodeString result1; |
| 2415 full->format(now, result1, status); |
| 2416 Format *fullClone = full->clone(); |
| 2417 delete full; |
| 2418 full = NULL; |
| 2419 |
| 2420 UnicodeString result2; |
| 2421 fullClone->format(now, result2, status); |
| 2422 if (U_FAILURE(status)) { |
| 2423 errln("FAIL: format failure."); |
| 2424 } |
| 2425 if (result1 != result2) { |
| 2426 errln("FAIL: Clone returned different result from non-clone."); |
| 2427 } |
| 2428 delete fullClone; |
| 2429 } |
| 2430 |
| 2431 void NumberFormatTest::TestCurrencyFormat() |
| 2432 { |
| 2433 // This test is here to increase code coverage. |
| 2434 UErrorCode status = U_ZERO_ERROR; |
| 2435 MeasureFormat *cloneObj; |
| 2436 UnicodeString str; |
| 2437 Formattable toFormat, result; |
| 2438 static const UChar ISO_CODE[4] = {0x0047, 0x0042, 0x0050, 0}; |
| 2439 |
| 2440 Locale saveDefaultLocale = Locale::getDefault(); |
| 2441 Locale::setDefault( Locale::getUK(), status ); |
| 2442 if (U_FAILURE(status)) { |
| 2443 errln("couldn't set default Locale!"); |
| 2444 return; |
| 2445 } |
| 2446 |
| 2447 MeasureFormat *measureObj = MeasureFormat::createCurrencyFormat(status); |
| 2448 Locale::setDefault( saveDefaultLocale, status ); |
| 2449 if (U_FAILURE(status)){ |
| 2450 dataerrln("FAIL: Status %s", u_errorName(status)); |
| 2451 return; |
| 2452 } |
| 2453 cloneObj = (MeasureFormat *)measureObj->clone(); |
| 2454 if (cloneObj == NULL) { |
| 2455 errln("Clone doesn't work"); |
| 2456 return; |
| 2457 } |
| 2458 toFormat.adoptObject(new CurrencyAmount(1234.56, ISO_CODE, status)); |
| 2459 measureObj->format(toFormat, str, status); |
| 2460 measureObj->parseObject(str, result, status); |
| 2461 if (U_FAILURE(status)){ |
| 2462 errln("FAIL: Status %s", u_errorName(status)); |
| 2463 } |
| 2464 if (result != toFormat) { |
| 2465 errln("measureObj does not round trip. Formatted string was \"" + str +
"\" Got: " + toString(result) + " Expected: " + toString(toFormat)); |
| 2466 } |
| 2467 status = U_ZERO_ERROR; |
| 2468 str.truncate(0); |
| 2469 cloneObj->format(toFormat, str, status); |
| 2470 cloneObj->parseObject(str, result, status); |
| 2471 if (U_FAILURE(status)){ |
| 2472 errln("FAIL: Status %s", u_errorName(status)); |
| 2473 } |
| 2474 if (result != toFormat) { |
| 2475 errln("Clone does not round trip. Formatted string was \"" + str + "\" G
ot: " + toString(result) + " Expected: " + toString(toFormat)); |
| 2476 } |
| 2477 if (*measureObj != *cloneObj) { |
| 2478 errln("Cloned object is not equal to the original object"); |
| 2479 } |
| 2480 delete measureObj; |
| 2481 delete cloneObj; |
| 2482 |
| 2483 status = U_USELESS_COLLATOR_ERROR; |
| 2484 if (MeasureFormat::createCurrencyFormat(status) != NULL) { |
| 2485 errln("createCurrencyFormat should have returned NULL."); |
| 2486 } |
| 2487 } |
| 2488 |
| 2489 /* Port of ICU4J rounding test. */ |
| 2490 void NumberFormatTest::TestRounding() { |
| 2491 UErrorCode status = U_ZERO_ERROR; |
| 2492 DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Loc
ale::getEnglish(), status); |
| 2493 |
| 2494 if (U_FAILURE(status)) { |
| 2495 dataerrln("Unable to create decimal formatter. - %s", u_errorName(status
)); |
| 2496 return; |
| 2497 } |
| 2498 |
| 2499 int roundingIncrements[]={1, 2, 5, 20, 50, 100}; |
| 2500 int testValues[]={0, 300}; |
| 2501 |
| 2502 for (int j=0; j<2; j++) { |
| 2503 for (int mode=DecimalFormat::kRoundUp;mode<DecimalFormat::kRoundHalfEven
;mode++) { |
| 2504 df->setRoundingMode((DecimalFormat::ERoundingMode)mode); |
| 2505 for (int increment=0; increment<6; increment++) { |
| 2506 double base=testValues[j]; |
| 2507 double rInc=roundingIncrements[increment]; |
| 2508 checkRounding(df, base, 20, rInc); |
| 2509 rInc=1.000000000/rInc; |
| 2510 checkRounding(df, base, 20, rInc); |
| 2511 } |
| 2512 } |
| 2513 } |
| 2514 delete df; |
| 2515 } |
| 2516 |
| 2517 void NumberFormatTest::checkRounding(DecimalFormat* df, double base, int iterati
ons, double increment) { |
| 2518 df->setRoundingIncrement(increment); |
| 2519 double lastParsed=INT32_MIN; //Intger.MIN_VALUE |
| 2520 for (int i=-iterations; i<=iterations;i++) { |
| 2521 double iValue=base+(increment*(i*0.1)); |
| 2522 double smallIncrement=0.00000001; |
| 2523 if (iValue!=0) { |
| 2524 smallIncrement*=iValue; |
| 2525 } |
| 2526 //we not only test the value, but some values in a small range around it |
| 2527 lastParsed=checkRound(df, iValue-smallIncrement, lastParsed); |
| 2528 lastParsed=checkRound(df, iValue, lastParsed); |
| 2529 lastParsed=checkRound(df, iValue+smallIncrement, lastParsed); |
| 2530 } |
| 2531 } |
| 2532 |
| 2533 double NumberFormatTest::checkRound(DecimalFormat* df, double iValue, double las
tParsed) { |
| 2534 UErrorCode status=U_ZERO_ERROR; |
| 2535 UnicodeString formattedDecimal; |
| 2536 double parsed; |
| 2537 Formattable result; |
| 2538 df->format(iValue, formattedDecimal, status); |
| 2539 |
| 2540 if (U_FAILURE(status)) { |
| 2541 errln("Error formatting number."); |
| 2542 } |
| 2543 |
| 2544 df->parse(formattedDecimal, result, status); |
| 2545 |
| 2546 if (U_FAILURE(status)) { |
| 2547 errln("Error parsing number."); |
| 2548 } |
| 2549 |
| 2550 parsed=result.getDouble(); |
| 2551 |
| 2552 if (lastParsed>parsed) { |
| 2553 errln("Rounding wrong direction! %d > %d", lastParsed, parsed); |
| 2554 } |
| 2555 |
| 2556 return lastParsed; |
| 2557 } |
| 2558 |
| 2559 void NumberFormatTest::TestNonpositiveMultiplier() { |
| 2560 UErrorCode status = U_ZERO_ERROR; |
| 2561 DecimalFormatSymbols US(Locale::getUS(), status); |
| 2562 CHECK(status, "DecimalFormatSymbols constructor"); |
| 2563 DecimalFormat df(UnicodeString("0"), US, status); |
| 2564 CHECK(status, "DecimalFormat(0)"); |
| 2565 |
| 2566 // test zero multiplier |
| 2567 |
| 2568 int32_t mult = df.getMultiplier(); |
| 2569 df.setMultiplier(0); |
| 2570 if (df.getMultiplier() != mult) { |
| 2571 errln("DecimalFormat.setMultiplier(0) did not ignore its zero input"); |
| 2572 } |
| 2573 |
| 2574 // test negative multiplier |
| 2575 |
| 2576 df.setMultiplier(-1); |
| 2577 if (df.getMultiplier() != -1) { |
| 2578 errln("DecimalFormat.setMultiplier(-1) ignored its negative input"); |
| 2579 return; |
| 2580 } |
| 2581 |
| 2582 expect(df, "1122.123", -1122.123); |
| 2583 expect(df, "-1122.123", 1122.123); |
| 2584 expect(df, "1.2", -1.2); |
| 2585 expect(df, "-1.2", 1.2); |
| 2586 |
| 2587 // Note: the tests with the final parameter of FALSE will not round trip. |
| 2588 // The initial numeric value will format correctly, after the multipl
ier. |
| 2589 // Parsing the formatted text will be out-of-range for an int64, howe
ver. |
| 2590 // The expect() function could be modified to detect this and fall ba
ck |
| 2591 // to looking at the decimal parsed value, but it doesn't. |
| 2592 expect(df, U_INT64_MIN, "9223372036854775808", FALSE); |
| 2593 expect(df, U_INT64_MIN+1, "9223372036854775807"); |
| 2594 expect(df, (int64_t)-123, "123"); |
| 2595 expect(df, (int64_t)123, "-123"); |
| 2596 expect(df, U_INT64_MAX-1, "-9223372036854775806"); |
| 2597 expect(df, U_INT64_MAX, "-9223372036854775807"); |
| 2598 |
| 2599 df.setMultiplier(-2); |
| 2600 expect(df, -(U_INT64_MIN/2)-1, "-9223372036854775806"); |
| 2601 expect(df, -(U_INT64_MIN/2), "-9223372036854775808"); |
| 2602 expect(df, -(U_INT64_MIN/2)+1, "-9223372036854775810", FALSE); |
| 2603 |
| 2604 df.setMultiplier(-7); |
| 2605 expect(df, -(U_INT64_MAX/7)-1, "9223372036854775814", FALSE); |
| 2606 expect(df, -(U_INT64_MAX/7), "9223372036854775807"); |
| 2607 expect(df, -(U_INT64_MAX/7)+1, "9223372036854775800"); |
| 2608 |
| 2609 // TODO: uncomment (and fix up) all the following int64_t tests once BigInte
ger is ported |
| 2610 // (right now the big numbers get turned into doubles and lose tons of accur
acy) |
| 2611 //expect2(df, U_INT64_MAX, Int64ToUnicodeString(-U_INT64_MAX)); |
| 2612 //expect2(df, U_INT64_MIN, UnicodeString(Int64ToUnicodeString(U_INT64_MIN),
1)); |
| 2613 //expect2(df, U_INT64_MAX / 2, Int64ToUnicodeString(-(U_INT64_MAX / 2))); |
| 2614 //expect2(df, U_INT64_MIN / 2, Int64ToUnicodeString(-(U_INT64_MIN / 2))); |
| 2615 |
| 2616 // TODO: uncomment (and fix up) once BigDecimal is ported and DecimalFormat
can handle it |
| 2617 //expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MA
X_VALUE).negate().toString()); |
| 2618 //expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MI
N_VALUE).negate().toString()); |
| 2619 //expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDec
imal.valueOf(Long.MAX_VALUE).negate().toString()); |
| 2620 //expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDec
imal.valueOf(Long.MIN_VALUE).negate().toString()); |
| 2621 } |
| 2622 |
| 2623 |
| 2624 void |
| 2625 NumberFormatTest::TestSpaceParsing() { |
| 2626 // the data are: |
| 2627 // the string to be parsed, parsed position, parsed error index |
| 2628 const char* DATA[][3] = { |
| 2629 {"$124", "4", "-1"}, |
| 2630 {"$124 $124", "4", "-1"}, |
| 2631 {"$124 ", "4", "-1"}, |
| 2632 //{"$ 124 ", "5", "-1"}, // TODO: need to handle space correctly |
| 2633 //{"$\\u00A0124 ", "5", "-1"}, // TODO: need to handle space correctly |
| 2634 {"$ 124 ", "0", "0"}, |
| 2635 {"$\\u00A0124 ", "0", "0"}, |
| 2636 {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly |
| 2637 {"124$", "0", "3"}, // TODO: need to handle space correctly |
| 2638 // {"124 $", "5", "-1"}, TODO: OK or not, need currency spacing rule |
| 2639 {"124 $", "0", "3"}, |
| 2640 }; |
| 2641 UErrorCode status = U_ZERO_ERROR; |
| 2642 NumberFormat* foo = NumberFormat::createCurrencyInstance(status); |
| 2643 if (U_FAILURE(status)) { |
| 2644 delete foo; |
| 2645 return; |
| 2646 } |
| 2647 for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 2648 ParsePosition parsePosition(0); |
| 2649 UnicodeString stringToBeParsed = ctou(DATA[i][0]); |
| 2650 int parsedPosition = atoi(DATA[i][1]); |
| 2651 int errorIndex = atoi(DATA[i][2]); |
| 2652 Formattable result; |
| 2653 foo->parse(stringToBeParsed, result, parsePosition); |
| 2654 if (parsePosition.getIndex() != parsedPosition || |
| 2655 parsePosition.getErrorIndex() != errorIndex) { |
| 2656 errln("FAILED parse " + stringToBeParsed + "; wrong position, expect
ed: (" + parsedPosition + ", " + errorIndex + "); got (" + parsePosition.getInde
x() + ", " + parsePosition.getErrorIndex() + ")"); |
| 2657 } |
| 2658 if (parsePosition.getErrorIndex() == -1 && |
| 2659 result.getType() == Formattable::kLong && |
| 2660 result.getLong() != 124) { |
| 2661 errln("FAILED parse " + stringToBeParsed + "; wrong number, expect:
124, got " + result.getLong()); |
| 2662 } |
| 2663 } |
| 2664 delete foo; |
| 2665 } |
| 2666 |
| 2667 /** |
| 2668 * Test using various numbering systems and numbering system keyword. |
| 2669 */ |
| 2670 void NumberFormatTest::TestNumberingSystems() { |
| 2671 UErrorCode ec = U_ZERO_ERROR; |
| 2672 |
| 2673 Locale loc1("en", "US", "", "numbers=thai"); |
| 2674 Locale loc2("en", "US", "", "numbers=hebr"); |
| 2675 Locale loc3("en", "US", "", "numbers=arabext"); |
| 2676 Locale loc4("en", "US", "", "numbers=foobar"); |
| 2677 Locale loc5("ar", "EG", "", ""); // ar_EG uses arab numbering system |
| 2678 Locale loc6("ar", "MA", "", ""); // ar_MA uses latn numbering system |
| 2679 Locale loc7("en", "US", "", "numbers=hanidec"); |
| 2680 |
| 2681 NumberFormat* fmt1= NumberFormat::createInstance(loc1, ec); |
| 2682 if (U_FAILURE(ec)) { |
| 2683 dataerrln("FAIL: getInstance(en_US@numbers=thai) - %s", u_errorName(ec))
; |
| 2684 } |
| 2685 NumberFormat* fmt2= NumberFormat::createInstance(loc2, ec); |
| 2686 if (U_FAILURE(ec)) { |
| 2687 dataerrln("FAIL: getInstance(en_US@numbers=hebr) - %s", u_errorName(ec))
; |
| 2688 } |
| 2689 NumberFormat* fmt3= NumberFormat::createInstance(loc3, ec); |
| 2690 if (U_FAILURE(ec)) { |
| 2691 dataerrln("FAIL: getInstance(en_US@numbers=arabext) - %s", u_errorName(e
c)); |
| 2692 } |
| 2693 NumberFormat* fmt5= NumberFormat::createInstance(loc5, ec); |
| 2694 if (U_FAILURE(ec)) { |
| 2695 dataerrln("FAIL: getInstance(ar_EG) - %s", u_errorName(ec)); |
| 2696 } |
| 2697 NumberFormat* fmt6= NumberFormat::createInstance(loc6, ec); |
| 2698 if (U_FAILURE(ec)) { |
| 2699 dataerrln("FAIL: getInstance(ar_MA) - %s", u_errorName(ec)); |
| 2700 } |
| 2701 |
| 2702 NumberFormat* fmt7= NumberFormat::createInstance(loc7, ec); |
| 2703 if (U_FAILURE(ec)) { |
| 2704 dataerrln("FAIL: getInstance(en_US@numbers=hanidec) - %s", u_errorName(e
c)); |
| 2705 } |
| 2706 |
| 2707 if (U_SUCCESS(ec) && fmt1 != NULL && fmt2 != NULL && fmt3 != NULL && |
| 2708 fmt5 != NULL && fmt6 != NULL && fmt7 != NULL) { |
| 2709 expect2(*fmt1, 1234.567, CharsToUnicodeString("\\u0E51,\\u0E52\\u0E53\\u
0E54.\\u0E55\\u0E56\\u0E57")); |
| 2710 expect3(*fmt2, 5678.0, CharsToUnicodeString("\\u05D4\\u05F3\\u05EA\\u05E
8\\u05E2\\u05F4\\u05D7")); |
| 2711 expect2(*fmt3, 1234.567, CharsToUnicodeString("\\u06F1,\\u06F2\\u06F3\\u
06F4.\\u06F5\\u06F6\\u06F7")); |
| 2712 expect2(*fmt5, 1234.567, CharsToUnicodeString("\\u0661\\u066c\\u0662\\u0
663\\u0664\\u066b\\u0665\\u0666\\u0667")); |
| 2713 expect2(*fmt6, 1234.567, CharsToUnicodeString("1.234,567")); |
| 2714 expect2(*fmt7, 1234.567, CharsToUnicodeString("\\u4e00,\\u4e8c\\u4e09\\u
56db.\\u4e94\\u516d\\u4e03")); |
| 2715 } |
| 2716 |
| 2717 // Test bogus keyword value |
| 2718 NumberFormat* fmt4= NumberFormat::createInstance(loc4, ec); |
| 2719 if ( ec != U_UNSUPPORTED_ERROR ) { |
| 2720 errln("FAIL: getInstance(en_US@numbers=foobar) should have returned U_UN
SUPPORTED_ERROR"); |
| 2721 } |
| 2722 |
| 2723 ec = U_ZERO_ERROR; |
| 2724 NumberingSystem *ns = NumberingSystem::createInstance(ec); |
| 2725 if (U_FAILURE(ec)) { |
| 2726 dataerrln("FAIL: NumberingSystem::createInstance(ec); - %s", u_errorName
(ec)); |
| 2727 } |
| 2728 |
| 2729 if ( ns != NULL ) { |
| 2730 ns->getDynamicClassID(); |
| 2731 ns->getStaticClassID(); |
| 2732 } else { |
| 2733 errln("FAIL: getInstance() returned NULL."); |
| 2734 } |
| 2735 |
| 2736 NumberingSystem *ns1 = new NumberingSystem(*ns); |
| 2737 if (ns1 == NULL) { |
| 2738 errln("FAIL: NumberSystem copy constructor returned NULL."); |
| 2739 } |
| 2740 |
| 2741 delete ns1; |
| 2742 delete ns; |
| 2743 delete fmt1; |
| 2744 delete fmt2; |
| 2745 delete fmt3; |
| 2746 delete fmt4; |
| 2747 delete fmt5; |
| 2748 delete fmt6; |
| 2749 delete fmt7; |
| 2750 } |
| 2751 |
| 2752 |
| 2753 void |
| 2754 NumberFormatTest::TestMultiCurrencySign() { |
| 2755 const char* DATA[][6] = { |
| 2756 // the fields in the following test are: |
| 2757 // locale, |
| 2758 // currency pattern (with negative pattern), |
| 2759 // currency number to be formatted, |
| 2760 // currency format using currency symbol name, such as "$" for USD, |
| 2761 // currency format using currency ISO name, such as "USD", |
| 2762 // currency format using plural name, such as "US dollars". |
| 2763 // for US locale |
| 2764 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1234.56", "$1,234.56", "U
SD1,234.56", "US dollars1,234.56"}, |
| 2765 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "-1234.56", "-$1,234.56",
"-USD1,234.56", "-US dollars1,234.56"}, |
| 2766 {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1", "$1.00", "USD1.00", "
US dollar1.00"}, |
| 2767 // for CHINA locale |
| 2768 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\uFFE51,234.
56", "CNY1,234.56", "\\u4EBA\\u6C11\\u5E011,234.56"}, |
| 2769 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\uFFE51,23
4.56)", "(CNY1,234.56)", "(\\u4EBA\\u6C11\\u5E011,234.56)"}, |
| 2770 {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\uFFE51.00", "CNY1
.00", "\\u4EBA\\u6C11\\u5E011.00"} |
| 2771 }; |
| 2772 |
| 2773 const UChar doubleCurrencySign[] = {0xA4, 0xA4, 0}; |
| 2774 UnicodeString doubleCurrencyStr(doubleCurrencySign); |
| 2775 const UChar tripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; |
| 2776 UnicodeString tripleCurrencyStr(tripleCurrencySign); |
| 2777 |
| 2778 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 2779 const char* locale = DATA[i][0]; |
| 2780 UnicodeString pat = ctou(DATA[i][1]); |
| 2781 double numberToBeFormat = atof(DATA[i][2]); |
| 2782 UErrorCode status = U_ZERO_ERROR; |
| 2783 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale(locale), sta
tus); |
| 2784 if (U_FAILURE(status)) { |
| 2785 delete sym; |
| 2786 continue; |
| 2787 } |
| 2788 for (int j=1; j<=3; ++j) { |
| 2789 // j represents the number of currency sign in the pattern. |
| 2790 if (j == 2) { |
| 2791 pat = pat.findAndReplace(ctou("\\u00A4"), doubleCurrencyStr); |
| 2792 } else if (j == 3) { |
| 2793 pat = pat.findAndReplace(ctou("\\u00A4\\u00A4"), tripleCurrencyS
tr); |
| 2794 } |
| 2795 |
| 2796 DecimalFormat* fmt = new DecimalFormat(pat, new DecimalFormatSymbols
(*sym), status); |
| 2797 if (U_FAILURE(status)) { |
| 2798 errln("FAILED init DecimalFormat "); |
| 2799 delete fmt; |
| 2800 continue; |
| 2801 } |
| 2802 UnicodeString s; |
| 2803 ((NumberFormat*) fmt)->format(numberToBeFormat, s); |
| 2804 // DATA[i][3] is the currency format result using a |
| 2805 // single currency sign. |
| 2806 // DATA[i][4] is the currency format result using |
| 2807 // double currency sign. |
| 2808 // DATA[i][5] is the currency format result using |
| 2809 // triple currency sign. |
| 2810 // DATA[i][j+2] is the currency format result using |
| 2811 // 'j' number of currency sign. |
| 2812 UnicodeString currencyFormatResult = ctou(DATA[i][2+j]); |
| 2813 if (s.compare(currencyFormatResult)) { |
| 2814 errln("FAIL format: Expected " + currencyFormatResult + "; Got "
+ s); |
| 2815 } |
| 2816 // mix style parsing |
| 2817 for (int k=3; k<=5; ++k) { |
| 2818 // DATA[i][3] is the currency format result using a |
| 2819 // single currency sign. |
| 2820 // DATA[i][4] is the currency format result using |
| 2821 // double currency sign. |
| 2822 // DATA[i][5] is the currency format result using |
| 2823 // triple currency sign. |
| 2824 UnicodeString oneCurrencyFormat = ctou(DATA[i][k]); |
| 2825 UErrorCode status = U_ZERO_ERROR; |
| 2826 Formattable parseRes; |
| 2827 fmt->parse(oneCurrencyFormat, parseRes, status); |
| 2828 if (U_FAILURE(status) || |
| 2829 (parseRes.getType() == Formattable::kDouble && |
| 2830 parseRes.getDouble() != numberToBeFormat) || |
| 2831 (parseRes.getType() == Formattable::kLong && |
| 2832 parseRes.getLong() != numberToBeFormat)) { |
| 2833 errln("FAILED parse " + oneCurrencyFormat + "; (i, j, k): " + |
| 2834 i + ", " + j + ", " + k); |
| 2835 } |
| 2836 } |
| 2837 delete fmt; |
| 2838 } |
| 2839 delete sym; |
| 2840 } |
| 2841 } |
| 2842 |
| 2843 |
| 2844 void |
| 2845 NumberFormatTest::TestCurrencyFormatForMixParsing() { |
| 2846 UErrorCode status = U_ZERO_ERROR; |
| 2847 MeasureFormat* curFmt = MeasureFormat::createCurrencyFormat(Locale("en_US"),
status); |
| 2848 if (U_FAILURE(status)) { |
| 2849 delete curFmt; |
| 2850 return; |
| 2851 } |
| 2852 const char* formats[] = { |
| 2853 "$1,234.56", // string to be parsed |
| 2854 "USD1,234.56", |
| 2855 "US dollars1,234.56", |
| 2856 "1,234.56 US dollars" |
| 2857 }; |
| 2858 const CurrencyAmount* curramt = NULL; |
| 2859 for (uint32_t i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) { |
| 2860 UnicodeString stringToBeParsed = ctou(formats[i]); |
| 2861 logln(UnicodeString("stringToBeParsed: ") + stringToBeParsed); |
| 2862 Formattable result; |
| 2863 UErrorCode status = U_ZERO_ERROR; |
| 2864 curFmt->parseObject(stringToBeParsed, result, status); |
| 2865 if (U_FAILURE(status)) { |
| 2866 errln("FAIL: measure format parsing: '%s' ec: %s", formats[i], u_error
Name(status)); |
| 2867 } else if (result.getType() != Formattable::kObject || |
| 2868 (curramt = dynamic_cast<const CurrencyAmount*>(result.getObject()))
== NULL || |
| 2869 curramt->getNumber().getDouble() != 1234.56 || |
| 2870 UnicodeString(curramt->getISOCurrency()).compare(ISO_CURRENCY_USD) |
| 2871 ) { |
| 2872 errln("FAIL: getCurrencyFormat of default locale (en_US) failed roun
dtripping the number "); |
| 2873 if (curramt->getNumber().getDouble() != 1234.56) { |
| 2874 errln((UnicodeString)"wong number, expect: 1234.56" + ", got: "
+ curramt->getNumber().getDouble()); |
| 2875 } |
| 2876 if (curramt->getISOCurrency() != ISO_CURRENCY_USD) { |
| 2877 errln((UnicodeString)"wong currency, expect: USD" + ", got: " +
curramt->getISOCurrency()); |
| 2878 } |
| 2879 } |
| 2880 } |
| 2881 delete curFmt; |
| 2882 } |
| 2883 |
| 2884 |
| 2885 void |
| 2886 NumberFormatTest::TestDecimalFormatCurrencyParse() { |
| 2887 // Locale.US |
| 2888 UErrorCode status = U_ZERO_ERROR; |
| 2889 DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale("en_US"), status
); |
| 2890 if (U_FAILURE(status)) { |
| 2891 delete sym; |
| 2892 return; |
| 2893 } |
| 2894 UnicodeString pat; |
| 2895 UChar currency = 0x00A4; |
| 2896 // "\xA4#,##0.00;-\xA4#,##0.00" |
| 2897 pat.append(currency).append(currency).append(currency).append("#,##0.00;-").
append(currency).append(currency).append(currency).append("#,##0.00"); |
| 2898 DecimalFormat* fmt = new DecimalFormat(pat, sym, status); |
| 2899 if (U_FAILURE(status)) { |
| 2900 delete fmt; |
| 2901 errln("failed to new DecimalFormat in TestDecimalFormatCurrencyParse"); |
| 2902 return; |
| 2903 } |
| 2904 const char* DATA[][2] = { |
| 2905 // the data are: |
| 2906 // string to be parsed, the parsed result (number) |
| 2907 {"$1.00", "1"}, |
| 2908 {"USD1.00", "1"}, |
| 2909 {"1.00 US dollar", "1"}, |
| 2910 {"$1,234.56", "1234.56"}, |
| 2911 {"USD1,234.56", "1234.56"}, |
| 2912 {"1,234.56 US dollar", "1234.56"}, |
| 2913 }; |
| 2914 for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 2915 UnicodeString stringToBeParsed = ctou(DATA[i][0]); |
| 2916 double parsedResult = atof(DATA[i][1]); |
| 2917 UErrorCode status = U_ZERO_ERROR; |
| 2918 Formattable result; |
| 2919 fmt->parse(stringToBeParsed, result, status); |
| 2920 if (U_FAILURE(status) || |
| 2921 (result.getType() == Formattable::kDouble && |
| 2922 result.getDouble() != parsedResult) || |
| 2923 (result.getType() == Formattable::kLong && |
| 2924 result.getLong() != parsedResult)) { |
| 2925 errln((UnicodeString)"FAIL parse: Expected " + parsedResult); |
| 2926 } |
| 2927 } |
| 2928 delete fmt; |
| 2929 } |
| 2930 |
| 2931 |
| 2932 void |
| 2933 NumberFormatTest::TestCurrencyIsoPluralFormat() { |
| 2934 const char* DATA[][6] = { |
| 2935 // the data are: |
| 2936 // locale, |
| 2937 // currency amount to be formatted, |
| 2938 // currency ISO code to be formatted, |
| 2939 // format result using CURRENCYSTYLE, |
| 2940 // format result using ISOCURRENCYSTYLE, |
| 2941 // format result using PLURALCURRENCYSTYLE, |
| 2942 |
| 2943 {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"}, |
| 2944 {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dol
lars"}, |
| 2945 {"en_US", "-1234.56", "USD", "($1,234.56)", "(USD1,234.56)", "-1,234.56
US dollars"}, |
| 2946 {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00 \\u7F8E\\u5143"}, |
| 2947 {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56 \\u7
F8E\\u5143"}, |
| 2948 // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"
}, |
| 2949 // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.5
6", "1,234.56 CHY"}, |
| 2950 {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4EBA\\u6C11\\u5
E01"}, |
| 2951 {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "CNY1,234.56", "1,234.56
\\u4EBA\\u6C11\\u5E01"}, |
| 2952 {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0R
UB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u043
9 \\u0440\\u0443\\u0431\\u043B\\u044C"}, |
| 2953 {"ru_RU", "2", "RUB", "2,00\\u00A0\\u0440\\u0443\\u0431.", "2,00\\u00A0R
UB", "2,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u044
5 \\u0440\\u0443\\u0431\\u043B\\u044F"}, |
| 2954 {"ru_RU", "5", "RUB", "5,00\\u00A0\\u0440\\u0443\\u0431.", "5,00\\u00A0R
UB", "5,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u044
5 \\u0440\\u0443\\u0431\\u043B\\u0435\\u0439"}, |
| 2955 // test locale without currency information |
| 2956 {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 US
D"}, |
| 2957 // test choice format |
| 2958 {"es_AR", "1", "INR", "Rs\\u00A01,00", "INR\\u00A01,00", "1,00 rupia ind
ia"}, |
| 2959 }; |
| 2960 |
| 2961 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 2962 for (NumberFormat::EStyles k = NumberFormat::kCurrencyStyle; |
| 2963 k <= NumberFormat::kPluralCurrencyStyle; |
| 2964 k = (NumberFormat::EStyles)(k+1)) { |
| 2965 // k represents currency format style. |
| 2966 if ( k != NumberFormat::kCurrencyStyle && |
| 2967 k != NumberFormat::kIsoCurrencyStyle && |
| 2968 k != NumberFormat::kPluralCurrencyStyle ) { |
| 2969 continue; |
| 2970 } |
| 2971 const char* localeString = DATA[i][0]; |
| 2972 double numberToBeFormat = atof(DATA[i][1]); |
| 2973 const char* currencyISOCode = DATA[i][2]; |
| 2974 Locale locale(localeString); |
| 2975 UErrorCode status = U_ZERO_ERROR; |
| 2976 NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); |
| 2977 if (U_FAILURE(status)) { |
| 2978 delete numFmt; |
| 2979 dataerrln((UnicodeString)"can not create instance, locale:" + locale
String + ", style: " + k + " - " + u_errorName(status)); |
| 2980 continue; |
| 2981 } |
| 2982 UChar currencyCode[4]; |
| 2983 u_charsToUChars(currencyISOCode, currencyCode, 4); |
| 2984 numFmt->setCurrency(currencyCode, status); |
| 2985 if (U_FAILURE(status)) { |
| 2986 delete numFmt; |
| 2987 errln((UnicodeString)"can not set currency:" + currencyISOCode); |
| 2988 continue; |
| 2989 } |
| 2990 |
| 2991 UnicodeString strBuf; |
| 2992 numFmt->format(numberToBeFormat, strBuf); |
| 2993 int resultDataIndex = k; |
| 2994 if ( k == NumberFormat::kCurrencyStyle ) { |
| 2995 resultDataIndex = k+2; |
| 2996 } |
| 2997 // DATA[i][resultDataIndex] is the currency format result |
| 2998 // using 'k' currency style. |
| 2999 UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); |
| 3000 if (strBuf.compare(formatResult)) { |
| 3001 errln("FAIL: Expected " + formatResult + " actual: " + strBuf); |
| 3002 } |
| 3003 // test parsing, and test parsing for all currency formats. |
| 3004 for (int j = 3; j < 6; ++j) { |
| 3005 // DATA[i][3] is the currency format result using |
| 3006 // CURRENCYSTYLE formatter. |
| 3007 // DATA[i][4] is the currency format result using |
| 3008 // ISOCURRENCYSTYLE formatter. |
| 3009 // DATA[i][5] is the currency format result using |
| 3010 // PLURALCURRENCYSTYLE formatter. |
| 3011 UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); |
| 3012 UErrorCode status = U_ZERO_ERROR; |
| 3013 Formattable parseResult; |
| 3014 numFmt->parse(oneCurrencyFormatResult, parseResult, status); |
| 3015 if (U_FAILURE(status) || |
| 3016 (parseResult.getType() == Formattable::kDouble && |
| 3017 parseResult.getDouble() != numberToBeFormat) || |
| 3018 (parseResult.getType() == Formattable::kLong && |
| 3019 parseResult.getLong() != numberToBeFormat)) { |
| 3020 errln((UnicodeString)"FAIL: getCurrencyFormat of locale " + |
| 3021 localeString + " failed roundtripping the number"); |
| 3022 if (parseResult.getType() == Formattable::kDouble) { |
| 3023 errln((UnicodeString)"expected: " + numberToBeFormat + "; ac
tual: " +parseResult.getDouble()); |
| 3024 } else { |
| 3025 errln((UnicodeString)"expected: " + numberToBeFormat + "; ac
tual: " +parseResult.getLong()); |
| 3026 } |
| 3027 } |
| 3028 } |
| 3029 delete numFmt; |
| 3030 } |
| 3031 } |
| 3032 } |
| 3033 |
| 3034 void |
| 3035 NumberFormatTest::TestCurrencyParsing() { |
| 3036 const char* DATA[][6] = { |
| 3037 // the data are: |
| 3038 // locale, |
| 3039 // currency amount to be formatted, |
| 3040 // currency ISO code to be formatted, |
| 3041 // format result using CURRENCYSTYLE, |
| 3042 // format result using ISOCURRENCYSTYLE, |
| 3043 // format result using PLURALCURRENCYSTYLE, |
| 3044 {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"}, |
| 3045 {"pa_IN", "1", "USD", "US$\\u00a0\\u0a67.\\u0a66\\u0a66", "USD\\u00a0\\u
0a67.\\u0a66\\u0a66", "\\u0a67.\\u0a66\\u0a66 USD"}, |
| 3046 {"es_AR", "1", "USD", "US$\\u00a01,00", "USD\\u00a01,00", "1,00 d\\u00f3
lar estadounidense"}, |
| 3047 {"ar_EG", "1", "USD", "US$\\u00a0\\u0661\\u066b\\u0660\\u0660", "USD\\u0
0a0\\u0661\\u066b\\u0660\\u0660", "\\u0661\\u066b\\u0660\\u0660 \\u062f\\u0648\\
u0644\\u0627\\u0631 \\u0623\\u0645\\u0631\\u064a\\u0643\\u064a"}, |
| 3048 {"fa_CA", "1", "USD", "\\u06f1\\u066b\\u06f0\\u06f0\\u00a0US$", "\\u06f1
\\u066b\\u06f0\\u06f0\\u00a0USD", "\\u06f1\\u066b\\u06f0\\u06f0\\u0020\\u062f\\u
0644\\u0627\\u0631\\u0020\\u0627\\u0645\\u0631\\u06cc\\u06a9\\u0627"}, |
| 3049 {"he_IL", "1", "USD", "1.00\\u00a0US$", "1.00\\u00a0USD", "1.00 \\u05d3\
\u05d5\\u05dc\\u05e8 \\u05d0\\u05de\\u05e8\\u05d9\\u05e7\\u05d0\\u05d9"}, |
| 3050 {"hr_HR", "1", "USD", "1,00\\u00a0$", "1,00\\u00a0USD", "1,00 Ameri\\u01
0dki dolar"}, |
| 3051 {"id_ID", "1", "USD", "US$1,00", "USD1,00", "1,00 USD"}, |
| 3052 {"it_IT", "1", "USD", "US$\\u00a01,00", "USD\\u00a01,00", "1,00 Dollaro
Statunitense"}, |
| 3053 {"ko_KR", "1", "USD", "US$1.00", "USD1.00", "1.00 \\ubbf8\\uad6d \\ub2ec
\\ub7ec"}, |
| 3054 {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00 \\u7c73\\u30c9\\u30eb"}, |
| 3055 {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4EBA\\u6C11\\u5
E01"}, |
| 3056 {"zh_TW", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5
e63"}, |
| 3057 {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0R
UB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u043
9 \\u0440\\u0443\\u0431\\u043B\\u044C"}, |
| 3058 }; |
| 3059 |
| 3060 #ifdef NUMFMTST_CACHE_DEBUG |
| 3061 int deadloop = 0; |
| 3062 for (;;) { |
| 3063 printf("loop: %d\n", deadloop++); |
| 3064 #endif |
| 3065 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 3066 for (NumberFormat::EStyles k = NumberFormat::kCurrencyStyle; |
| 3067 k <= NumberFormat::kPluralCurrencyStyle; |
| 3068 k = (NumberFormat::EStyles)(k+1)) { |
| 3069 // k represents currency format style. |
| 3070 if ( k != NumberFormat::kCurrencyStyle && |
| 3071 k != NumberFormat::kIsoCurrencyStyle && |
| 3072 k != NumberFormat::kPluralCurrencyStyle ) { |
| 3073 continue; |
| 3074 } |
| 3075 const char* localeString = DATA[i][0]; |
| 3076 double numberToBeFormat = atof(DATA[i][1]); |
| 3077 const char* currencyISOCode = DATA[i][2]; |
| 3078 Locale locale(localeString); |
| 3079 UErrorCode status = U_ZERO_ERROR; |
| 3080 NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); |
| 3081 if (U_FAILURE(status)) { |
| 3082 delete numFmt; |
| 3083 dataerrln((UnicodeString)"can not create instance, locale:" + locale
String + ", style: " + k + " - " + u_errorName(status)); |
| 3084 continue; |
| 3085 } |
| 3086 // TODO: need to be UChar* |
| 3087 UChar currencyCode[4]; |
| 3088 currencyCode[0] = currencyISOCode[0]; |
| 3089 currencyCode[1] = currencyISOCode[1]; |
| 3090 currencyCode[2] = currencyISOCode[2]; |
| 3091 currencyCode[3] = currencyISOCode[3]; |
| 3092 numFmt->setCurrency(currencyCode, status); |
| 3093 if (U_FAILURE(status)) { |
| 3094 delete numFmt; |
| 3095 errln((UnicodeString)"can not set currency:" + currencyISOCode); |
| 3096 continue; |
| 3097 } |
| 3098 |
| 3099 /* |
| 3100 UnicodeString strBuf; |
| 3101 numFmt->format(numberToBeFormat, strBuf); |
| 3102 int resultDataIndex = k; |
| 3103 if ( k == NumberFormat::kCurrencyStyle ) { |
| 3104 resultDataIndex = k+2; |
| 3105 } |
| 3106 // DATA[i][resultDataIndex] is the currency format result |
| 3107 // using 'k' currency style. |
| 3108 UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); |
| 3109 if (strBuf.compare(formatResult)) { |
| 3110 errln("FAIL: Expected " + formatResult + " actual: " + strBuf); |
| 3111 } |
| 3112 */ |
| 3113 // test parsing, and test parsing for all currency formats. |
| 3114 for (int j = 3; j < 6; ++j) { |
| 3115 // DATA[i][3] is the currency format result using |
| 3116 // CURRENCYSTYLE formatter. |
| 3117 // DATA[i][4] is the currency format result using |
| 3118 // ISOCURRENCYSTYLE formatter. |
| 3119 // DATA[i][5] is the currency format result using |
| 3120 // PLURALCURRENCYSTYLE formatter. |
| 3121 UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); |
| 3122 UErrorCode status = U_ZERO_ERROR; |
| 3123 Formattable parseResult; |
| 3124 numFmt->parse(oneCurrencyFormatResult, parseResult, status); |
| 3125 if (U_FAILURE(status) || |
| 3126 (parseResult.getType() == Formattable::kDouble && |
| 3127 parseResult.getDouble() != numberToBeFormat) || |
| 3128 (parseResult.getType() == Formattable::kLong && |
| 3129 parseResult.getLong() != numberToBeFormat)) { |
| 3130 errln((UnicodeString)"FAIL: getCurrencyFormat of locale " + |
| 3131 localeString + " failed roundtripping the number" + |
| 3132 "(i,k,j): " + i + ", " + k + ", " + j); |
| 3133 if (parseResult.getType() == Formattable::kDouble) { |
| 3134 errln((UnicodeString)"expected: " + numberToBeFormat + "; ac
tual: " +parseResult.getDouble()); |
| 3135 } else { |
| 3136 errln((UnicodeString)"expected: " + numberToBeFormat + "; ac
tual: " +parseResult.getLong()); |
| 3137 } |
| 3138 } |
| 3139 } |
| 3140 delete numFmt; |
| 3141 } |
| 3142 } |
| 3143 #ifdef NUMFMTST_CACHE_DEBUG |
| 3144 } |
| 3145 #endif |
| 3146 } |
| 3147 |
| 3148 |
| 3149 void |
| 3150 NumberFormatTest::TestParseCurrencyInUCurr() { |
| 3151 const char* DATA[] = { |
| 3152 "1.00 US DOLLAR", // case in-sensitive |
| 3153 "$1.00", |
| 3154 "USD1.00", |
| 3155 "US dollar1.00", |
| 3156 "US dollars1.00", |
| 3157 "$1.00", |
| 3158 "AU$1.00", |
| 3159 "ADP1.00", |
| 3160 "ADP1.00", |
| 3161 "AED1.00", |
| 3162 "AED1.00", |
| 3163 "AFA1.00", |
| 3164 "AFA1.00", |
| 3165 "AFN1.00", |
| 3166 "ALL1.00", |
| 3167 "AMD1.00", |
| 3168 "ANG1.00", |
| 3169 "AOA1.00", |
| 3170 "AOK1.00", |
| 3171 "AOK1.00", |
| 3172 "AON1.00", |
| 3173 "AON1.00", |
| 3174 "AOR1.00", |
| 3175 "AOR1.00", |
| 3176 "AR$1.00", |
| 3177 "ARA1.00", |
| 3178 "ARA1.00", |
| 3179 "ARP1.00", |
| 3180 "ARP1.00", |
| 3181 "ARS1.00", |
| 3182 "ATS1.00", |
| 3183 "ATS1.00", |
| 3184 "AUD1.00", |
| 3185 "AWG1.00", |
| 3186 "AZM1.00", |
| 3187 "AZM1.00", |
| 3188 "AZN1.00", |
| 3189 "Af1.00", |
| 3190 "Afghan Afghani (1927-2002)1.00", |
| 3191 "Afghan Afghani (AFA)1.00", |
| 3192 "Afghan Afghani1.00", |
| 3193 "Afghan Afghani1.00", |
| 3194 "Afghan Afghanis (AFA)1.00", |
| 3195 "Afghan Afghanis1.00", |
| 3196 "Afl.1.00", |
| 3197 "Albanian Lek1.00", |
| 3198 "Albanian lek1.00", |
| 3199 "Albanian lek\\u00eb1.00", |
| 3200 "Algerian Dinar1.00", |
| 3201 "Algerian dinar1.00", |
| 3202 "Algerian dinars1.00", |
| 3203 "Andorran Peseta1.00", |
| 3204 "Andorran peseta1.00", |
| 3205 "Andorran pesetas1.00", |
| 3206 "Angolan Kwanza (1977-1991)1.00", |
| 3207 "Angolan Readjusted Kwanza (1995-1999)1.00", |
| 3208 "Angolan Kwanza1.00", |
| 3209 "Angolan New Kwanza (1990-2000)1.00", |
| 3210 "Angolan kwanza (1977-1991)1.00", |
| 3211 "Angolan readjusted kwanza (1995-1999)1.00", |
| 3212 "Angolan kwanza1.00", |
| 3213 "Angolan kwanzas (1977-1991)1.00", |
| 3214 "Angolan readjusted kwanzas (1995-1999)1.00", |
| 3215 "Angolan kwanzas1.00", |
| 3216 "Angolan new kwanza (1990-2000)1.00", |
| 3217 "Angolan new kwanzas (1990-2000)1.00", |
| 3218 "Argentine Austral1.00", |
| 3219 "Argentine Peso (1983-1985)1.00", |
| 3220 "Argentine Peso1.00", |
| 3221 "Argentine austral1.00", |
| 3222 "Argentine australs1.00", |
| 3223 "Argentine peso (1983-1985)1.00", |
| 3224 "Argentine peso1.00", |
| 3225 "Argentine pesos (1983-1985)1.00", |
| 3226 "Argentine pesos1.00", |
| 3227 "Armenian Dram1.00", |
| 3228 "Armenian dram1.00", |
| 3229 "Armenian drams1.00", |
| 3230 "Aruban Florin1.00", |
| 3231 "Aruban florin1.00", |
| 3232 "Australian Dollar1.00", |
| 3233 "Australian dollar1.00", |
| 3234 "Australian dollars1.00", |
| 3235 "Austrian Schilling1.00", |
| 3236 "Austrian schilling1.00", |
| 3237 "Austrian schillings1.00", |
| 3238 "Azerbaijani Manat (1993-2006)1.00", |
| 3239 "Azerbaijani Manat1.00", |
| 3240 "Azerbaijani manat (1993-2006)1.00", |
| 3241 "Azerbaijani manat1.00", |
| 3242 "Azerbaijani manats (1993-2006)1.00", |
| 3243 "Azerbaijani manats1.00", |
| 3244 "BN$1.00", |
| 3245 "BAD1.00", |
| 3246 "BAD1.00", |
| 3247 "BAM1.00", |
| 3248 "BBD1.00", |
| 3249 "BD$1.00", |
| 3250 "BDT1.00", |
| 3251 "BEC1.00", |
| 3252 "BEC1.00", |
| 3253 "BEF1.00", |
| 3254 "BEL1.00", |
| 3255 "BEL1.00", |
| 3256 "BF1.00", |
| 3257 "BGL1.00", |
| 3258 "BGN1.00", |
| 3259 "BGN1.00", |
| 3260 "BHD1.00", |
| 3261 "BIF1.00", |
| 3262 "BMD1.00", |
| 3263 "BND1.00", |
| 3264 "BOB1.00", |
| 3265 "BOP1.00", |
| 3266 "BOP1.00", |
| 3267 "BOV1.00", |
| 3268 "BOV1.00", |
| 3269 "BRB1.00", |
| 3270 "BRB1.00", |
| 3271 "BRC1.00", |
| 3272 "BRC1.00", |
| 3273 "BRE1.00", |
| 3274 "BRE1.00", |
| 3275 "BRL1.00", |
| 3276 "BRN1.00", |
| 3277 "BRN1.00", |
| 3278 "BRR1.00", |
| 3279 "BRR1.00", |
| 3280 "BSD1.00", |
| 3281 "BSD1.00", |
| 3282 "BTN1.00", |
| 3283 "BUK1.00", |
| 3284 "BUK1.00", |
| 3285 "BWP1.00", |
| 3286 "BYB1.00", |
| 3287 "BYB1.00", |
| 3288 "BYR1.00", |
| 3289 "BZ$1.00", |
| 3290 "BZD1.00", |
| 3291 "Bahamian Dollar1.00", |
| 3292 "Bahamian dollar1.00", |
| 3293 "Bahamian dollars1.00", |
| 3294 "Bahraini Dinar1.00", |
| 3295 "Bahraini dinar1.00", |
| 3296 "Bahraini dinars1.00", |
| 3297 "Bangladeshi Taka1.00", |
| 3298 "Bangladeshi taka1.00", |
| 3299 "Bangladeshi takas1.00", |
| 3300 "Barbadian Dollar1.00", |
| 3301 "Barbadian dollar1.00", |
| 3302 "Barbadian dollars1.00", |
| 3303 "Bds$1.00", |
| 3304 "Belarusian New Ruble (1994-1999)1.00", |
| 3305 "Belarusian Ruble1.00", |
| 3306 "Belarusian new ruble (1994-1999)1.00", |
| 3307 "Belarusian new rubles (1994-1999)1.00", |
| 3308 "Belarusian ruble1.00", |
| 3309 "Belarusian rubles1.00", |
| 3310 "Belgian Franc (convertible)1.00", |
| 3311 "Belgian Franc (financial)1.00", |
| 3312 "Belgian Franc1.00", |
| 3313 "Belgian franc (convertible)1.00", |
| 3314 "Belgian franc (financial)1.00", |
| 3315 "Belgian franc1.00", |
| 3316 "Belgian francs (convertible)1.00", |
| 3317 "Belgian francs (financial)1.00", |
| 3318 "Belgian francs1.00", |
| 3319 "Belize Dollar1.00", |
| 3320 "Belize dollar1.00", |
| 3321 "Belize dollars1.00", |
| 3322 "Bermudan Dollar1.00", |
| 3323 "Bermudan dollar1.00", |
| 3324 "Bermudan dollars1.00", |
| 3325 "Bhutanese Ngultrum1.00", |
| 3326 "Bhutanese ngultrum1.00", |
| 3327 "Bhutanese ngultrums1.00", |
| 3328 "Bolivian Mvdol1.00", |
| 3329 "Bolivian Peso1.00", |
| 3330 "Bolivian mvdol1.00", |
| 3331 "Bolivian mvdols1.00", |
| 3332 "Bolivian peso1.00", |
| 3333 "Bolivian pesos1.00", |
| 3334 "Bolivian Boliviano1.00", |
| 3335 "Bolivian Boliviano1.00", |
| 3336 "Bolivian Bolivianos1.00", |
| 3337 "Bosnia-Herzegovina Convertible Mark1.00", |
| 3338 "Bosnia-Herzegovina Dinar (1992-1994)1.00", |
| 3339 "Bosnia-Herzegovina convertible mark1.00", |
| 3340 "Bosnia-Herzegovina convertible marks1.00", |
| 3341 "Bosnia-Herzegovina dinar (1992-1994)1.00", |
| 3342 "Bosnia-Herzegovina dinars (1992-1994)1.00", |
| 3343 "Botswanan Pula1.00", |
| 3344 "Botswanan pula1.00", |
| 3345 "Botswanan pulas1.00", |
| 3346 "Br1.00", |
| 3347 "Brazilian New Cruzado (1989-1990)1.00", |
| 3348 "Brazilian Cruzado (1986-1989)1.00", |
| 3349 "Brazilian Cruzeiro (1990-1993)1.00", |
| 3350 "Brazilian New Cruzeiro (1967-1986)1.00", |
| 3351 "Brazilian Cruzeiro (1993-1994)1.00", |
| 3352 "Brazilian Real1.00", |
| 3353 "Brazilian new cruzado (1989-1990)1.00", |
| 3354 "Brazilian new cruzados (1989-1990)1.00", |
| 3355 "Brazilian cruzado (1986-1989)1.00", |
| 3356 "Brazilian cruzados (1986-1989)1.00", |
| 3357 "Brazilian cruzeiro (1990-1993)1.00", |
| 3358 "Brazilian new cruzeiro (1967-1986)1.00", |
| 3359 "Brazilian cruzeiro (1993-1994)1.00", |
| 3360 "Brazilian cruzeiros (1990-1993)1.00", |
| 3361 "Brazilian new cruzeiros (1967-1986)1.00", |
| 3362 "Brazilian cruzeiros (1993-1994)1.00", |
| 3363 "Brazilian real1.00", |
| 3364 "Brazilian reals1.00", |
| 3365 "British Pound Sterling1.00", |
| 3366 "British pound sterling1.00", |
| 3367 "British pounds sterling1.00", |
| 3368 "Brunei Dollar1.00", |
| 3369 "Brunei dollar1.00", |
| 3370 "Brunei dollars1.00", |
| 3371 "Bs1.00", |
| 3372 "Bs.F.1.00", |
| 3373 "Bulgarian Hard Lev1.00", |
| 3374 "Bulgarian Lev1.00", |
| 3375 "Bulgarian Leva1.00", |
| 3376 "Bulgarian hard lev1.00", |
| 3377 "Bulgarian hard leva1.00", |
| 3378 "Bulgarian lev1.00", |
| 3379 "Burmese Kyat1.00", |
| 3380 "Burmese kyat1.00", |
| 3381 "Burmese kyats1.00", |
| 3382 "Burundian Franc1.00", |
| 3383 "Burundian franc1.00", |
| 3384 "Burundian francs1.00", |
| 3385 "C$1.00", |
| 3386 "CA$1.00", |
| 3387 "CAD1.00", |
| 3388 "CDF1.00", |
| 3389 "CDF1.00", |
| 3390 "CF1.00", |
| 3391 "CFA Franc BCEAO1.00", |
| 3392 "CFA Franc BEAC1.00", |
| 3393 "CFA franc BCEAO1.00", |
| 3394 "CFA franc BEAC1.00", |
| 3395 "CFA francs BCEAO1.00", |
| 3396 "CFA francs BEAC1.00", |
| 3397 "CFP Franc1.00", |
| 3398 "CFP franc1.00", |
| 3399 "CFP francs1.00", |
| 3400 "CFPF1.00", |
| 3401 "CHE1.00", |
| 3402 "CHE1.00", |
| 3403 "CHF1.00", |
| 3404 "CHW1.00", |
| 3405 "CHW1.00", |
| 3406 "CL$1.00", |
| 3407 "CLF1.00", |
| 3408 "CLF1.00", |
| 3409 "CLP1.00", |
| 3410 "CNY1.00", |
| 3411 "CO$1.00", |
| 3412 "COP1.00", |
| 3413 "COU1.00", |
| 3414 "COU1.00", |
| 3415 "CRC1.00", |
| 3416 "CSD1.00", |
| 3417 "CSD1.00", |
| 3418 "CSK1.00", |
| 3419 "CSK1.00", |
| 3420 "CUP1.00", |
| 3421 "CUP1.00", |
| 3422 "CVE1.00", |
| 3423 "CYP1.00", |
| 3424 "CZK1.00", |
| 3425 "Cambodian Riel1.00", |
| 3426 "Cambodian riel1.00", |
| 3427 "Cambodian riels1.00", |
| 3428 "Canadian Dollar1.00", |
| 3429 "Canadian dollar1.00", |
| 3430 "Canadian dollars1.00", |
| 3431 "Cape Verdean Escudo1.00", |
| 3432 "Cape Verdean escudo1.00", |
| 3433 "Cape Verdean escudos1.00", |
| 3434 "Cayman Islands Dollar1.00", |
| 3435 "Cayman Islands dollar1.00", |
| 3436 "Cayman Islands dollars1.00", |
| 3437 "Chilean Peso1.00", |
| 3438 "Chilean Unit of Account (UF)1.00", |
| 3439 "Chilean peso1.00", |
| 3440 "Chilean pesos1.00", |
| 3441 "Chilean unit of account (UF)1.00", |
| 3442 "Chilean units of account (UF)1.00", |
| 3443 "Chinese Yuan1.00", |
| 3444 "Chinese yuan1.00", |
| 3445 "Colombian Peso1.00", |
| 3446 "Colombian peso1.00", |
| 3447 "Colombian pesos1.00", |
| 3448 "Comorian Franc1.00", |
| 3449 "Comorian franc1.00", |
| 3450 "Comorian francs1.00", |
| 3451 "Congolese Franc1.00", |
| 3452 "Congolese franc1.00", |
| 3453 "Congolese francs1.00", |
| 3454 "Costa Rican Col\\u00f3n1.00", |
| 3455 "Costa Rican col\\u00f3n1.00", |
| 3456 "Costa Rican col\\u00f3ns1.00", |
| 3457 "Croatian Dinar1.00", |
| 3458 "Croatian Kuna1.00", |
| 3459 "Croatian dinar1.00", |
| 3460 "Croatian dinars1.00", |
| 3461 "Croatian kuna1.00", |
| 3462 "Croatian kunas1.00", |
| 3463 "Cuban Peso1.00", |
| 3464 "Cuban peso1.00", |
| 3465 "Cuban pesos1.00", |
| 3466 "Cypriot Pound1.00", |
| 3467 "Cypriot pound1.00", |
| 3468 "Cypriot pounds1.00", |
| 3469 "Czech Republic Koruna1.00", |
| 3470 "Czech Republic koruna1.00", |
| 3471 "Czech Republic korunas1.00", |
| 3472 "Czechoslovak Hard Koruna1.00", |
| 3473 "Czechoslovak hard koruna1.00", |
| 3474 "Czechoslovak hard korunas1.00", |
| 3475 "DA1.00", |
| 3476 "DDM1.00", |
| 3477 "DDM1.00", |
| 3478 "DEM1.00", |
| 3479 "DEM1.00", |
| 3480 "DJF1.00", |
| 3481 "DKK1.00", |
| 3482 "DOP1.00", |
| 3483 "DZD1.00", |
| 3484 "Danish Krone1.00", |
| 3485 "Danish krone1.00", |
| 3486 "Danish kroner1.00", |
| 3487 "Db1.00", |
| 3488 "German Mark1.00", |
| 3489 "German mark1.00", |
| 3490 "German marks1.00", |
| 3491 "Djiboutian Franc1.00", |
| 3492 "Djiboutian franc1.00", |
| 3493 "Djiboutian francs1.00", |
| 3494 "Dkr1.00", |
| 3495 "Dominican Peso1.00", |
| 3496 "Dominican peso1.00", |
| 3497 "Dominican pesos1.00", |
| 3498 "EC$1.00", |
| 3499 "ECS1.00", |
| 3500 "ECS1.00", |
| 3501 "ECV1.00", |
| 3502 "ECV1.00", |
| 3503 "EEK1.00", |
| 3504 "EEK1.00", |
| 3505 "EGP1.00", |
| 3506 "EGP1.00", |
| 3507 "ERN1.00", |
| 3508 "ERN1.00", |
| 3509 "ESA1.00", |
| 3510 "ESA1.00", |
| 3511 "ESB1.00", |
| 3512 "ESB1.00", |
| 3513 "ESP1.00", |
| 3514 "ETB1.00", |
| 3515 "EUR1.00", |
| 3516 "East Caribbean Dollar1.00", |
| 3517 "East Caribbean dollar1.00", |
| 3518 "East Caribbean dollars1.00", |
| 3519 "East German Mark1.00", |
| 3520 "East German mark1.00", |
| 3521 "East German marks1.00", |
| 3522 "Ecuadorian Sucre1.00", |
| 3523 "Ecuadorian Unit of Constant Value1.00", |
| 3524 "Ecuadorian sucre1.00", |
| 3525 "Ecuadorian sucres1.00", |
| 3526 "Ecuadorian unit of constant value1.00", |
| 3527 "Ecuadorian units of constant value1.00", |
| 3528 "Egyptian Pound1.00", |
| 3529 "Egyptian pound1.00", |
| 3530 "Egyptian pounds1.00", |
| 3531 "Salvadoran Col\\u00f3n1.00", |
| 3532 "Salvadoran col\\u00f3n1.00", |
| 3533 "Salvadoran colones1.00", |
| 3534 "Equatorial Guinean Ekwele1.00", |
| 3535 "Equatorial Guinean ekwele1.00", |
| 3536 "Eritrean Nakfa1.00", |
| 3537 "Eritrean nakfa1.00", |
| 3538 "Eritrean nakfas1.00", |
| 3539 "Esc1.00", |
| 3540 "Estonian Kroon1.00", |
| 3541 "Estonian kroon1.00", |
| 3542 "Estonian kroons1.00", |
| 3543 "Ethiopian Birr1.00", |
| 3544 "Ethiopian birr1.00", |
| 3545 "Ethiopian birrs1.00", |
| 3546 "Euro1.00", |
| 3547 "European Composite Unit1.00", |
| 3548 "European Currency Unit1.00", |
| 3549 "European Monetary Unit1.00", |
| 3550 "European Unit of Account (XBC)1.00", |
| 3551 "European Unit of Account (XBD)1.00", |
| 3552 "European composite unit1.00", |
| 3553 "European composite units1.00", |
| 3554 "European currency unit1.00", |
| 3555 "European currency units1.00", |
| 3556 "European monetary unit1.00", |
| 3557 "European monetary units1.00", |
| 3558 "European unit of account (XBC)1.00", |
| 3559 "European unit of account (XBD)1.00", |
| 3560 "European units of account (XBC)1.00", |
| 3561 "European units of account (XBD)1.00", |
| 3562 "FJ$1.00", |
| 3563 "FBu1.00", |
| 3564 "FIM1.00", |
| 3565 "FIM1.00", |
| 3566 "FJD1.00", |
| 3567 "FKP1.00", |
| 3568 "FKP1.00", |
| 3569 "FRF1.00", |
| 3570 "FRF1.00", |
| 3571 "Falkland Islands Pound1.00", |
| 3572 "Falkland Islands pound1.00", |
| 3573 "Falkland Islands pounds1.00", |
| 3574 "Fdj1.00", |
| 3575 "Fijian Dollar1.00", |
| 3576 "Fijian dollar1.00", |
| 3577 "Fijian dollars1.00", |
| 3578 "Finnish Markka1.00", |
| 3579 "Finnish markka1.00", |
| 3580 "Finnish markkas1.00", |
| 3581 "CHF1.00", |
| 3582 "French Franc1.00", |
| 3583 "French Gold Franc1.00", |
| 3584 "French UIC-Franc1.00", |
| 3585 "French UIC-franc1.00", |
| 3586 "French UIC-francs1.00", |
| 3587 "French franc1.00", |
| 3588 "French francs1.00", |
| 3589 "French gold franc1.00", |
| 3590 "French gold francs1.00", |
| 3591 "Ft1.00", |
| 3592 "GY$1.00", |
| 3593 "GBP1.00", |
| 3594 "GEK1.00", |
| 3595 "GEK1.00", |
| 3596 "GEL1.00", |
| 3597 "FG1.00", |
| 3598 "GHC1.00", |
| 3599 "GHC1.00", |
| 3600 "GHS1.00", |
| 3601 "GIP1.00", |
| 3602 "GIP1.00", |
| 3603 "GMD1.00", |
| 3604 "GMD1.00", |
| 3605 "GNF1.00", |
| 3606 "GNS1.00", |
| 3607 "GNS1.00", |
| 3608 "GQE1.00", |
| 3609 "GQE1.00", |
| 3610 "GRD1.00", |
| 3611 "GRD1.00", |
| 3612 "GTQ1.00", |
| 3613 "GWE1.00", |
| 3614 "GWE1.00", |
| 3615 "GWP1.00", |
| 3616 "GWP1.00", |
| 3617 "GYD1.00", |
| 3618 "Gambian Dalasi1.00", |
| 3619 "Gambian dalasi1.00", |
| 3620 "Gambian dalasis1.00", |
| 3621 "Georgian Kupon Larit1.00", |
| 3622 "Georgian Lari1.00", |
| 3623 "Georgian kupon larit1.00", |
| 3624 "Georgian kupon larits1.00", |
| 3625 "Georgian lari1.00", |
| 3626 "Georgian laris1.00", |
| 3627 "Ghanaian Cedi (1979-2007)1.00", |
| 3628 "Ghanaian Cedi1.00", |
| 3629 "Ghanaian cedi (1979-2007)1.00", |
| 3630 "Ghanaian cedi1.00", |
| 3631 "Ghanaian cedis (1979-2007)1.00", |
| 3632 "Ghanaian cedis1.00", |
| 3633 "Gibraltar Pound1.00", |
| 3634 "Gibraltar pound1.00", |
| 3635 "Gibraltar pounds1.00", |
| 3636 "Gold1.00", |
| 3637 "Gold1.00", |
| 3638 "Greek Drachma1.00", |
| 3639 "Greek drachma1.00", |
| 3640 "Greek drachmas1.00", |
| 3641 "Guatemalan Quetzal1.00", |
| 3642 "Guatemalan quetzal1.00", |
| 3643 "Guatemalan quetzals1.00", |
| 3644 "Guinean Franc1.00", |
| 3645 "Guinean Syli1.00", |
| 3646 "Guinean franc1.00", |
| 3647 "Guinean francs1.00", |
| 3648 "Guinean syli1.00", |
| 3649 "Guinean sylis1.00", |
| 3650 "Guinea-Bissau Peso1.00", |
| 3651 "Guinea-Bissau peso1.00", |
| 3652 "Guinea-Bissau pesos1.00", |
| 3653 "Guyanaese Dollar1.00", |
| 3654 "Guyanaese dollar1.00", |
| 3655 "Guyanaese dollars1.00", |
| 3656 "HK$1.00", |
| 3657 "HKD1.00", |
| 3658 "HNL1.00", |
| 3659 "HRD1.00", |
| 3660 "HRD1.00", |
| 3661 "HRK1.00", |
| 3662 "HRK1.00", |
| 3663 "HTG1.00", |
| 3664 "HTG1.00", |
| 3665 "HUF1.00", |
| 3666 "Haitian Gourde1.00", |
| 3667 "Haitian gourde1.00", |
| 3668 "Haitian gourdes1.00", |
| 3669 "Honduran Lempira1.00", |
| 3670 "Honduran lempira1.00", |
| 3671 "Honduran lempiras1.00", |
| 3672 "Hong Kong Dollar1.00", |
| 3673 "Hong Kong dollar1.00", |
| 3674 "Hong Kong dollars1.00", |
| 3675 "Hungarian Forint1.00", |
| 3676 "Hungarian forint1.00", |
| 3677 "Hungarian forints1.00", |
| 3678 "IDR1.00", |
| 3679 "IEP1.00", |
| 3680 "ILP1.00", |
| 3681 "ILP1.00", |
| 3682 "ILS1.00", |
| 3683 "INR1.00", |
| 3684 "IQD1.00", |
| 3685 "IRR1.00", |
| 3686 "IR\\u00a31.00", |
| 3687 "ISK1.00", |
| 3688 "ISK1.00", |
| 3689 "ITL1.00", |
| 3690 "Icelandic Kr\\u00f3na1.00", |
| 3691 "Icelandic kr\\u00f3na1.00", |
| 3692 "Icelandic kr\\u00f3nur1.00", |
| 3693 "Indian Rupee1.00", |
| 3694 "Indian rupee1.00", |
| 3695 "Indian rupees1.00", |
| 3696 "Indonesian Rupiah1.00", |
| 3697 "Indonesian rupiah1.00", |
| 3698 "Indonesian rupiahs1.00", |
| 3699 "Iranian Rial1.00", |
| 3700 "Iranian rial1.00", |
| 3701 "Iranian rials1.00", |
| 3702 "Iraqi Dinar1.00", |
| 3703 "Iraqi dinar1.00", |
| 3704 "Iraqi dinars1.00", |
| 3705 "Irish Pound1.00", |
| 3706 "Irish pound1.00", |
| 3707 "Irish pounds1.00", |
| 3708 "Israeli Pound1.00", |
| 3709 "Israeli new sheqel1.00", |
| 3710 "Israeli pound1.00", |
| 3711 "Israeli pounds1.00", |
| 3712 "Italian Lira1.00", |
| 3713 "Italian lira1.00", |
| 3714 "Italian liras1.00", |
| 3715 "J$1.00", |
| 3716 "JD1.00", |
| 3717 "JMD1.00", |
| 3718 "JOD1.00", |
| 3719 "JPY1.00", |
| 3720 "Jamaican Dollar1.00", |
| 3721 "Jamaican dollar1.00", |
| 3722 "Jamaican dollars1.00", |
| 3723 "Japanese Yen1.00", |
| 3724 "Japanese yen1.00", |
| 3725 "Jordanian Dinar1.00", |
| 3726 "Jordanian dinar1.00", |
| 3727 "Jordanian dinars1.00", |
| 3728 "Ksh1.00", |
| 3729 "KD1.00", |
| 3730 "KES1.00", |
| 3731 "KGS1.00", |
| 3732 "KHR1.00", |
| 3733 "KMF1.00", |
| 3734 "KPW1.00", |
| 3735 "KPW1.00", |
| 3736 "KRW1.00", |
| 3737 "KWD1.00", |
| 3738 "KYD1.00", |
| 3739 "KYD1.00", |
| 3740 "KZT1.00", |
| 3741 "Kazakhstani Tenge1.00", |
| 3742 "Kazakhstani tenge1.00", |
| 3743 "Kazakhstani tenges1.00", |
| 3744 "Kenyan Shilling1.00", |
| 3745 "Kenyan shilling1.00", |
| 3746 "Kenyan shillings1.00", |
| 3747 "Kuwaiti Dinar1.00", |
| 3748 "Kuwaiti dinar1.00", |
| 3749 "Kuwaiti dinars1.00", |
| 3750 "Kyrgystani Som1.00", |
| 3751 "Kyrgystani som1.00", |
| 3752 "Kyrgystani soms1.00", |
| 3753 "Kz1.00", |
| 3754 "K\\u010d1.00", |
| 3755 "HNL1.00", |
| 3756 "LAK1.00", |
| 3757 "LAK1.00", |
| 3758 "LBP1.00", |
| 3759 "LD1.00", |
| 3760 "LKR1.00", |
| 3761 "LB\\u00a31.00", |
| 3762 "LRD1.00", |
| 3763 "LRD1.00", |
| 3764 "LSL1.00", |
| 3765 "LTL1.00", |
| 3766 "LTL1.00", |
| 3767 "LTT1.00", |
| 3768 "LTT1.00", |
| 3769 "LUC1.00", |
| 3770 "LUC1.00", |
| 3771 "LUF1.00", |
| 3772 "LUF1.00", |
| 3773 "LUL1.00", |
| 3774 "LUL1.00", |
| 3775 "LVL1.00", |
| 3776 "LVL1.00", |
| 3777 "LVR1.00", |
| 3778 "LVR1.00", |
| 3779 "LYD1.00", |
| 3780 "Laotian Kip1.00", |
| 3781 "Laotian kip1.00", |
| 3782 "Laotian kips1.00", |
| 3783 "Latvian Lats1.00", |
| 3784 "Latvian Ruble1.00", |
| 3785 "Latvian lats1.00", |
| 3786 "Latvian lati.00", |
| 3787 "Latvian ruble1.00", |
| 3788 "Latvian rubles1.00", |
| 3789 "Lebanese Pound1.00", |
| 3790 "Lebanese pound1.00", |
| 3791 "Lebanese pounds1.00", |
| 3792 "Lesotho Loti1.00", |
| 3793 "Lesotho loti1.00", |
| 3794 "Lesotho lotis1.00", |
| 3795 "Liberian Dollar1.00", |
| 3796 "Liberian dollar1.00", |
| 3797 "Liberian dollars1.00", |
| 3798 "Libyan Dinar1.00", |
| 3799 "Libyan dinar1.00", |
| 3800 "Libyan dinars1.00", |
| 3801 "Lithuanian Litas1.00", |
| 3802 "Lithuanian Talonas1.00", |
| 3803 "Lithuanian litas1.00", |
| 3804 "Lithuanian litai1.00", |
| 3805 "Lithuanian talonas1.00", |
| 3806 "Lithuanian talonases1.00", |
| 3807 "Lm1.00", |
| 3808 "Luxembourgian Convertible Franc1.00", |
| 3809 "Luxembourg Financial Franc1.00", |
| 3810 "Luxembourgian Franc1.00", |
| 3811 "Luxembourgian convertible franc1.00", |
| 3812 "Luxembourgian convertible francs1.00", |
| 3813 "Luxembourg financial franc1.00", |
| 3814 "Luxembourg financial francs1.00", |
| 3815 "Luxembourgian franc1.00", |
| 3816 "Luxembourgian francs1.00", |
| 3817 "MAD1.00", |
| 3818 "MAD1.00", |
| 3819 "MAF1.00", |
| 3820 "MAF1.00", |
| 3821 "MDL1.00", |
| 3822 "MDL1.00", |
| 3823 "MX$1.00", |
| 3824 "MGA1.00", |
| 3825 "MGA1.00", |
| 3826 "MGF1.00", |
| 3827 "MGF1.00", |
| 3828 "MKD1.00", |
| 3829 "MLF1.00", |
| 3830 "MLF1.00", |
| 3831 "MMK1.00", |
| 3832 "MMK1.00", |
| 3833 "MNT1.00", |
| 3834 "MOP1.00", |
| 3835 "MOP1.00", |
| 3836 "MRO1.00", |
| 3837 "MTL1.00", |
| 3838 "MTP1.00", |
| 3839 "MTP1.00", |
| 3840 "MTn1.00", |
| 3841 "MUR1.00", |
| 3842 "MUR1.00", |
| 3843 "MVR1.00", |
| 3844 "MVR1.00", |
| 3845 "MWK1.00", |
| 3846 "MXN1.00", |
| 3847 "MXP1.00", |
| 3848 "MXP1.00", |
| 3849 "MXV1.00", |
| 3850 "MXV1.00", |
| 3851 "MYR1.00", |
| 3852 "MZE1.00", |
| 3853 "MZE1.00", |
| 3854 "MZM1.00", |
| 3855 "MZN1.00", |
| 3856 "Macanese Pataca1.00", |
| 3857 "Macanese pataca1.00", |
| 3858 "Macanese patacas1.00", |
| 3859 "Macedonian Denar1.00", |
| 3860 "Macedonian denar1.00", |
| 3861 "Macedonian denari1.00", |
| 3862 "Malagasy Ariaries1.00", |
| 3863 "Malagasy Ariary1.00", |
| 3864 "Malagasy Ariary1.00", |
| 3865 "Malagasy Franc1.00", |
| 3866 "Malagasy franc1.00", |
| 3867 "Malagasy francs1.00", |
| 3868 "Malawian Kwacha1.00", |
| 3869 "Malawian Kwacha1.00", |
| 3870 "Malawian Kwachas1.00", |
| 3871 "Malaysian Ringgit1.00", |
| 3872 "Malaysian ringgit1.00", |
| 3873 "Malaysian ringgits1.00", |
| 3874 "Maldivian Rufiyaa1.00", |
| 3875 "Maldivian rufiyaa1.00", |
| 3876 "Maldivian rufiyaas1.00", |
| 3877 "Malian Franc1.00", |
| 3878 "Malian franc1.00", |
| 3879 "Malian francs1.00", |
| 3880 "Maltese Lira1.00", |
| 3881 "Maltese Pound1.00", |
| 3882 "Maltese lira1.00", |
| 3883 "Maltese lira1.00", |
| 3884 "Maltese pound1.00", |
| 3885 "Maltese pounds1.00", |
| 3886 "Mauritanian Ouguiya1.00", |
| 3887 "Mauritanian ouguiya1.00", |
| 3888 "Mauritanian ouguiyas1.00", |
| 3889 "Mauritian Rupee1.00", |
| 3890 "Mauritian rupee1.00", |
| 3891 "Mauritian rupees1.00", |
| 3892 "Mexican Peso1.00", |
| 3893 "Mexican Silver Peso (1861-1992)1.00", |
| 3894 "Mexican Investment Unit1.00", |
| 3895 "Mexican peso1.00", |
| 3896 "Mexican pesos1.00", |
| 3897 "Mexican silver peso (1861-1992)1.00", |
| 3898 "Mexican silver pesos (1861-1992)1.00", |
| 3899 "Mexican investment unit1.00", |
| 3900 "Mexican investment units1.00", |
| 3901 "Moldovan Leu1.00", |
| 3902 "Moldovan leu1.00", |
| 3903 "Moldovan lei1.00", |
| 3904 "Mongolian Tugrik1.00", |
| 3905 "Mongolian tugrik1.00", |
| 3906 "Mongolian tugriks1.00", |
| 3907 "Moroccan Dirham1.00", |
| 3908 "Moroccan Franc1.00", |
| 3909 "Moroccan dirham1.00", |
| 3910 "Moroccan dirhams1.00", |
| 3911 "Moroccan franc1.00", |
| 3912 "Moroccan francs1.00", |
| 3913 "Mozambican Escudo1.00", |
| 3914 "Mozambican Metical1.00", |
| 3915 "Mozambican escudo1.00", |
| 3916 "Mozambican escudos1.00", |
| 3917 "Mozambican metical1.00", |
| 3918 "Mozambican meticals1.00", |
| 3919 "Mt1.00", |
| 3920 "Myanma Kyat1.00", |
| 3921 "Myanma kyat1.00", |
| 3922 "Myanma kyats1.00", |
| 3923 "N$1.00", |
| 3924 "NAD1.00", |
| 3925 "NAf.1.00", |
| 3926 "NGN1.00", |
| 3927 "NIC1.00", |
| 3928 "NIO1.00", |
| 3929 "NIO1.00", |
| 3930 "Nkr1.00", |
| 3931 "NLG1.00", |
| 3932 "NLG1.00", |
| 3933 "NOK1.00", |
| 3934 "NPR1.00", |
| 3935 "NT$1.00", |
| 3936 "NZ$1.00", |
| 3937 "NZD1.00", |
| 3938 "Namibian Dollar1.00", |
| 3939 "Namibian dollar1.00", |
| 3940 "Namibian dollars1.00", |
| 3941 "Nepalese Rupee1.00", |
| 3942 "Nepalese rupee1.00", |
| 3943 "Nepalese rupees1.00", |
| 3944 "Netherlands Antillean Guilder1.00", |
| 3945 "Netherlands Antillean guilder1.00", |
| 3946 "Netherlands Antillean guilders1.00", |
| 3947 "Dutch Guilder1.00", |
| 3948 "Dutch guilder1.00", |
| 3949 "Dutch guilders1.00", |
| 3950 "Israeli New Sheqel1.00", |
| 3951 "Israeli New Sheqels1.00", |
| 3952 "New Zealand Dollar1.00", |
| 3953 "New Zealand dollar1.00", |
| 3954 "New Zealand dollars1.00", |
| 3955 "Nicaraguan C\\u00f3rdoba1.00", |
| 3956 "Nicaraguan C\\u00f3rdoba (1988-1991)1.00", |
| 3957 "Nicaraguan c\\u00f3rdoba1.00", |
| 3958 "Nicaraguan c\\u00f3rdobas1.00", |
| 3959 "Nicaraguan c\\u00f3rdoba (1988-1991)1.00", |
| 3960 "Nicaraguan c\\u00f3rdobas (1988-1991)1.00", |
| 3961 "Nigerian Naira1.00", |
| 3962 "Nigerian naira1.00", |
| 3963 "Nigerian nairas1.00", |
| 3964 "North Korean Won1.00", |
| 3965 "North Korean won1.00", |
| 3966 "North Korean won1.00", |
| 3967 "Norwegian Krone1.00", |
| 3968 "Norwegian krone1.00", |
| 3969 "Norwegian kroner1.00", |
| 3970 "NPRs1.00", |
| 3971 "Nu.1.00", |
| 3972 "OMR1.00", |
| 3973 "Mozambican Metical (1980-2006)1.00", |
| 3974 "Mozambican metical (1980-2006)1.00", |
| 3975 "Mozambican meticals (1980-2006)1.00", |
| 3976 "Romanian Lei (1952-2006)1.00", |
| 3977 "Romanian Leu (1952-2006)1.00", |
| 3978 "Romanian leu (1952-2006)1.00", |
| 3979 "Serbian Dinar (2002-2006)1.00", |
| 3980 "Serbian dinar (2002-2006)1.00", |
| 3981 "Serbian dinars (2002-2006)1.00", |
| 3982 "Sudanese Dinar (1992-2007)1.00", |
| 3983 "Sudanese Pound (1957-1998)1.00", |
| 3984 "Sudanese dinar (1992-2007)1.00", |
| 3985 "Sudanese dinars (1992-2007)1.00", |
| 3986 "Sudanese pound (1957-1998)1.00", |
| 3987 "Sudanese pounds (1957-1998)1.00", |
| 3988 "Turkish Lira (1922-2005)1.00", |
| 3989 "Turkish Lira (1922-2005)1.00", |
| 3990 "Omani Rial1.00", |
| 3991 "Omani rial1.00", |
| 3992 "Omani rials1.00", |
| 3993 "PAB1.00", |
| 3994 "PAB1.00", |
| 3995 "PEI1.00", |
| 3996 "PEI1.00", |
| 3997 "PEN1.00", |
| 3998 "PEN1.00", |
| 3999 "PES1.00", |
| 4000 "PES1.00", |
| 4001 "PGK1.00", |
| 4002 "PGK1.00", |
| 4003 "PHP1.00", |
| 4004 "PKR1.00", |
| 4005 "PLN1.00", |
| 4006 "PLZ1.00", |
| 4007 "PLZ1.00", |
| 4008 "PTE1.00", |
| 4009 "PTE1.00", |
| 4010 "PYG1.00", |
| 4011 "Pakistani Rupee1.00", |
| 4012 "Pakistani rupee1.00", |
| 4013 "Pakistani rupees1.00", |
| 4014 "Palladium1.00", |
| 4015 "Palladium1.00", |
| 4016 "Panamanian Balboa1.00", |
| 4017 "Panamanian balboa1.00", |
| 4018 "Panamanian balboas1.00", |
| 4019 "Papua New Guinean Kina1.00", |
| 4020 "Papua New Guinean kina1.00", |
| 4021 "Papua New Guinean kina1.00", |
| 4022 "Paraguayan Guarani1.00", |
| 4023 "Paraguayan guarani1.00", |
| 4024 "Paraguayan guaranis1.00", |
| 4025 "Peruvian Inti1.00", |
| 4026 "Peruvian Nuevo Sol1.00", |
| 4027 "Peruvian Sol (1863-1965)1.00", |
| 4028 "Peruvian inti1.00", |
| 4029 "Peruvian intis1.00", |
| 4030 "Peruvian nuevo sol1.00", |
| 4031 "Peruvian nuevos soles1.00", |
| 4032 "Peruvian sol (1863-1965)1.00", |
| 4033 "Peruvian soles (1863-1965)1.00", |
| 4034 "Philippine Peso1.00", |
| 4035 "Philippine peso1.00", |
| 4036 "Philippine pesos1.00", |
| 4037 "Platinum1.00", |
| 4038 "Platinum1.00", |
| 4039 "Polish Zloty (1950-1995)1.00", |
| 4040 "Polish Zloty1.00", |
| 4041 "Polish zlotys1.00", |
| 4042 "Polish zloty (PLZ)1.00", |
| 4043 "Polish zloty1.00", |
| 4044 "Polish zlotys (PLZ)1.00", |
| 4045 "Portuguese Escudo1.00", |
| 4046 "Portuguese Guinea Escudo1.00", |
| 4047 "Portuguese Guinea escudo1.00", |
| 4048 "Portuguese Guinea escudos1.00", |
| 4049 "Portuguese escudo1.00", |
| 4050 "Portuguese escudos1.00", |
| 4051 "PKRs1.00", |
| 4052 "GTQ1.00", |
| 4053 "QAR1.00", |
| 4054 "QR1.00", |
| 4055 "Qatari Rial1.00", |
| 4056 "Qatari rial1.00", |
| 4057 "Qatari rials1.00", |
| 4058 "R1.00", |
| 4059 "R$1.00", |
| 4060 "RD$1.00", |
| 4061 "RHD1.00", |
| 4062 "RHD1.00", |
| 4063 "RINET Funds1.00", |
| 4064 "RINET Funds1.00", |
| 4065 "RM1.00", |
| 4066 "CN\\u00a51.00", |
| 4067 "ROL1.00", |
| 4068 "ROL1.00", |
| 4069 "RON1.00", |
| 4070 "RON1.00", |
| 4071 "RSD1.00", |
| 4072 "RSD1.00", |
| 4073 "RUB1.00", |
| 4074 "RUB1.00", |
| 4075 "RUR1.00", |
| 4076 "RUR1.00", |
| 4077 "RWF1.00", |
| 4078 "RWF1.00", |
| 4079 "Rhodesian Dollar1.00", |
| 4080 "Rhodesian dollar1.00", |
| 4081 "Rhodesian dollars1.00", |
| 4082 "Romanian Leu1.00", |
| 4083 "Romanian lei1.00", |
| 4084 "Romanian leu1.00", |
| 4085 "Rp1.00", |
| 4086 "Russian Ruble (1991-1998)1.00", |
| 4087 "Russian Ruble1.00", |
| 4088 "Russian ruble (1991-1998)1.00", |
| 4089 "Russian ruble1.00", |
| 4090 "Russian rubles (1991-1998)1.00", |
| 4091 "Russian rubles1.00", |
| 4092 "Rwandan Franc1.00", |
| 4093 "Rwandan franc1.00", |
| 4094 "Rwandan francs1.00", |
| 4095 "S$1.00", |
| 4096 "SAR1.00", |
| 4097 "SBD1.00", |
| 4098 "SCR1.00", |
| 4099 "SDD1.00", |
| 4100 "SDD1.00", |
| 4101 "SDG1.00", |
| 4102 "SDG1.00", |
| 4103 "SDP1.00", |
| 4104 "SDP1.00", |
| 4105 "SEK1.00", |
| 4106 "SGD1.00", |
| 4107 "SHP1.00", |
| 4108 "SHP1.00", |
| 4109 "SI$1.00", |
| 4110 "SIT1.00", |
| 4111 "SIT1.00", |
| 4112 "SKK1.00", |
| 4113 "Skr1.00", |
| 4114 "SLRs1.00", |
| 4115 "SLL1.00", |
| 4116 "SLL1.00", |
| 4117 "SOS1.00", |
| 4118 "SRD1.00", |
| 4119 "SRD1.00", |
| 4120 "SRG1.00", |
| 4121 "SRe1.00", |
| 4122 "STD1.00", |
| 4123 "SUR1.00", |
| 4124 "SUR1.00", |
| 4125 "SVC1.00", |
| 4126 "SVC1.00", |
| 4127 "SYP1.00", |
| 4128 "SZL1.00", |
| 4129 "Saint Helena Pound1.00", |
| 4130 "Saint Helena pound1.00", |
| 4131 "Saint Helena pounds1.00", |
| 4132 "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobra1.00", |
| 4133 "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobra1.00", |
| 4134 "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobras1.00", |
| 4135 "Saudi Riyal1.00", |
| 4136 "Saudi riyal1.00", |
| 4137 "Saudi riyals1.00", |
| 4138 "Serbian Dinar1.00", |
| 4139 "Serbian dinar1.00", |
| 4140 "Serbian dinars1.00", |
| 4141 "Seychellois Rupee1.00", |
| 4142 "Seychellois rupee1.00", |
| 4143 "Seychellois rupees1.00", |
| 4144 "Sf1.00", |
| 4145 "Ssh1.00", |
| 4146 "Sierra Leonean Leone1.00", |
| 4147 "Sierra Leonean leone1.00", |
| 4148 "Sierra Leonean leones1.00", |
| 4149 "Silver1.00", |
| 4150 "Silver1.00", |
| 4151 "Singapore Dollar1.00", |
| 4152 "Singapore dollar1.00", |
| 4153 "Singapore dollars1.00", |
| 4154 "Sk1.00", |
| 4155 "Slovak Koruna1.00", |
| 4156 "Slovak koruna1.00", |
| 4157 "Slovak korunas1.00", |
| 4158 "Slovenian Tolar1.00", |
| 4159 "Slovenian tolar1.00", |
| 4160 "Slovenian tolars1.00", |
| 4161 "Solomon Islands Dollar1.00", |
| 4162 "Solomon Islands dollar1.00", |
| 4163 "Solomon Islands dollars1.00", |
| 4164 "Somali Shilling1.00", |
| 4165 "Somali shilling1.00", |
| 4166 "Somali shillings1.00", |
| 4167 "South African Rand (financial)1.00", |
| 4168 "South African Rand1.00", |
| 4169 "South African rand (financial)1.00", |
| 4170 "South African rand1.00", |
| 4171 "South African rands (financial)1.00", |
| 4172 "South African rand1.00", |
| 4173 "South Korean Won1.00", |
| 4174 "South Korean won1.00", |
| 4175 "South Korean won1.00", |
| 4176 "Soviet Rouble1.00", |
| 4177 "Soviet rouble1.00", |
| 4178 "Soviet roubles1.00", |
| 4179 "Spanish Peseta (A account)1.00", |
| 4180 "Spanish Peseta (convertible account)1.00", |
| 4181 "Spanish Peseta1.00", |
| 4182 "Spanish peseta (A account)1.00", |
| 4183 "Spanish peseta (convertible account)1.00", |
| 4184 "Spanish peseta1.00", |
| 4185 "Spanish pesetas (A account)1.00", |
| 4186 "Spanish pesetas (convertible account)1.00", |
| 4187 "Spanish pesetas1.00", |
| 4188 "Special Drawing Rights1.00", |
| 4189 "Sri Lankan Rupee1.00", |
| 4190 "Sri Lankan rupee1.00", |
| 4191 "Sri Lankan rupees1.00", |
| 4192 "Sudanese Pound1.00", |
| 4193 "Sudanese pound1.00", |
| 4194 "Sudanese pounds1.00", |
| 4195 "Surinamese Dollar1.00", |
| 4196 "Surinamese dollar1.00", |
| 4197 "Surinamese dollars1.00", |
| 4198 "Surinamese Guilder1.00", |
| 4199 "Surinamese guilder1.00", |
| 4200 "Surinamese guilders1.00", |
| 4201 "Swazi Lilangeni1.00", |
| 4202 "Swazi lilangeni1.00", |
| 4203 "Swazi emalangeni1.00", |
| 4204 "Swedish Krona1.00", |
| 4205 "Swedish krona1.00", |
| 4206 "Swedish kronor1.00", |
| 4207 "Swiss Franc1.00", |
| 4208 "Swiss franc1.00", |
| 4209 "Swiss francs1.00", |
| 4210 "Syrian Pound1.00", |
| 4211 "Syrian pound1.00", |
| 4212 "Syrian pounds1.00", |
| 4213 "TSh1.00", |
| 4214 "T$1.00", |
| 4215 "THB1.00", |
| 4216 "TJR1.00", |
| 4217 "TJR1.00", |
| 4218 "TJS1.00", |
| 4219 "TJS1.00", |
| 4220 "TL1.00", |
| 4221 "TMM1.00", |
| 4222 "TMM1.00", |
| 4223 "TND1.00", |
| 4224 "TND1.00", |
| 4225 "TOP1.00", |
| 4226 "TPE1.00", |
| 4227 "TPE1.00", |
| 4228 "TRL1.00", |
| 4229 "TRY1.00", |
| 4230 "TRY1.00", |
| 4231 "TT$1.00", |
| 4232 "TTD1.00", |
| 4233 "TWD1.00", |
| 4234 "TZS1.00", |
| 4235 "New Taiwan Dollar1.00", |
| 4236 "New Taiwan dollar1.00", |
| 4237 "New Taiwan dollars1.00", |
| 4238 "Tajikistani Ruble1.00", |
| 4239 "Tajikistani Somoni1.00", |
| 4240 "Tajikistani ruble1.00", |
| 4241 "Tajikistani rubles1.00", |
| 4242 "Tajikistani somoni1.00", |
| 4243 "Tajikistani somonis1.00", |
| 4244 "Tanzanian Shilling1.00", |
| 4245 "Tanzanian shilling1.00", |
| 4246 "Tanzanian shillings1.00", |
| 4247 "Testing Currency Code1.00", |
| 4248 "Testing Currency Code1.00", |
| 4249 "Thai Baht1.00", |
| 4250 "Thai baht1.00", |
| 4251 "Thai baht1.00", |
| 4252 "Timorese Escudo1.00", |
| 4253 "Timorese escudo1.00", |
| 4254 "Timorese escudos1.00", |
| 4255 "Tk1.00", |
| 4256 "Tongan Pa\\u02bbanga1.00", |
| 4257 "Tongan pa\\u02bbanga1.00", |
| 4258 "Tongan pa\\u02bbanga1.00", |
| 4259 "Trinidad and Tobago Dollar1.00", |
| 4260 "Trinidad and Tobago dollar1.00", |
| 4261 "Trinidad and Tobago dollars1.00", |
| 4262 "Tunisian Dinar1.00", |
| 4263 "Tunisian dinar1.00", |
| 4264 "Tunisian dinars1.00", |
| 4265 "Turkish Lira1.00", |
| 4266 "Turkish Lira1.00", |
| 4267 "Turkish lira1.00", |
| 4268 "Turkmenistani Manat1.00", |
| 4269 "Turkmenistani manat1.00", |
| 4270 "Turkmenistani manat1.00", |
| 4271 "USh1.00", |
| 4272 "UAE dirham1.00", |
| 4273 "UAE dirhams1.00", |
| 4274 "UAH1.00", |
| 4275 "UAK1.00", |
| 4276 "UAK1.00", |
| 4277 "UGS1.00", |
| 4278 "UGS1.00", |
| 4279 "UGX1.00", |
| 4280 "UM1.00", |
| 4281 "US Dollar (Next day)1.00", |
| 4282 "US Dollar (Same day)1.00", |
| 4283 "US Dollar1.00", |
| 4284 "US dollar (next day)1.00", |
| 4285 "US dollar (same day)1.00", |
| 4286 "US dollar1.00", |
| 4287 "US dollars (next day)1.00", |
| 4288 "US dollars (same day)1.00", |
| 4289 "US dollars1.00", |
| 4290 "USD1.00", |
| 4291 "USN1.00", |
| 4292 "USN1.00", |
| 4293 "USS1.00", |
| 4294 "USS1.00", |
| 4295 "UYI1.00", |
| 4296 "UYI1.00", |
| 4297 "UYP1.00", |
| 4298 "UYP1.00", |
| 4299 "UYU1.00", |
| 4300 "UZS1.00", |
| 4301 "UZS1.00", |
| 4302 "Ugandan Shilling (1966-1987)1.00", |
| 4303 "Ugandan Shilling1.00", |
| 4304 "Ugandan shilling (1966-1987)1.00", |
| 4305 "Ugandan shilling1.00", |
| 4306 "Ugandan shillings (1966-1987)1.00", |
| 4307 "Ugandan shillings1.00", |
| 4308 "Ukrainian Hryvnia1.00", |
| 4309 "Ukrainian Karbovanets1.00", |
| 4310 "Ukrainian hryvnia1.00", |
| 4311 "Ukrainian hryvnias1.00", |
| 4312 "Ukrainian karbovanets1.00", |
| 4313 "Ukrainian karbovantsiv1.00", |
| 4314 "Colombian Real Value Unit1.00", |
| 4315 "United Arab Emirates Dirham1.00", |
| 4316 "Unknown Currency1.00", |
| 4317 "$U1.00", |
| 4318 "Uruguayan Peso (1975-1993)1.00", |
| 4319 "Uruguayan Peso1.00", |
| 4320 "Uruguayan Peso (Indexed Units)1.00", |
| 4321 "Uruguayan peso (1975-1993)1.00", |
| 4322 "Uruguayan peso (indexed units)1.00", |
| 4323 "Uruguayan peso1.00", |
| 4324 "Uruguayan pesos (1975-1993)1.00", |
| 4325 "Uruguayan pesos (indexed units)1.00", |
| 4326 "Uruguayan pesos1.00", |
| 4327 "Uzbekistan Som1.00", |
| 4328 "Uzbekistan som1.00", |
| 4329 "Uzbekistan som1.00", |
| 4330 "VEB1.00", |
| 4331 "VEF1.00", |
| 4332 "VND1.00", |
| 4333 "VT1.00", |
| 4334 "VUV1.00", |
| 4335 "Vanuatu Vatu1.00", |
| 4336 "Vanuatu vatu1.00", |
| 4337 "Vanuatu vatus1.00", |
| 4338 "Venezuelan Bol\\u00edvar1.00", |
| 4339 "Venezuelan Bol\\u00edvar (1871-2008)1.00", |
| 4340 "Venezuelan bol\\u00edvar1.00", |
| 4341 "Venezuelan bol\\u00edvars1.00", |
| 4342 "Venezuelan bol\\u00edvar (1871-2008)1.00", |
| 4343 "Venezuelan bol\\u00edvars (1871-2008)1.00", |
| 4344 "Vietnamese Dong1.00", |
| 4345 "Vietnamese dong1.00", |
| 4346 "Vietnamese dong1.00", |
| 4347 "WIR Euro1.00", |
| 4348 "WIR Franc1.00", |
| 4349 "WIR euro1.00", |
| 4350 "WIR euros1.00", |
| 4351 "WIR franc1.00", |
| 4352 "WIR francs1.00", |
| 4353 "WST1.00", |
| 4354 "WST1.00", |
| 4355 "Samoan Tala1.00", |
| 4356 "Samoan tala1.00", |
| 4357 "Samoan tala1.00", |
| 4358 "XAF1.00", |
| 4359 "XAF1.00", |
| 4360 "XAG1.00", |
| 4361 "XAG1.00", |
| 4362 "XAU1.00", |
| 4363 "XAU1.00", |
| 4364 "XBA1.00", |
| 4365 "XBA1.00", |
| 4366 "XBB1.00", |
| 4367 "XBB1.00", |
| 4368 "XBC1.00", |
| 4369 "XBC1.00", |
| 4370 "XBD1.00", |
| 4371 "XBD1.00", |
| 4372 "XCD1.00", |
| 4373 "XDR1.00", |
| 4374 "XDR1.00", |
| 4375 "XEU1.00", |
| 4376 "XEU1.00", |
| 4377 "XFO1.00", |
| 4378 "XFO1.00", |
| 4379 "XFU1.00", |
| 4380 "XFU1.00", |
| 4381 "XOF1.00", |
| 4382 "XOF1.00", |
| 4383 "XPD1.00", |
| 4384 "XPD1.00", |
| 4385 "XPF1.00", |
| 4386 "XPT1.00", |
| 4387 "XPT1.00", |
| 4388 "XRE1.00", |
| 4389 "XRE1.00", |
| 4390 "XTS1.00", |
| 4391 "XTS1.00", |
| 4392 "XXX1.00", |
| 4393 "XXX1.00", |
| 4394 "YDD1.00", |
| 4395 "YDD1.00", |
| 4396 "YER1.00", |
| 4397 "YUD1.00", |
| 4398 "YUD1.00", |
| 4399 "YUM1.00", |
| 4400 "YUM1.00", |
| 4401 "YUN1.00", |
| 4402 "YUN1.00", |
| 4403 "Yemeni Dinar1.00", |
| 4404 "Yemeni Rial1.00", |
| 4405 "Yemeni dinar1.00", |
| 4406 "Yemeni dinars1.00", |
| 4407 "Yemeni rial1.00", |
| 4408 "Yemeni rials1.00", |
| 4409 "Yugoslavian Convertible Dinar (1990-1992)1.00", |
| 4410 "Yugoslavian Hard Dinar (1966-1990)1.00", |
| 4411 "Yugoslavian New Dinar (1994-2002)1.00", |
| 4412 "Yugoslavian convertible dinar (1990-1992)1.00", |
| 4413 "Yugoslavian convertible dinars (1990-1992)1.00", |
| 4414 "Yugoslavian hard dinar (1966-1990)1.00", |
| 4415 "Yugoslavian hard dinars (1966-1990)1.00", |
| 4416 "Yugoslavian new dinar (1994-2002)1.00", |
| 4417 "Yugoslavian new dinars (1994-2002)1.00", |
| 4418 "Z$1.00", |
| 4419 "ZAL1.00", |
| 4420 "ZAL1.00", |
| 4421 "ZAR1.00", |
| 4422 "ZMK1.00", |
| 4423 "ZMK1.00", |
| 4424 "ZRN1.00", |
| 4425 "ZRN1.00", |
| 4426 "ZRZ1.00", |
| 4427 "ZRZ1.00", |
| 4428 "ZWD1.00", |
| 4429 "Zairean New Zaire (1993-1998)1.00", |
| 4430 "Zairean Zaire (1971-1993)1.00", |
| 4431 "Zairean new zaire (1993-1998)1.00", |
| 4432 "Zairean new zaires (1993-1998)1.00", |
| 4433 "Zairean zaire (1971-1993)1.00", |
| 4434 "Zairean zaires (1971-1993)1.00", |
| 4435 "Zambian Kwacha1.00", |
| 4436 "Zambian kwacha1.00", |
| 4437 "Zambian kwachas1.00", |
| 4438 "Zimbabwean Dollar (1980-2008)1.00", |
| 4439 "Zimbabwean dollar (1980-2008)1.00", |
| 4440 "Zimbabwean dollars (1980-2008)1.00", |
| 4441 "euro1.00", |
| 4442 "euros1.00", |
| 4443 "man.1.00", |
| 4444 "Turkish lira (1922-2005)1.00", |
| 4445 "special drawing rights1.00", |
| 4446 "Colombian real value unit1.00", |
| 4447 "Colombian real value units1.00", |
| 4448 "unknown/invalid currency1.00", |
| 4449 "z\\u01421.00", |
| 4450 "\\u00a31.00", |
| 4451 "CY\\u00a31.00", |
| 4452 "\\u00a51.00", |
| 4453 "\\u0e3f1.00", |
| 4454 "\\u20ab1.00", |
| 4455 "\\u20a11.00", |
| 4456 "Pts1.00", |
| 4457 "\\u20aa1.00", |
| 4458 "\\u20ac1.00", |
| 4459 "Rs1.00", |
| 4460 "\\u20a61.00", |
| 4461 "\\u20ae1.00", |
| 4462 "IT\\u20a41.00", |
| 4463 // for GHS |
| 4464 // for PHP |
| 4465 // for PYG |
| 4466 // for UAH |
| 4467 // |
| 4468 // Following has extra text, should be parsed correctly too |
| 4469 "$1.00 random", |
| 4470 "USD1.00 random", |
| 4471 "1.00 US dollar random", |
| 4472 "1.00 US dollars random", |
| 4473 "1.00 Afghan Afghani random", |
| 4474 "1.00 Afghan Afghani random", |
| 4475 "1.00 Afghan Afghanis (AFA) random", |
| 4476 "1.00 Afghan Afghanis random", |
| 4477 "1.00 Albanian Lek random", |
| 4478 "1.00 Albanian lek random", |
| 4479 "1.00 Albanian lek\\u00eb random", |
| 4480 "1.00 Algerian Dinar random", |
| 4481 "1.00 Algerian dinar random", |
| 4482 "1.00 Algerian dinars random", |
| 4483 "1.00 Andorran Peseta random", |
| 4484 "1.00 Andorran peseta random", |
| 4485 "1.00 Andorran pesetas random", |
| 4486 "1.00 Angolan Kwanza (1977-1990) random", |
| 4487 "1.00 Angolan Readjusted Kwanza (1995-1999) random", |
| 4488 "1.00 Angolan Kwanza random", |
| 4489 "1.00 Angolan New Kwanza (1990-2000) random", |
| 4490 "1.00 Angolan kwanza (1977-1991) random", |
| 4491 "1.00 Angolan readjusted kwanza (1995-1999) random", |
| 4492 "1.00 Angolan kwanza random", |
| 4493 "1.00 Angolan kwanzas (1977-1991) random", |
| 4494 "1.00 Angolan readjusted kwanzas (1995-1999) random", |
| 4495 "1.00 Angolan kwanzas random", |
| 4496 "1.00 Angolan new kwanza (1990-2000) random", |
| 4497 "1.00 Angolan new kwanzas (1990-2000) random", |
| 4498 "1.00 Argentine Austral random", |
| 4499 "1.00 Argentine Peso (1983-1985) random", |
| 4500 "1.00 Argentine Peso random", |
| 4501 "1.00 Argentine austral random", |
| 4502 "1.00 Argentine australs random", |
| 4503 "1.00 Argentine peso (1983-1985) random", |
| 4504 "1.00 Argentine peso random", |
| 4505 "1.00 Argentine pesos (1983-1985) random", |
| 4506 "1.00 Argentine pesos random", |
| 4507 "1.00 Armenian Dram random", |
| 4508 "1.00 Armenian dram random", |
| 4509 "1.00 Armenian drams random", |
| 4510 "1.00 Aruban Florin random", |
| 4511 "1.00 Aruban florin random", |
| 4512 "1.00 Australian Dollar random", |
| 4513 "1.00 Australian dollar random", |
| 4514 "1.00 Australian dollars random", |
| 4515 "1.00 Austrian Schilling random", |
| 4516 "1.00 Austrian schilling random", |
| 4517 "1.00 Austrian schillings random", |
| 4518 "1.00 Azerbaijani Manat (1993-2006) random", |
| 4519 "1.00 Azerbaijani Manat random", |
| 4520 "1.00 Azerbaijani manat (1993-2006) random", |
| 4521 "1.00 Azerbaijani manat random", |
| 4522 "1.00 Azerbaijani manats (1993-2006) random", |
| 4523 "1.00 Azerbaijani manats random", |
| 4524 "1.00 Bahamian Dollar random", |
| 4525 "1.00 Bahamian dollar random", |
| 4526 "1.00 Bahamian dollars random", |
| 4527 "1.00 Bahraini Dinar random", |
| 4528 "1.00 Bahraini dinar random", |
| 4529 "1.00 Bahraini dinars random", |
| 4530 "1.00 Bangladeshi Taka random", |
| 4531 "1.00 Bangladeshi taka random", |
| 4532 "1.00 Bangladeshi takas random", |
| 4533 "1.00 Barbadian Dollar random", |
| 4534 "1.00 Barbadian dollar random", |
| 4535 "1.00 Barbadian dollars random", |
| 4536 "1.00 Belarusian New Ruble (1994-1999) random", |
| 4537 "1.00 Belarusian Ruble random", |
| 4538 "1.00 Belarusian new ruble (1994-1999) random", |
| 4539 "1.00 Belarusian new rubles (1994-1999) random", |
| 4540 "1.00 Belarusian ruble random", |
| 4541 "1.00 Belarusian rubles random", |
| 4542 "1.00 Belgian Franc (convertible) random", |
| 4543 "1.00 Belgian Franc (financial) random", |
| 4544 "1.00 Belgian Franc random", |
| 4545 "1.00 Belgian franc (convertible) random", |
| 4546 "1.00 Belgian franc (financial) random", |
| 4547 "1.00 Belgian franc random", |
| 4548 "1.00 Belgian francs (convertible) random", |
| 4549 "1.00 Belgian francs (financial) random", |
| 4550 "1.00 Belgian francs random", |
| 4551 "1.00 Belize Dollar random", |
| 4552 "1.00 Belize dollar random", |
| 4553 "1.00 Belize dollars random", |
| 4554 "1.00 Bermudan Dollar random", |
| 4555 "1.00 Bermudan dollar random", |
| 4556 "1.00 Bermudan dollars random", |
| 4557 "1.00 Bhutanese Ngultrum random", |
| 4558 "1.00 Bhutanese ngultrum random", |
| 4559 "1.00 Bhutanese ngultrums random", |
| 4560 "1.00 Bolivian Mvdol random", |
| 4561 "1.00 Bolivian Peso random", |
| 4562 "1.00 Bolivian mvdol random", |
| 4563 "1.00 Bolivian mvdols random", |
| 4564 "1.00 Bolivian peso random", |
| 4565 "1.00 Bolivian pesos random", |
| 4566 "1.00 Bolivian Boliviano random", |
| 4567 "1.00 Bolivian Boliviano random", |
| 4568 "1.00 Bolivian Bolivianos random", |
| 4569 "1.00 Bosnia-Herzegovina Convertible Mark random", |
| 4570 "1.00 Bosnia-Herzegovina Dinar (1992-1994) random", |
| 4571 "1.00 Bosnia-Herzegovina convertible mark random", |
| 4572 "1.00 Bosnia-Herzegovina convertible marks random", |
| 4573 "1.00 Bosnia-Herzegovina dinar (1992-1994) random", |
| 4574 "1.00 Bosnia-Herzegovina dinars (1992-1994) random", |
| 4575 "1.00 Botswanan Pula random", |
| 4576 "1.00 Botswanan pula random", |
| 4577 "1.00 Botswanan pulas random", |
| 4578 "1.00 Brazilian New Cruzado (1989-1990) random", |
| 4579 "1.00 Brazilian Cruzado (1986-1989) random", |
| 4580 "1.00 Brazilian Cruzeiro (1990-1993) random", |
| 4581 "1.00 Brazilian New Cruzeiro (1967-1986) random", |
| 4582 "1.00 Brazilian Cruzeiro (1993-1994) random", |
| 4583 "1.00 Brazilian Real random", |
| 4584 "1.00 Brazilian new cruzado (1989-1990) random", |
| 4585 "1.00 Brazilian new cruzados (1989-1990) random", |
| 4586 "1.00 Brazilian cruzado (1986-1989) random", |
| 4587 "1.00 Brazilian cruzados (1986-1989) random", |
| 4588 "1.00 Brazilian cruzeiro (1990-1993) random", |
| 4589 "1.00 Brazilian new cruzeiro (1967-1986) random", |
| 4590 "1.00 Brazilian cruzeiro (1993-1994) random", |
| 4591 "1.00 Brazilian cruzeiros (1990-1993) random", |
| 4592 "1.00 Brazilian new cruzeiros (1967-1986) random", |
| 4593 "1.00 Brazilian cruzeiros (1993-1994) random", |
| 4594 "1.00 Brazilian real random", |
| 4595 "1.00 Brazilian reals random", |
| 4596 "1.00 British Pound Sterling random", |
| 4597 "1.00 British pound sterling random", |
| 4598 "1.00 British pounds sterling random", |
| 4599 "1.00 Brunei Dollar random", |
| 4600 "1.00 Brunei dollar random", |
| 4601 "1.00 Brunei dollars random", |
| 4602 "1.00 Bulgarian Hard Lev random", |
| 4603 "1.00 Bulgarian Lev random", |
| 4604 "1.00 Bulgarian Leva random", |
| 4605 "1.00 Bulgarian hard lev random", |
| 4606 "1.00 Bulgarian hard leva random", |
| 4607 "1.00 Bulgarian lev random", |
| 4608 "1.00 Burmese Kyat random", |
| 4609 "1.00 Burmese kyat random", |
| 4610 "1.00 Burmese kyats random", |
| 4611 "1.00 Burundian Franc random", |
| 4612 "1.00 Burundian franc random", |
| 4613 "1.00 Burundian francs random", |
| 4614 "1.00 Cambodian Riel random", |
| 4615 "1.00 Cambodian riel random", |
| 4616 "1.00 Cambodian riels random", |
| 4617 "1.00 Canadian Dollar random", |
| 4618 "1.00 Canadian dollar random", |
| 4619 "1.00 Canadian dollars random", |
| 4620 "1.00 Cape Verdean Escudo random", |
| 4621 "1.00 Cape Verdean escudo random", |
| 4622 "1.00 Cape Verdean escudos random", |
| 4623 "1.00 Cayman Islands Dollar random", |
| 4624 "1.00 Cayman Islands dollar random", |
| 4625 "1.00 Cayman Islands dollars random", |
| 4626 "1.00 Chilean Peso random", |
| 4627 "1.00 Chilean Unit of Account (UF) random", |
| 4628 "1.00 Chilean peso random", |
| 4629 "1.00 Chilean pesos random", |
| 4630 "1.00 Chilean unit of account (UF) random", |
| 4631 "1.00 Chilean units of account (UF) random", |
| 4632 "1.00 Chinese Yuan random", |
| 4633 "1.00 Chinese yuan random", |
| 4634 "1.00 Colombian Peso random", |
| 4635 "1.00 Colombian peso random", |
| 4636 "1.00 Colombian pesos random", |
| 4637 "1.00 Comorian Franc random", |
| 4638 "1.00 Comorian franc random", |
| 4639 "1.00 Comorian francs random", |
| 4640 "1.00 Congolese Franc Congolais random", |
| 4641 "1.00 Congolese franc Congolais random", |
| 4642 "1.00 Congolese francs Congolais random", |
| 4643 "1.00 Costa Rican Col\\u00f3n random", |
| 4644 "1.00 Costa Rican col\\u00f3n random", |
| 4645 "1.00 Costa Rican col\\u00f3ns random", |
| 4646 "1.00 Croatian Dinar random", |
| 4647 "1.00 Croatian Kuna random", |
| 4648 "1.00 Croatian dinar random", |
| 4649 "1.00 Croatian dinars random", |
| 4650 "1.00 Croatian kuna random", |
| 4651 "1.00 Croatian kunas random", |
| 4652 "1.00 Cuban Peso random", |
| 4653 "1.00 Cuban peso random", |
| 4654 "1.00 Cuban pesos random", |
| 4655 "1.00 Cypriot Pound random", |
| 4656 "1.00 Cypriot pound random", |
| 4657 "1.00 Cypriot pounds random", |
| 4658 "1.00 Czech Republic Koruna random", |
| 4659 "1.00 Czech Republic koruna random", |
| 4660 "1.00 Czech Republic korunas random", |
| 4661 "1.00 Czechoslovak Hard Koruna random", |
| 4662 "1.00 Czechoslovak hard koruna random", |
| 4663 "1.00 Czechoslovak hard korunas random", |
| 4664 "1.00 Danish Krone random", |
| 4665 "1.00 Danish krone random", |
| 4666 "1.00 Danish kroner random", |
| 4667 "1.00 German Mark random", |
| 4668 "1.00 German mark random", |
| 4669 "1.00 German marks random", |
| 4670 "1.00 Djiboutian Franc random", |
| 4671 "1.00 Djiboutian franc random", |
| 4672 "1.00 Djiboutian francs random", |
| 4673 "1.00 Dominican Peso random", |
| 4674 "1.00 Dominican peso random", |
| 4675 "1.00 Dominican pesos random", |
| 4676 "1.00 East Caribbean Dollar random", |
| 4677 "1.00 East Caribbean dollar random", |
| 4678 "1.00 East Caribbean dollars random", |
| 4679 "1.00 East German Mark random", |
| 4680 "1.00 East German mark random", |
| 4681 "1.00 East German marks random", |
| 4682 "1.00 Ecuadorian Sucre random", |
| 4683 "1.00 Ecuadorian Unit of Constant Value random", |
| 4684 "1.00 Ecuadorian sucre random", |
| 4685 "1.00 Ecuadorian sucres random", |
| 4686 "1.00 Ecuadorian unit of constant value random", |
| 4687 "1.00 Ecuadorian units of constant value random", |
| 4688 "1.00 Egyptian Pound random", |
| 4689 "1.00 Egyptian pound random", |
| 4690 "1.00 Egyptian pounds random", |
| 4691 "1.00 Salvadoran Col\\u00f3n random", |
| 4692 "1.00 Salvadoran col\\u00f3n random", |
| 4693 "1.00 Salvadoran colones random", |
| 4694 "1.00 Equatorial Guinean Ekwele random", |
| 4695 "1.00 Equatorial Guinean ekwele random", |
| 4696 "1.00 Eritrean Nakfa random", |
| 4697 "1.00 Eritrean nakfa random", |
| 4698 "1.00 Eritrean nakfas random", |
| 4699 "1.00 Estonian Kroon random", |
| 4700 "1.00 Estonian kroon random", |
| 4701 "1.00 Estonian kroons random", |
| 4702 "1.00 Ethiopian Birr random", |
| 4703 "1.00 Ethiopian birr random", |
| 4704 "1.00 Ethiopian birrs random", |
| 4705 "1.00 European Composite Unit random", |
| 4706 "1.00 European Currency Unit random", |
| 4707 "1.00 European Monetary Unit random", |
| 4708 "1.00 European Unit of Account (XBC) random", |
| 4709 "1.00 European Unit of Account (XBD) random", |
| 4710 "1.00 European composite unit random", |
| 4711 "1.00 European composite units random", |
| 4712 "1.00 European currency unit random", |
| 4713 "1.00 European currency units random", |
| 4714 "1.00 European monetary unit random", |
| 4715 "1.00 European monetary units random", |
| 4716 "1.00 European unit of account (XBC) random", |
| 4717 "1.00 European unit of account (XBD) random", |
| 4718 "1.00 European units of account (XBC) random", |
| 4719 "1.00 European units of account (XBD) random", |
| 4720 "1.00 Falkland Islands Pound random", |
| 4721 "1.00 Falkland Islands pound random", |
| 4722 "1.00 Falkland Islands pounds random", |
| 4723 "1.00 Fijian Dollar random", |
| 4724 "1.00 Fijian dollar random", |
| 4725 "1.00 Fijian dollars random", |
| 4726 "1.00 Finnish Markka random", |
| 4727 "1.00 Finnish markka random", |
| 4728 "1.00 Finnish markkas random", |
| 4729 "1.00 French Franc random", |
| 4730 "1.00 French Gold Franc random", |
| 4731 "1.00 French UIC-Franc random", |
| 4732 "1.00 French UIC-franc random", |
| 4733 "1.00 French UIC-francs random", |
| 4734 "1.00 French franc random", |
| 4735 "1.00 French francs random", |
| 4736 "1.00 French gold franc random", |
| 4737 "1.00 French gold francs random", |
| 4738 "1.00 Gambian Dalasi random", |
| 4739 "1.00 Gambian dalasi random", |
| 4740 "1.00 Gambian dalasis random", |
| 4741 "1.00 Georgian Kupon Larit random", |
| 4742 "1.00 Georgian Lari random", |
| 4743 "1.00 Georgian kupon larit random", |
| 4744 "1.00 Georgian kupon larits random", |
| 4745 "1.00 Georgian lari random", |
| 4746 "1.00 Georgian laris random", |
| 4747 "1.00 Ghanaian Cedi (1979-2007) random", |
| 4748 "1.00 Ghanaian Cedi random", |
| 4749 "1.00 Ghanaian cedi (1979-2007) random", |
| 4750 "1.00 Ghanaian cedi random", |
| 4751 "1.00 Ghanaian cedis (1979-2007) random", |
| 4752 "1.00 Ghanaian cedis random", |
| 4753 "1.00 Gibraltar Pound random", |
| 4754 "1.00 Gibraltar pound random", |
| 4755 "1.00 Gibraltar pounds random", |
| 4756 "1.00 Gold random", |
| 4757 "1.00 Gold random", |
| 4758 "1.00 Greek Drachma random", |
| 4759 "1.00 Greek drachma random", |
| 4760 "1.00 Greek drachmas random", |
| 4761 "1.00 Guatemalan Quetzal random", |
| 4762 "1.00 Guatemalan quetzal random", |
| 4763 "1.00 Guatemalan quetzals random", |
| 4764 "1.00 Guinean Franc random", |
| 4765 "1.00 Guinean Syli random", |
| 4766 "1.00 Guinean franc random", |
| 4767 "1.00 Guinean francs random", |
| 4768 "1.00 Guinean syli random", |
| 4769 "1.00 Guinean sylis random", |
| 4770 "1.00 Guinea-Bissau Peso random", |
| 4771 "1.00 Guinea-Bissau peso random", |
| 4772 "1.00 Guinea-Bissau pesos random", |
| 4773 "1.00 Guyanaese Dollar random", |
| 4774 "1.00 Guyanaese dollar random", |
| 4775 "1.00 Guyanaese dollars random", |
| 4776 "1.00 Haitian Gourde random", |
| 4777 "1.00 Haitian gourde random", |
| 4778 "1.00 Haitian gourdes random", |
| 4779 "1.00 Honduran Lempira random", |
| 4780 "1.00 Honduran lempira random", |
| 4781 "1.00 Honduran lempiras random", |
| 4782 "1.00 Hong Kong Dollar random", |
| 4783 "1.00 Hong Kong dollar random", |
| 4784 "1.00 Hong Kong dollars random", |
| 4785 "1.00 Hungarian Forint random", |
| 4786 "1.00 Hungarian forint random", |
| 4787 "1.00 Hungarian forints random", |
| 4788 "1.00 Icelandic Kr\\u00f3na random", |
| 4789 "1.00 Icelandic kr\\u00f3na random", |
| 4790 "1.00 Icelandic kr\\u00f3nur random", |
| 4791 "1.00 Indian Rupee random", |
| 4792 "1.00 Indian rupee random", |
| 4793 "1.00 Indian rupees random", |
| 4794 "1.00 Indonesian Rupiah random", |
| 4795 "1.00 Indonesian rupiah random", |
| 4796 "1.00 Indonesian rupiahs random", |
| 4797 "1.00 Iranian Rial random", |
| 4798 "1.00 Iranian rial random", |
| 4799 "1.00 Iranian rials random", |
| 4800 "1.00 Iraqi Dinar random", |
| 4801 "1.00 Iraqi dinar random", |
| 4802 "1.00 Iraqi dinars random", |
| 4803 "1.00 Irish Pound random", |
| 4804 "1.00 Irish pound random", |
| 4805 "1.00 Irish pounds random", |
| 4806 "1.00 Israeli Pound random", |
| 4807 "1.00 Israeli new sheqel random", |
| 4808 "1.00 Israeli pound random", |
| 4809 "1.00 Israeli pounds random", |
| 4810 "1.00 Italian Lira random", |
| 4811 "1.00 Italian lira random", |
| 4812 "1.00 Italian liras random", |
| 4813 "1.00 Jamaican Dollar random", |
| 4814 "1.00 Jamaican dollar random", |
| 4815 "1.00 Jamaican dollars random", |
| 4816 "1.00 Japanese Yen random", |
| 4817 "1.00 Japanese yen random", |
| 4818 "1.00 Jordanian Dinar random", |
| 4819 "1.00 Jordanian dinar random", |
| 4820 "1.00 Jordanian dinars random", |
| 4821 "1.00 Kazakhstani Tenge random", |
| 4822 "1.00 Kazakhstani tenge random", |
| 4823 "1.00 Kazakhstani tenges random", |
| 4824 "1.00 Kenyan Shilling random", |
| 4825 "1.00 Kenyan shilling random", |
| 4826 "1.00 Kenyan shillings random", |
| 4827 "1.00 Kuwaiti Dinar random", |
| 4828 "1.00 Kuwaiti dinar random", |
| 4829 "1.00 Kuwaiti dinars random", |
| 4830 "1.00 Kyrgystani Som random", |
| 4831 "1.00 Kyrgystani som random", |
| 4832 "1.00 Kyrgystani soms random", |
| 4833 "1.00 Laotian Kip random", |
| 4834 "1.00 Laotian kip random", |
| 4835 "1.00 Laotian kips random", |
| 4836 "1.00 Latvian Lats random", |
| 4837 "1.00 Latvian Ruble random", |
| 4838 "1.00 Latvian lats random", |
| 4839 "1.00 Latvian lati random", |
| 4840 "1.00 Latvian ruble random", |
| 4841 "1.00 Latvian rubles random", |
| 4842 "1.00 Lebanese Pound random", |
| 4843 "1.00 Lebanese pound random", |
| 4844 "1.00 Lebanese pounds random", |
| 4845 "1.00 Lesotho Loti random", |
| 4846 "1.00 Lesotho loti random", |
| 4847 "1.00 Lesotho lotis random", |
| 4848 "1.00 Liberian Dollar random", |
| 4849 "1.00 Liberian dollar random", |
| 4850 "1.00 Liberian dollars random", |
| 4851 "1.00 Libyan Dinar random", |
| 4852 "1.00 Libyan dinar random", |
| 4853 "1.00 Libyan dinars random", |
| 4854 "1.00 Lithuanian Litas random", |
| 4855 "1.00 Lithuanian Talonas random", |
| 4856 "1.00 Lithuanian litas random", |
| 4857 "1.00 Lithuanian litai random", |
| 4858 "1.00 Lithuanian talonas random", |
| 4859 "1.00 Lithuanian talonases random", |
| 4860 "1.00 Luxembourgian Convertible Franc random", |
| 4861 "1.00 Luxembourg Financial Franc random", |
| 4862 "1.00 Luxembourgian Franc random", |
| 4863 "1.00 Luxembourgian convertible franc random", |
| 4864 "1.00 Luxembourgian convertible francs random", |
| 4865 "1.00 Luxembourg financial franc random", |
| 4866 "1.00 Luxembourg financial francs random", |
| 4867 "1.00 Luxembourgian franc random", |
| 4868 "1.00 Luxembourgian francs random", |
| 4869 "1.00 Macanese Pataca random", |
| 4870 "1.00 Macanese pataca random", |
| 4871 "1.00 Macanese patacas random", |
| 4872 "1.00 Macedonian Denar random", |
| 4873 "1.00 Macedonian denar random", |
| 4874 "1.00 Macedonian denari random", |
| 4875 "1.00 Malagasy Ariaries random", |
| 4876 "1.00 Malagasy Ariary random", |
| 4877 "1.00 Malagasy Ariary random", |
| 4878 "1.00 Malagasy Franc random", |
| 4879 "1.00 Malagasy franc random", |
| 4880 "1.00 Malagasy francs random", |
| 4881 "1.00 Malawian Kwacha random", |
| 4882 "1.00 Malawian Kwacha random", |
| 4883 "1.00 Malawian Kwachas random", |
| 4884 "1.00 Malaysian Ringgit random", |
| 4885 "1.00 Malaysian ringgit random", |
| 4886 "1.00 Malaysian ringgits random", |
| 4887 "1.00 Maldivian Rufiyaa random", |
| 4888 "1.00 Maldivian rufiyaa random", |
| 4889 "1.00 Maldivian rufiyaas random", |
| 4890 "1.00 Malian Franc random", |
| 4891 "1.00 Malian franc random", |
| 4892 "1.00 Malian francs random", |
| 4893 "1.00 Maltese Lira random", |
| 4894 "1.00 Maltese Pound random", |
| 4895 "1.00 Maltese lira random", |
| 4896 "1.00 Maltese liras random", |
| 4897 "1.00 Maltese pound random", |
| 4898 "1.00 Maltese pounds random", |
| 4899 "1.00 Mauritanian Ouguiya random", |
| 4900 "1.00 Mauritanian ouguiya random", |
| 4901 "1.00 Mauritanian ouguiyas random", |
| 4902 "1.00 Mauritian Rupee random", |
| 4903 "1.00 Mauritian rupee random", |
| 4904 "1.00 Mauritian rupees random", |
| 4905 "1.00 Mexican Peso random", |
| 4906 "1.00 Mexican Silver Peso (1861-1992) random", |
| 4907 "1.00 Mexican Investment Unit random", |
| 4908 "1.00 Mexican peso random", |
| 4909 "1.00 Mexican pesos random", |
| 4910 "1.00 Mexican silver peso (1861-1992) random", |
| 4911 "1.00 Mexican silver pesos (1861-1992) random", |
| 4912 "1.00 Mexican investment unit random", |
| 4913 "1.00 Mexican investment units random", |
| 4914 "1.00 Moldovan Leu random", |
| 4915 "1.00 Moldovan leu random", |
| 4916 "1.00 Moldovan lei random", |
| 4917 "1.00 Mongolian Tugrik random", |
| 4918 "1.00 Mongolian tugrik random", |
| 4919 "1.00 Mongolian tugriks random", |
| 4920 "1.00 Moroccan Dirham random", |
| 4921 "1.00 Moroccan Franc random", |
| 4922 "1.00 Moroccan dirham random", |
| 4923 "1.00 Moroccan dirhams random", |
| 4924 "1.00 Moroccan franc random", |
| 4925 "1.00 Moroccan francs random", |
| 4926 "1.00 Mozambican Escudo random", |
| 4927 "1.00 Mozambican Metical random", |
| 4928 "1.00 Mozambican escudo random", |
| 4929 "1.00 Mozambican escudos random", |
| 4930 "1.00 Mozambican metical random", |
| 4931 "1.00 Mozambican meticals random", |
| 4932 "1.00 Myanma Kyat random", |
| 4933 "1.00 Myanma kyat random", |
| 4934 "1.00 Myanma kyats random", |
| 4935 "1.00 Namibian Dollar random", |
| 4936 "1.00 Namibian dollar random", |
| 4937 "1.00 Namibian dollars random", |
| 4938 "1.00 Nepalese Rupee random", |
| 4939 "1.00 Nepalese rupee random", |
| 4940 "1.00 Nepalese rupees random", |
| 4941 "1.00 Netherlands Antillean Guilder random", |
| 4942 "1.00 Netherlands Antillean guilder random", |
| 4943 "1.00 Netherlands Antillean guilders random", |
| 4944 "1.00 Dutch Guilder random", |
| 4945 "1.00 Dutch guilder random", |
| 4946 "1.00 Dutch guilders random", |
| 4947 "1.00 Israeli New Sheqel random", |
| 4948 "1.00 Israeli new sheqels random", |
| 4949 "1.00 New Zealand Dollar random", |
| 4950 "1.00 New Zealand dollar random", |
| 4951 "1.00 New Zealand dollars random", |
| 4952 "1.00 Nicaraguan C\\u00f3rdoba random", |
| 4953 "1.00 Nicaraguan C\\u00f3rdoba (1988-1991) random", |
| 4954 "1.00 Nicaraguan c\\u00f3rdoba random", |
| 4955 "1.00 Nicaraguan c\\u00f3rdoba random", |
| 4956 "1.00 Nicaraguan c\\u00f3rdoba (1988-1991) random", |
| 4957 "1.00 Nicaraguan c\\u00f3rdobas (1988-1991) random", |
| 4958 "1.00 Nigerian Naira random", |
| 4959 "1.00 Nigerian naira random", |
| 4960 "1.00 Nigerian nairas random", |
| 4961 "1.00 North Korean Won random", |
| 4962 "1.00 North Korean won random", |
| 4963 "1.00 North Korean won random", |
| 4964 "1.00 Norwegian Krone random", |
| 4965 "1.00 Norwegian krone random", |
| 4966 "1.00 Norwegian kroner random", |
| 4967 "1.00 Mozambican Metical (1980-2006) random", |
| 4968 "1.00 Mozambican metical (1980-2006) random", |
| 4969 "1.00 Mozambican meticals (1980-2006) random", |
| 4970 "1.00 Romanian Lei (1952-2006) random", |
| 4971 "1.00 Romanian Leu (1952-2006) random", |
| 4972 "1.00 Romanian leu (1952-2006) random", |
| 4973 "1.00 Serbian Dinar (2002-2006) random", |
| 4974 "1.00 Serbian dinar (2002-2006) random", |
| 4975 "1.00 Serbian dinars (2002-2006) random", |
| 4976 "1.00 Sudanese Dinar (1992-2007) random", |
| 4977 "1.00 Sudanese Pound (1957-1998) random", |
| 4978 "1.00 Sudanese dinar (1992-2007) random", |
| 4979 "1.00 Sudanese dinars (1992-2007) random", |
| 4980 "1.00 Sudanese pound (1957-1998) random", |
| 4981 "1.00 Sudanese pounds (1957-1998) random", |
| 4982 "1.00 Turkish Lira (1922-2005) random", |
| 4983 "1.00 Turkish Lira (1922-2005) random", |
| 4984 "1.00 Omani Rial random", |
| 4985 "1.00 Omani rial random", |
| 4986 "1.00 Omani rials random", |
| 4987 "1.00 Pakistani Rupee random", |
| 4988 "1.00 Pakistani rupee random", |
| 4989 "1.00 Pakistani rupees random", |
| 4990 "1.00 Palladium random", |
| 4991 "1.00 Palladium random", |
| 4992 "1.00 Panamanian Balboa random", |
| 4993 "1.00 Panamanian balboa random", |
| 4994 "1.00 Panamanian balboas random", |
| 4995 "1.00 Papua New Guinean Kina random", |
| 4996 "1.00 Papua New Guinean kina random", |
| 4997 "1.00 Papua New Guinean kina random", |
| 4998 "1.00 Paraguayan Guarani random", |
| 4999 "1.00 Paraguayan guarani random", |
| 5000 "1.00 Paraguayan guaranis random", |
| 5001 "1.00 Peruvian Inti random", |
| 5002 "1.00 Peruvian Nuevo Sol random", |
| 5003 "1.00 Peruvian Sol (1863-1965) random", |
| 5004 "1.00 Peruvian inti random", |
| 5005 "1.00 Peruvian intis random", |
| 5006 "1.00 Peruvian nuevo sol random", |
| 5007 "1.00 Peruvian nuevos soles random", |
| 5008 "1.00 Peruvian sol (1863-1965) random", |
| 5009 "1.00 Peruvian soles (1863-1965) random", |
| 5010 "1.00 Philippine Peso random", |
| 5011 "1.00 Philippine peso random", |
| 5012 "1.00 Philippine pesos random", |
| 5013 "1.00 Platinum random", |
| 5014 "1.00 Platinum random", |
| 5015 "1.00 Polish Zloty (1950-1995) random", |
| 5016 "1.00 Polish Zloty random", |
| 5017 "1.00 Polish zlotys random", |
| 5018 "1.00 Polish zloty (PLZ) random", |
| 5019 "1.00 Polish zloty random", |
| 5020 "1.00 Polish zlotys (PLZ) random", |
| 5021 "1.00 Portuguese Escudo random", |
| 5022 "1.00 Portuguese Guinea Escudo random", |
| 5023 "1.00 Portuguese Guinea escudo random", |
| 5024 "1.00 Portuguese Guinea escudos random", |
| 5025 "1.00 Portuguese escudo random", |
| 5026 "1.00 Portuguese escudos random", |
| 5027 "1.00 Qatari Rial random", |
| 5028 "1.00 Qatari rial random", |
| 5029 "1.00 Qatari rials random", |
| 5030 "1.00 RINET Funds random", |
| 5031 "1.00 RINET Funds random", |
| 5032 "1.00 Rhodesian Dollar random", |
| 5033 "1.00 Rhodesian dollar random", |
| 5034 "1.00 Rhodesian dollars random", |
| 5035 "1.00 Romanian Leu random", |
| 5036 "1.00 Romanian lei random", |
| 5037 "1.00 Romanian leu random", |
| 5038 "1.00 Russian Ruble (1991-1998) random", |
| 5039 "1.00 Russian Ruble random", |
| 5040 "1.00 Russian ruble (1991-1998) random", |
| 5041 "1.00 Russian ruble random", |
| 5042 "1.00 Russian rubles (1991-1998) random", |
| 5043 "1.00 Russian rubles random", |
| 5044 "1.00 Rwandan Franc random", |
| 5045 "1.00 Rwandan franc random", |
| 5046 "1.00 Rwandan francs random", |
| 5047 "1.00 Saint Helena Pound random", |
| 5048 "1.00 Saint Helena pound random", |
| 5049 "1.00 Saint Helena pounds random", |
| 5050 "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobra random", |
| 5051 "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobra random", |
| 5052 "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobras random", |
| 5053 "1.00 Saudi Riyal random", |
| 5054 "1.00 Saudi riyal random", |
| 5055 "1.00 Saudi riyals random", |
| 5056 "1.00 Serbian Dinar random", |
| 5057 "1.00 Serbian dinar random", |
| 5058 "1.00 Serbian dinars random", |
| 5059 "1.00 Seychellois Rupee random", |
| 5060 "1.00 Seychellois rupee random", |
| 5061 "1.00 Seychellois rupees random", |
| 5062 "1.00 Sierra Leonean Leone random", |
| 5063 "1.00 Sierra Leonean leone random", |
| 5064 "1.00 Sierra Leonean leones random", |
| 5065 "1.00 Singapore Dollar random", |
| 5066 "1.00 Singapore dollar random", |
| 5067 "1.00 Singapore dollars random", |
| 5068 "1.00 Slovak Koruna random", |
| 5069 "1.00 Slovak koruna random", |
| 5070 "1.00 Slovak korunas random", |
| 5071 "1.00 Slovenian Tolar random", |
| 5072 "1.00 Slovenian tolar random", |
| 5073 "1.00 Slovenian tolars random", |
| 5074 "1.00 Solomon Islands Dollar random", |
| 5075 "1.00 Solomon Islands dollar random", |
| 5076 "1.00 Solomon Islands dollars random", |
| 5077 "1.00 Somali Shilling random", |
| 5078 "1.00 Somali shilling random", |
| 5079 "1.00 Somali shillings random", |
| 5080 "1.00 South African Rand (financial) random", |
| 5081 "1.00 South African Rand random", |
| 5082 "1.00 South African rand (financial) random", |
| 5083 "1.00 South African rand random", |
| 5084 "1.00 South African rands (financial) random", |
| 5085 "1.00 South African rand random", |
| 5086 "1.00 South Korean Won random", |
| 5087 "1.00 South Korean won random", |
| 5088 "1.00 South Korean won random", |
| 5089 "1.00 Soviet Rouble random", |
| 5090 "1.00 Soviet rouble random", |
| 5091 "1.00 Soviet roubles random", |
| 5092 "1.00 Spanish Peseta (A account) random", |
| 5093 "1.00 Spanish Peseta (convertible account) random", |
| 5094 "1.00 Spanish Peseta random", |
| 5095 "1.00 Spanish peseta (A account) random", |
| 5096 "1.00 Spanish peseta (convertible account) random", |
| 5097 "1.00 Spanish peseta random", |
| 5098 "1.00 Spanish pesetas (A account) random", |
| 5099 "1.00 Spanish pesetas (convertible account) random", |
| 5100 "1.00 Spanish pesetas random", |
| 5101 "1.00 Special Drawing Rights random", |
| 5102 "1.00 Sri Lankan Rupee random", |
| 5103 "1.00 Sri Lankan rupee random", |
| 5104 "1.00 Sri Lankan rupees random", |
| 5105 "1.00 Sudanese Pound random", |
| 5106 "1.00 Sudanese pound random", |
| 5107 "1.00 Sudanese pounds random", |
| 5108 "1.00 Surinamese Dollar random", |
| 5109 "1.00 Surinamese dollar random", |
| 5110 "1.00 Surinamese dollars random", |
| 5111 "1.00 Surinamese Guilder random", |
| 5112 "1.00 Surinamese guilder random", |
| 5113 "1.00 Surinamese guilders random", |
| 5114 "1.00 Swazi Lilangeni random", |
| 5115 "1.00 Swazi lilangeni random", |
| 5116 "1.00 Swazi emalangeni random", |
| 5117 "1.00 Swedish Krona random", |
| 5118 "1.00 Swedish krona random", |
| 5119 "1.00 Swedish kronor random", |
| 5120 "1.00 Swiss Franc random", |
| 5121 "1.00 Swiss franc random", |
| 5122 "1.00 Swiss francs random", |
| 5123 "1.00 Syrian Pound random", |
| 5124 "1.00 Syrian pound random", |
| 5125 "1.00 Syrian pounds random", |
| 5126 "1.00 New Taiwan Dollar random", |
| 5127 "1.00 New Taiwan dollar random", |
| 5128 "1.00 New Taiwan dollars random", |
| 5129 "1.00 Tajikistani Ruble random", |
| 5130 "1.00 Tajikistani Somoni random", |
| 5131 "1.00 Tajikistani ruble random", |
| 5132 "1.00 Tajikistani rubles random", |
| 5133 "1.00 Tajikistani somoni random", |
| 5134 "1.00 Tajikistani somonis random", |
| 5135 "1.00 Tanzanian Shilling random", |
| 5136 "1.00 Tanzanian shilling random", |
| 5137 "1.00 Tanzanian shillings random", |
| 5138 "1.00 Testing Currency Code random", |
| 5139 "1.00 Testing Currency Code random", |
| 5140 "1.00 Thai Baht random", |
| 5141 "1.00 Thai baht random", |
| 5142 "1.00 Thai baht random", |
| 5143 "1.00 Timorese Escudo random", |
| 5144 "1.00 Timorese escudo random", |
| 5145 "1.00 Timorese escudos random", |
| 5146 "1.00 Trinidad and Tobago Dollar random", |
| 5147 "1.00 Trinidad and Tobago dollar random", |
| 5148 "1.00 Trinidad and Tobago dollars random", |
| 5149 "1.00 Tunisian Dinar random", |
| 5150 "1.00 Tunisian dinar random", |
| 5151 "1.00 Tunisian dinars random", |
| 5152 "1.00 Turkish Lira random", |
| 5153 "1.00 Turkish Lira random", |
| 5154 "1.00 Turkish lira random", |
| 5155 "1.00 Turkmenistani Manat random", |
| 5156 "1.00 Turkmenistani manat random", |
| 5157 "1.00 Turkmenistani manat random", |
| 5158 "1.00 US Dollar (Next day) random", |
| 5159 "1.00 US Dollar (Same day) random", |
| 5160 "1.00 US Dollar random", |
| 5161 "1.00 US dollar (next day) random", |
| 5162 "1.00 US dollar (same day) random", |
| 5163 "1.00 US dollar random", |
| 5164 "1.00 US dollars (next day) random", |
| 5165 "1.00 US dollars (same day) random", |
| 5166 "1.00 US dollars random", |
| 5167 "1.00 Ugandan Shilling (1966-1987) random", |
| 5168 "1.00 Ugandan Shilling random", |
| 5169 "1.00 Ugandan shilling (1966-1987) random", |
| 5170 "1.00 Ugandan shilling random", |
| 5171 "1.00 Ugandan shillings (1966-1987) random", |
| 5172 "1.00 Ugandan shillings random", |
| 5173 "1.00 Ukrainian Hryvnia random", |
| 5174 "1.00 Ukrainian Karbovanets random", |
| 5175 "1.00 Ukrainian hryvnia random", |
| 5176 "1.00 Ukrainian hryvnias random", |
| 5177 "1.00 Ukrainian karbovanets random", |
| 5178 "1.00 Ukrainian karbovantsiv random", |
| 5179 "1.00 Colombian Real Value Unit random", |
| 5180 "1.00 United Arab Emirates Dirham random", |
| 5181 "1.00 Unknown Currency random", |
| 5182 "1.00 Uruguayan Peso (1975-1993) random", |
| 5183 "1.00 Uruguayan Peso random", |
| 5184 "1.00 Uruguayan Peso (Indexed Units) random", |
| 5185 "1.00 Uruguayan peso (1975-1993) random", |
| 5186 "1.00 Uruguayan peso (indexed units) random", |
| 5187 "1.00 Uruguayan peso random", |
| 5188 "1.00 Uruguayan pesos (1975-1993) random", |
| 5189 "1.00 Uruguayan pesos (indexed units) random", |
| 5190 "1.00 Uzbekistan Som random", |
| 5191 "1.00 Uzbekistan som random", |
| 5192 "1.00 Uzbekistan som random", |
| 5193 "1.00 Vanuatu Vatu random", |
| 5194 "1.00 Vanuatu vatu random", |
| 5195 "1.00 Vanuatu vatus random", |
| 5196 "1.00 Venezuelan Bol\\u00edvar random", |
| 5197 "1.00 Venezuelan Bol\\u00edvar (1871-2008) random", |
| 5198 "1.00 Venezuelan bol\\u00edvar random", |
| 5199 "1.00 Venezuelan bol\\u00edvars random", |
| 5200 "1.00 Venezuelan bol\\u00edvar (1871-2008) random", |
| 5201 "1.00 Venezuelan bol\\u00edvars (1871-2008) random", |
| 5202 "1.00 Vietnamese Dong random", |
| 5203 "1.00 Vietnamese dong random", |
| 5204 "1.00 Vietnamese dong random", |
| 5205 "1.00 WIR Euro random", |
| 5206 "1.00 WIR Franc random", |
| 5207 "1.00 WIR euro random", |
| 5208 "1.00 WIR euros random", |
| 5209 "1.00 WIR franc random", |
| 5210 "1.00 WIR francs random", |
| 5211 "1.00 Samoan Tala random", |
| 5212 "1.00 Samoan tala random", |
| 5213 "1.00 Samoan tala random", |
| 5214 "1.00 Yemeni Dinar random", |
| 5215 "1.00 Yemeni Rial random", |
| 5216 "1.00 Yemeni dinar random", |
| 5217 "1.00 Yemeni dinars random", |
| 5218 "1.00 Yemeni rial random", |
| 5219 "1.00 Yemeni rials random", |
| 5220 "1.00 Yugoslavian Convertible Dinar (1990-1992) random", |
| 5221 "1.00 Yugoslavian Hard Dinar (1966-1990) random", |
| 5222 "1.00 Yugoslavian New Dinar (1994-2002) random", |
| 5223 "1.00 Yugoslavian convertible dinar (1990-1992) random", |
| 5224 "1.00 Yugoslavian convertible dinars (1990-1992) random", |
| 5225 "1.00 Yugoslavian hard dinar (1966-1990) random", |
| 5226 "1.00 Yugoslavian hard dinars (1966-1990) random", |
| 5227 "1.00 Yugoslavian new dinar (1994-2002) random", |
| 5228 "1.00 Yugoslavian new dinars (1994-2002) random", |
| 5229 "1.00 Zairean New Zaire (1993-1998) random", |
| 5230 "1.00 Zairean Zaire (1971-1993) random", |
| 5231 "1.00 Zairean new zaire (1993-1998) random", |
| 5232 "1.00 Zairean new zaires (1993-1998) random", |
| 5233 "1.00 Zairean zaire (1971-1993) random", |
| 5234 "1.00 Zairean zaires (1971-1993) random", |
| 5235 "1.00 Zambian Kwacha random", |
| 5236 "1.00 Zambian kwacha random", |
| 5237 "1.00 Zambian kwachas random", |
| 5238 "1.00 Zimbabwean Dollar (1980-2008) random", |
| 5239 "1.00 Zimbabwean dollar (1980-2008) random", |
| 5240 "1.00 Zimbabwean dollars (1980-2008) random", |
| 5241 "1.00 euro random", |
| 5242 "1.00 euros random", |
| 5243 "1.00 Turkish lira (1922-2005) random", |
| 5244 "1.00 special drawing rights random", |
| 5245 "1.00 Colombian real value unit random", |
| 5246 "1.00 Colombian real value units random", |
| 5247 "1.00 unknown/invalid currency random", |
| 5248 }; |
| 5249 |
| 5250 const char* WRONG_DATA[] = { |
| 5251 // Following are missing one last char in the currency name |
| 5252 "usd1.00", // case sensitive |
| 5253 "1.00 Nicaraguan Cordob", |
| 5254 "1.00 Namibian Dolla", |
| 5255 "1.00 Namibian dolla", |
| 5256 "1.00 Nepalese Rupe", |
| 5257 "1.00 Nepalese rupe", |
| 5258 "1.00 Netherlands Antillean Guilde", |
| 5259 "1.00 Netherlands Antillean guilde", |
| 5260 "1.00 Dutch Guilde", |
| 5261 "1.00 Dutch guilde", |
| 5262 "1.00 Israeli New Sheqe", |
| 5263 "1.00 New Zealand Dolla", |
| 5264 "1.00 New Zealand dolla", |
| 5265 "1.00 Nicaraguan cordob", |
| 5266 "1.00 Nigerian Nair", |
| 5267 "1.00 Nigerian nair", |
| 5268 "1.00 North Korean Wo", |
| 5269 "1.00 North Korean wo", |
| 5270 "1.00 Norwegian Kron", |
| 5271 "1.00 Norwegian kron", |
| 5272 "1.00 US dolla", |
| 5273 "1.00", |
| 5274 "A1.00", |
| 5275 "AD1.00", |
| 5276 "AE1.00", |
| 5277 "AF1.00", |
| 5278 "AL1.00", |
| 5279 "AM1.00", |
| 5280 "AN1.00", |
| 5281 "AO1.00", |
| 5282 "AR1.00", |
| 5283 "AT1.00", |
| 5284 "AU1.00", |
| 5285 "AW1.00", |
| 5286 "AZ1.00", |
| 5287 "Afghan Afghan1.00", |
| 5288 "Afghan Afghani (1927-20021.00", |
| 5289 "Afl1.00", |
| 5290 "Albanian Le1.00", |
| 5291 "Algerian Dina1.00", |
| 5292 "Andorran Peset1.00", |
| 5293 "Angolan Kwanz1.00", |
| 5294 "Angolan Kwanza (1977-19901.00", |
| 5295 "Angolan Readjusted Kwanza (1995-19991.00", |
| 5296 "Angolan New Kwanza (1990-20001.00", |
| 5297 "Argentine Austra1.00", |
| 5298 "Argentine Pes1.00", |
| 5299 "Argentine Peso (1983-19851.00", |
| 5300 "Armenian Dra1.00", |
| 5301 "Aruban Flori1.00", |
| 5302 "Australian Dolla1.00", |
| 5303 "Austrian Schillin1.00", |
| 5304 "Azerbaijani Mana1.00", |
| 5305 "Azerbaijani Manat (1993-20061.00", |
| 5306 "B1.00", |
| 5307 "BA1.00", |
| 5308 "BB1.00", |
| 5309 "BE1.00", |
| 5310 "BG1.00", |
| 5311 "BH1.00", |
| 5312 "BI1.00", |
| 5313 "BM1.00", |
| 5314 "BN1.00", |
| 5315 "BO1.00", |
| 5316 "BR1.00", |
| 5317 "BS1.00", |
| 5318 "BT1.00", |
| 5319 "BU1.00", |
| 5320 "BW1.00", |
| 5321 "BY1.00", |
| 5322 "BZ1.00", |
| 5323 "Bahamian Dolla1.00", |
| 5324 "Bahraini Dina1.00", |
| 5325 "Bangladeshi Tak1.00", |
| 5326 "Barbadian Dolla1.00", |
| 5327 "Bds1.00", |
| 5328 "Belarusian New Ruble (1994-19991.00", |
| 5329 "Belarusian Rubl1.00", |
| 5330 "Belgian Fran1.00", |
| 5331 "Belgian Franc (convertible1.00", |
| 5332 "Belgian Franc (financial1.00", |
| 5333 "Belize Dolla1.00", |
| 5334 "Bermudan Dolla1.00", |
| 5335 "Bhutanese Ngultru1.00", |
| 5336 "Bolivian Mvdo1.00", |
| 5337 "Bolivian Pes1.00", |
| 5338 "Bolivian Bolivian1.00", |
| 5339 "Bosnia-Herzegovina Convertible Mar1.00", |
| 5340 "Bosnia-Herzegovina Dina1.00", |
| 5341 "Botswanan Pul1.00", |
| 5342 "Brazilian Cruzad1.00", |
| 5343 "Brazilian Cruzado Nov1.00", |
| 5344 "Brazilian Cruzeir1.00", |
| 5345 "Brazilian Cruzeiro (1990-19931.00", |
| 5346 "Brazilian New Cruzeiro (1967-19861.00", |
| 5347 "Brazilian Rea1.00", |
| 5348 "British Pound Sterlin1.00", |
| 5349 "Brunei Dolla1.00", |
| 5350 "Bulgarian Hard Le1.00", |
| 5351 "Bulgarian Le1.00", |
| 5352 "Burmese Kya1.00", |
| 5353 "Burundian Fran1.00", |
| 5354 "C1.00", |
| 5355 "CA1.00", |
| 5356 "CD1.00", |
| 5357 "CFA Franc BCEA1.00", |
| 5358 "CFA Franc BEA1.00", |
| 5359 "CFP Fran1.00", |
| 5360 "CFP1.00", |
| 5361 "CH1.00", |
| 5362 "CL1.00", |
| 5363 "CN1.00", |
| 5364 "CO1.00", |
| 5365 "CS1.00", |
| 5366 "CU1.00", |
| 5367 "CV1.00", |
| 5368 "CY1.00", |
| 5369 "CZ1.00", |
| 5370 "Cambodian Rie1.00", |
| 5371 "Canadian Dolla1.00", |
| 5372 "Cape Verdean Escud1.00", |
| 5373 "Cayman Islands Dolla1.00", |
| 5374 "Chilean Pes1.00", |
| 5375 "Chilean Unit of Accoun1.00", |
| 5376 "Chinese Yua1.00", |
| 5377 "Colombian Pes1.00", |
| 5378 "Comoro Fran1.00", |
| 5379 "Congolese Fran1.00", |
| 5380 "Costa Rican Col\\u00f31.00", |
| 5381 "Croatian Dina1.00", |
| 5382 "Croatian Kun1.00", |
| 5383 "Cuban Pes1.00", |
| 5384 "Cypriot Poun1.00", |
| 5385 "Czech Republic Korun1.00", |
| 5386 "Czechoslovak Hard Korun1.00", |
| 5387 "D1.00", |
| 5388 "DD1.00", |
| 5389 "DE1.00", |
| 5390 "DJ1.00", |
| 5391 "DK1.00", |
| 5392 "DO1.00", |
| 5393 "DZ1.00", |
| 5394 "Danish Kron1.00", |
| 5395 "German Mar1.00", |
| 5396 "Djiboutian Fran1.00", |
| 5397 "Dk1.00", |
| 5398 "Dominican Pes1.00", |
| 5399 "EC1.00", |
| 5400 "EE1.00", |
| 5401 "EG1.00", |
| 5402 "EQ1.00", |
| 5403 "ER1.00", |
| 5404 "ES1.00", |
| 5405 "ET1.00", |
| 5406 "EU1.00", |
| 5407 "East Caribbean Dolla1.00", |
| 5408 "East German Ostmar1.00", |
| 5409 "Ecuadorian Sucr1.00", |
| 5410 "Ecuadorian Unit of Constant Valu1.00", |
| 5411 "Egyptian Poun1.00", |
| 5412 "Ekwel1.00", |
| 5413 "Salvadoran Col\\u00f31.00", |
| 5414 "Equatorial Guinean Ekwel1.00", |
| 5415 "Eritrean Nakf1.00", |
| 5416 "Es1.00", |
| 5417 "Estonian Kroo1.00", |
| 5418 "Ethiopian Bir1.00", |
| 5419 "Eur1.00", |
| 5420 "European Composite Uni1.00", |
| 5421 "European Currency Uni1.00", |
| 5422 "European Monetary Uni1.00", |
| 5423 "European Unit of Account (XBC1.00", |
| 5424 "European Unit of Account (XBD1.00", |
| 5425 "F1.00", |
| 5426 "FB1.00", |
| 5427 "FI1.00", |
| 5428 "FJ1.00", |
| 5429 "FK1.00", |
| 5430 "FR1.00", |
| 5431 "Falkland Islands Poun1.00", |
| 5432 "Fd1.00", |
| 5433 "Fijian Dolla1.00", |
| 5434 "Finnish Markk1.00", |
| 5435 "Fr1.00", |
| 5436 "French Fran1.00", |
| 5437 "French Gold Fran1.00", |
| 5438 "French UIC-Fran1.00", |
| 5439 "G1.00", |
| 5440 "GB1.00", |
| 5441 "GE1.00", |
| 5442 "GH1.00", |
| 5443 "GI1.00", |
| 5444 "GM1.00", |
| 5445 "GN1.00", |
| 5446 "GQ1.00", |
| 5447 "GR1.00", |
| 5448 "GT1.00", |
| 5449 "GW1.00", |
| 5450 "GY1.00", |
| 5451 "Gambian Dalas1.00", |
| 5452 "Georgian Kupon Lari1.00", |
| 5453 "Georgian Lar1.00", |
| 5454 "Ghanaian Ced1.00", |
| 5455 "Ghanaian Cedi (1979-20071.00", |
| 5456 "Gibraltar Poun1.00", |
| 5457 "Gol1.00", |
| 5458 "Greek Drachm1.00", |
| 5459 "Guatemalan Quetza1.00", |
| 5460 "Guinean Fran1.00", |
| 5461 "Guinean Syl1.00", |
| 5462 "Guinea-Bissau Pes1.00", |
| 5463 "Guyanaese Dolla1.00", |
| 5464 "HK1.00", |
| 5465 "HN1.00", |
| 5466 "HR1.00", |
| 5467 "HT1.00", |
| 5468 "HU1.00", |
| 5469 "Haitian Gourd1.00", |
| 5470 "Honduran Lempir1.00", |
| 5471 "Hong Kong Dolla1.00", |
| 5472 "Hungarian Forin1.00", |
| 5473 "I1.00", |
| 5474 "IE1.00", |
| 5475 "IL1.00", |
| 5476 "IN1.00", |
| 5477 "IQ1.00", |
| 5478 "IR1.00", |
| 5479 "IS1.00", |
| 5480 "IT1.00", |
| 5481 "Icelandic Kron1.00", |
| 5482 "Indian Rupe1.00", |
| 5483 "Indonesian Rupia1.00", |
| 5484 "Iranian Ria1.00", |
| 5485 "Iraqi Dina1.00", |
| 5486 "Irish Poun1.00", |
| 5487 "Israeli Poun1.00", |
| 5488 "Italian Lir1.00", |
| 5489 "J1.00", |
| 5490 "JM1.00", |
| 5491 "JO1.00", |
| 5492 "JP1.00", |
| 5493 "Jamaican Dolla1.00", |
| 5494 "Japanese Ye1.00", |
| 5495 "Jordanian Dina1.00", |
| 5496 "K S1.00", |
| 5497 "K1.00", |
| 5498 "KE1.00", |
| 5499 "KG1.00", |
| 5500 "KH1.00", |
| 5501 "KP1.00", |
| 5502 "KR1.00", |
| 5503 "KW1.00", |
| 5504 "KY1.00", |
| 5505 "KZ1.00", |
| 5506 "Kazakhstani Teng1.00", |
| 5507 "Kenyan Shillin1.00", |
| 5508 "Kuwaiti Dina1.00", |
| 5509 "Kyrgystani So1.00", |
| 5510 "LA1.00", |
| 5511 "LB1.00", |
| 5512 "LK1.00", |
| 5513 "LR1.00", |
| 5514 "LT1.00", |
| 5515 "LU1.00", |
| 5516 "LV1.00", |
| 5517 "LY1.00", |
| 5518 "Laotian Ki1.00", |
| 5519 "Latvian Lat1.00", |
| 5520 "Latvian Rubl1.00", |
| 5521 "Lebanese Poun1.00", |
| 5522 "Lesotho Lot1.00", |
| 5523 "Liberian Dolla1.00", |
| 5524 "Libyan Dina1.00", |
| 5525 "Lithuanian Lit1.00", |
| 5526 "Lithuanian Talona1.00", |
| 5527 "Luxembourgian Convertible Fran1.00", |
| 5528 "Luxembourg Financial Fran1.00", |
| 5529 "Luxembourgian Fran1.00", |
| 5530 "MA1.00", |
| 5531 "MD1.00", |
| 5532 "MDe1.00", |
| 5533 "MEX1.00", |
| 5534 "MG1.00", |
| 5535 "ML1.00", |
| 5536 "MM1.00", |
| 5537 "MN1.00", |
| 5538 "MO1.00", |
| 5539 "MR1.00", |
| 5540 "MT1.00", |
| 5541 "MU1.00", |
| 5542 "MV1.00", |
| 5543 "MW1.00", |
| 5544 "MX1.00", |
| 5545 "MY1.00", |
| 5546 "MZ1.00", |
| 5547 "Macanese Patac1.00", |
| 5548 "Macedonian Dena1.00", |
| 5549 "Malagasy Ariar1.00", |
| 5550 "Malagasy Fran1.00", |
| 5551 "Malawian Kwach1.00", |
| 5552 "Malaysian Ringgi1.00", |
| 5553 "Maldivian Rufiya1.00", |
| 5554 "Malian Fran1.00", |
| 5555 "Malot1.00", |
| 5556 "Maltese Lir1.00", |
| 5557 "Maltese Poun1.00", |
| 5558 "Mauritanian Ouguiy1.00", |
| 5559 "Mauritian Rupe1.00", |
| 5560 "Mexican Pes1.00", |
| 5561 "Mexican Silver Peso (1861-19921.00", |
| 5562 "Mexican Investment Uni1.00", |
| 5563 "Moldovan Le1.00", |
| 5564 "Mongolian Tugri1.00", |
| 5565 "Moroccan Dirha1.00", |
| 5566 "Moroccan Fran1.00", |
| 5567 "Mozambican Escud1.00", |
| 5568 "Mozambican Metica1.00", |
| 5569 "Myanma Kya1.00", |
| 5570 "N1.00", |
| 5571 "NA1.00", |
| 5572 "NAf1.00", |
| 5573 "NG1.00", |
| 5574 "NI1.00", |
| 5575 "NK1.00", |
| 5576 "NL1.00", |
| 5577 "NO1.00", |
| 5578 "NP1.00", |
| 5579 "NT1.00", |
| 5580 "Namibian Dolla1.00", |
| 5581 "Nepalese Rupe1.00", |
| 5582 "Netherlands Antillean Guilde1.00", |
| 5583 "Dutch Guilde1.00", |
| 5584 "Israeli New Sheqe1.00", |
| 5585 "New Zealand Dolla1.00", |
| 5586 "Nicaraguan C\\u00f3rdoba (1988-19911.00", |
| 5587 "Nicaraguan C\\u00f3rdob1.00", |
| 5588 "Nigerian Nair1.00", |
| 5589 "North Korean Wo1.00", |
| 5590 "Norwegian Kron1.00", |
| 5591 "Nr1.00", |
| 5592 "OM1.00", |
| 5593 "Old Mozambican Metica1.00", |
| 5594 "Romanian Leu (1952-20061.00", |
| 5595 "Serbian Dinar (2002-20061.00", |
| 5596 "Sudanese Dinar (1992-20071.00", |
| 5597 "Sudanese Pound (1957-19981.00", |
| 5598 "Turkish Lira (1922-20051.00", |
| 5599 "Omani Ria1.00", |
| 5600 "PA1.00", |
| 5601 "PE1.00", |
| 5602 "PG1.00", |
| 5603 "PH1.00", |
| 5604 "PK1.00", |
| 5605 "PL1.00", |
| 5606 "PT1.00", |
| 5607 "PY1.00", |
| 5608 "Pakistani Rupe1.00", |
| 5609 "Palladiu1.00", |
| 5610 "Panamanian Balbo1.00", |
| 5611 "Papua New Guinean Kin1.00", |
| 5612 "Paraguayan Guaran1.00", |
| 5613 "Peruvian Int1.00", |
| 5614 "Peruvian Sol (1863-19651.00", |
| 5615 "Peruvian Sol Nuev1.00", |
| 5616 "Philippine Pes1.00", |
| 5617 "Platinu1.00", |
| 5618 "Polish Zlot1.00", |
| 5619 "Polish Zloty (1950-19951.00", |
| 5620 "Portuguese Escud1.00", |
| 5621 "Portuguese Guinea Escud1.00", |
| 5622 "Pr1.00", |
| 5623 "QA1.00", |
| 5624 "Qatari Ria1.00", |
| 5625 "RD1.00", |
| 5626 "RH1.00", |
| 5627 "RINET Fund1.00", |
| 5628 "RS1.00", |
| 5629 "RU1.00", |
| 5630 "RW1.00", |
| 5631 "Rb1.00", |
| 5632 "Rhodesian Dolla1.00", |
| 5633 "Romanian Le1.00", |
| 5634 "Russian Rubl1.00", |
| 5635 "Russian Ruble (1991-19981.00", |
| 5636 "Rwandan Fran1.00", |
| 5637 "S1.00", |
| 5638 "SA1.00", |
| 5639 "SB1.00", |
| 5640 "SC1.00", |
| 5641 "SD1.00", |
| 5642 "SE1.00", |
| 5643 "SG1.00", |
| 5644 "SH1.00", |
| 5645 "SI1.00", |
| 5646 "SK1.00", |
| 5647 "SL R1.00", |
| 5648 "SL1.00", |
| 5649 "SO1.00", |
| 5650 "ST1.00", |
| 5651 "SU1.00", |
| 5652 "SV1.00", |
| 5653 "SY1.00", |
| 5654 "SZ1.00", |
| 5655 "Saint Helena Poun1.00", |
| 5656 "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobr1.00", |
| 5657 "Saudi Riya1.00", |
| 5658 "Serbian Dina1.00", |
| 5659 "Seychellois Rupe1.00", |
| 5660 "Sh1.00", |
| 5661 "Sierra Leonean Leon1.00", |
| 5662 "Silve1.00", |
| 5663 "Singapore Dolla1.00", |
| 5664 "Slovak Korun1.00", |
| 5665 "Slovenian Tola1.00", |
| 5666 "Solomon Islands Dolla1.00", |
| 5667 "Somali Shillin1.00", |
| 5668 "South African Ran1.00", |
| 5669 "South African Rand (financial1.00", |
| 5670 "South Korean Wo1.00", |
| 5671 "Soviet Roubl1.00", |
| 5672 "Spanish Peset1.00", |
| 5673 "Spanish Peseta (A account1.00", |
| 5674 "Spanish Peseta (convertible account1.00", |
| 5675 "Special Drawing Right1.00", |
| 5676 "Sri Lankan Rupe1.00", |
| 5677 "Sudanese Poun1.00", |
| 5678 "Surinamese Dolla1.00", |
| 5679 "Surinamese Guilde1.00", |
| 5680 "Swazi Lilangen1.00", |
| 5681 "Swedish Kron1.00", |
| 5682 "Swiss Fran1.00", |
| 5683 "Syrian Poun1.00", |
| 5684 "T S1.00", |
| 5685 "TH1.00", |
| 5686 "TJ1.00", |
| 5687 "TM1.00", |
| 5688 "TN1.00", |
| 5689 "TO1.00", |
| 5690 "TP1.00", |
| 5691 "TR1.00", |
| 5692 "TT1.00", |
| 5693 "TW1.00", |
| 5694 "TZ1.00", |
| 5695 "New Taiwan Dolla1.00", |
| 5696 "Tajikistani Rubl1.00", |
| 5697 "Tajikistani Somon1.00", |
| 5698 "Tanzanian Shillin1.00", |
| 5699 "Testing Currency Cod1.00", |
| 5700 "Thai Bah1.00", |
| 5701 "Timorese Escud1.00", |
| 5702 "Tongan Pa\\u20bbang1.00", |
| 5703 "Trinidad and Tobago Dolla1.00", |
| 5704 "Tunisian Dina1.00", |
| 5705 "Turkish Lir1.00", |
| 5706 "Turkmenistani Mana1.00", |
| 5707 "U S1.00", |
| 5708 "U1.00", |
| 5709 "UA1.00", |
| 5710 "UG1.00", |
| 5711 "US Dolla1.00", |
| 5712 "US Dollar (Next day1.00", |
| 5713 "US Dollar (Same day1.00", |
| 5714 "US1.00", |
| 5715 "UY1.00", |
| 5716 "UZ1.00", |
| 5717 "Ugandan Shillin1.00", |
| 5718 "Ugandan Shilling (1966-19871.00", |
| 5719 "Ukrainian Hryvni1.00", |
| 5720 "Ukrainian Karbovanet1.00", |
| 5721 "Colombian Real Value Uni1.00", |
| 5722 "United Arab Emirates Dirha1.00", |
| 5723 "Unknown Currenc1.00", |
| 5724 "Ur1.00", |
| 5725 "Uruguay Peso (1975-19931.00", |
| 5726 "Uruguay Peso Uruguay1.00", |
| 5727 "Uruguay Peso (Indexed Units1.00", |
| 5728 "Uzbekistan So1.00", |
| 5729 "V1.00", |
| 5730 "VE1.00", |
| 5731 "VN1.00", |
| 5732 "VU1.00", |
| 5733 "Vanuatu Vat1.00", |
| 5734 "Venezuelan Bol\\u00edva1.00", |
| 5735 "Venezuelan Bol\\u00edvar Fuert1.00", |
| 5736 "Vietnamese Don1.00", |
| 5737 "WIR Eur1.00", |
| 5738 "WIR Fran1.00", |
| 5739 "WS1.00", |
| 5740 "Samoa Tal1.00", |
| 5741 "XA1.00", |
| 5742 "XB1.00", |
| 5743 "XC1.00", |
| 5744 "XD1.00", |
| 5745 "XE1.00", |
| 5746 "XF1.00", |
| 5747 "XO1.00", |
| 5748 "XP1.00", |
| 5749 "XR1.00", |
| 5750 "XT1.00", |
| 5751 "XX1.00", |
| 5752 "YD1.00", |
| 5753 "YE1.00", |
| 5754 "YU1.00", |
| 5755 "Yemeni Dina1.00", |
| 5756 "Yemeni Ria1.00", |
| 5757 "Yugoslavian Convertible Dina1.00", |
| 5758 "Yugoslavian Hard Dinar (1966-19901.00", |
| 5759 "Yugoslavian New Dina1.00", |
| 5760 "Z1.00", |
| 5761 "ZA1.00", |
| 5762 "ZM1.00", |
| 5763 "ZR1.00", |
| 5764 "ZW1.00", |
| 5765 "Zairean New Zaire (1993-19981.00", |
| 5766 "Zairean Zair1.00", |
| 5767 "Zambian Kwach1.00", |
| 5768 "Zimbabwean Dollar (1980-20081.00", |
| 5769 "dra1.00", |
| 5770 "lar1.00", |
| 5771 "le1.00", |
| 5772 "man1.00", |
| 5773 "so1.00", |
| 5774 }; |
| 5775 |
| 5776 Locale locale("en_US"); |
| 5777 for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
| 5778 UnicodeString formatted = ctou(DATA[i]); |
| 5779 UErrorCode status = U_ZERO_ERROR; |
| 5780 NumberFormat* numFmt = NumberFormat::createInstance(locale, NumberFormat::
kCurrencyStyle, status); |
| 5781 Formattable parseResult; |
| 5782 if (numFmt != NULL && U_SUCCESS(status)) { |
| 5783 numFmt->parse(formatted, parseResult, status); |
| 5784 if (U_FAILURE(status) || |
| 5785 (parseResult.getType() == Formattable::kDouble && |
| 5786 parseResult.getDouble() != 1.0)) { |
| 5787 errln("wrong parsing, " + formatted); |
| 5788 errln("data: " + formatted); |
| 5789 } |
| 5790 } else { |
| 5791 dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); |
| 5792 delete numFmt; |
| 5793 break; |
| 5794 } |
| 5795 delete numFmt; |
| 5796 } |
| 5797 |
| 5798 for (uint32_t i=0; i<sizeof(WRONG_DATA)/sizeof(WRONG_DATA[0]); ++i) { |
| 5799 UnicodeString formatted = ctou(WRONG_DATA[i]); |
| 5800 UErrorCode status = U_ZERO_ERROR; |
| 5801 NumberFormat* numFmt = NumberFormat::createInstance(locale, NumberFormat::
kCurrencyStyle, status); |
| 5802 Formattable parseResult; |
| 5803 if (numFmt != NULL && U_SUCCESS(status)) { |
| 5804 numFmt->parse(formatted, parseResult, status); |
| 5805 if (!U_FAILURE(status) || |
| 5806 (parseResult.getType() == Formattable::kDouble && |
| 5807 parseResult.getDouble() == 1.0)) { |
| 5808 errln("parsed but should not be: " + formatted); |
| 5809 errln("data: " + formatted); |
| 5810 } |
| 5811 } else { |
| 5812 dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); |
| 5813 delete numFmt; |
| 5814 break; |
| 5815 } |
| 5816 delete numFmt; |
| 5817 } |
| 5818 } |
| 5819 |
| 5820 const char* attrString(int32_t); |
| 5821 |
| 5822 // UnicodeString s; |
| 5823 // std::string ss; |
| 5824 // std::cout << s.toUTF8String(ss) |
| 5825 void NumberFormatTest::expectPositions(FieldPositionIterator& iter, int32_t *val
ues, int32_t tupleCount, |
| 5826 const UnicodeString& str) { |
| 5827 UBool found[10]; |
| 5828 FieldPosition fp; |
| 5829 |
| 5830 if (tupleCount > 10) { |
| 5831 assertTrue("internal error, tupleCount too large", FALSE); |
| 5832 } else { |
| 5833 for (int i = 0; i < tupleCount; ++i) { |
| 5834 found[i] = FALSE; |
| 5835 } |
| 5836 } |
| 5837 |
| 5838 logln(str); |
| 5839 while (iter.next(fp)) { |
| 5840 UBool ok = FALSE; |
| 5841 int32_t id = fp.getField(); |
| 5842 int32_t start = fp.getBeginIndex(); |
| 5843 int32_t limit = fp.getEndIndex(); |
| 5844 |
| 5845 // is there a logln using printf? |
| 5846 char buf[128]; |
| 5847 sprintf(buf, "%24s %3d %3d %3d", attrString(id), id, start, limit); |
| 5848 logln(buf); |
| 5849 |
| 5850 for (int i = 0; i < tupleCount; ++i) { |
| 5851 if (found[i]) { |
| 5852 continue; |
| 5853 } |
| 5854 if (values[i*3] == id && |
| 5855 values[i*3+1] == start && |
| 5856 values[i*3+2] == limit) { |
| 5857 found[i] = ok = TRUE; |
| 5858 break; |
| 5859 } |
| 5860 } |
| 5861 |
| 5862 assertTrue((UnicodeString)"found [" + id + "," + start + "," + limit + "]",
ok); |
| 5863 } |
| 5864 |
| 5865 // check that all were found |
| 5866 UBool ok = TRUE; |
| 5867 for (int i = 0; i < tupleCount; ++i) { |
| 5868 if (!found[i]) { |
| 5869 ok = FALSE; |
| 5870 assertTrue((UnicodeString) "missing [" + values[i*3] + "," + values[i*3+1]
+ "," + values[i*3+2] + "]", found[i]); |
| 5871 } |
| 5872 } |
| 5873 assertTrue("no expected values were missing", ok); |
| 5874 } |
| 5875 |
| 5876 void NumberFormatTest::expectPosition(FieldPosition& pos, int32_t id, int32_t st
art, int32_t limit, |
| 5877 const UnicodeString& str) { |
| 5878 logln(str); |
| 5879 assertTrue((UnicodeString)"id " + id + " == " + pos.getField(), id == pos.getF
ield()); |
| 5880 assertTrue((UnicodeString)"begin " + start + " == " + pos.getBeginIndex(), sta
rt == pos.getBeginIndex()); |
| 5881 assertTrue((UnicodeString)"end " + limit + " == " + pos.getEndIndex(), limit =
= pos.getEndIndex()); |
| 5882 } |
| 5883 |
| 5884 void NumberFormatTest::TestFieldPositionIterator() { |
| 5885 // bug 7372 |
| 5886 UErrorCode status = U_ZERO_ERROR; |
| 5887 FieldPositionIterator iter1; |
| 5888 FieldPositionIterator iter2; |
| 5889 FieldPosition pos; |
| 5890 |
| 5891 DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(status)
; |
| 5892 if (failure(status, "NumberFormat::createInstance", TRUE)) return; |
| 5893 |
| 5894 double num = 1234.56; |
| 5895 UnicodeString str1; |
| 5896 UnicodeString str2; |
| 5897 |
| 5898 assertTrue((UnicodeString)"self==", iter1 == iter1); |
| 5899 assertTrue((UnicodeString)"iter1==iter2", iter1 == iter2); |
| 5900 |
| 5901 decFmt->format(num, str1, &iter1, status); |
| 5902 assertTrue((UnicodeString)"iter1 != iter2", iter1 != iter2); |
| 5903 decFmt->format(num, str2, &iter2, status); |
| 5904 assertTrue((UnicodeString)"iter1 == iter2 (2)", iter1 == iter2); |
| 5905 iter1.next(pos); |
| 5906 assertTrue((UnicodeString)"iter1 != iter2 (2)", iter1 != iter2); |
| 5907 iter2.next(pos); |
| 5908 assertTrue((UnicodeString)"iter1 == iter2 (3)", iter1 == iter2); |
| 5909 |
| 5910 // should format ok with no iterator |
| 5911 str2.remove(); |
| 5912 decFmt->format(num, str2, NULL, status); |
| 5913 assertEquals("null fpiter", str1, str2); |
| 5914 |
| 5915 delete decFmt; |
| 5916 } |
| 5917 |
| 5918 void NumberFormatTest::TestFormatAttributes() { |
| 5919 Locale locale("en_US"); |
| 5920 UErrorCode status = U_ZERO_ERROR; |
| 5921 DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(locale,
NumberFormat::kCurrencyStyle, status); |
| 5922 if (failure(status, "NumberFormat::createInstance", TRUE)) return; |
| 5923 double val = 12345.67; |
| 5924 |
| 5925 { |
| 5926 int32_t expected[] = { |
| 5927 NumberFormat::kCurrencyField, 0, 1, |
| 5928 NumberFormat::kGroupingSeparatorField, 3, 4, |
| 5929 NumberFormat::kIntegerField, 1, 7, |
| 5930 NumberFormat::kDecimalSeparatorField, 7, 8, |
| 5931 NumberFormat::kFractionField, 8, 10, |
| 5932 }; |
| 5933 int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); |
| 5934 |
| 5935 FieldPositionIterator posIter; |
| 5936 UnicodeString result; |
| 5937 decFmt->format(val, result, &posIter, status); |
| 5938 expectPositions(posIter, expected, tupleCount, result); |
| 5939 } |
| 5940 { |
| 5941 FieldPosition fp(NumberFormat::kIntegerField); |
| 5942 UnicodeString result; |
| 5943 decFmt->format(val, result, fp); |
| 5944 expectPosition(fp, NumberFormat::kIntegerField, 1, 7, result); |
| 5945 } |
| 5946 { |
| 5947 FieldPosition fp(NumberFormat::kFractionField); |
| 5948 UnicodeString result; |
| 5949 decFmt->format(val, result, fp); |
| 5950 expectPosition(fp, NumberFormat::kFractionField, 8, 10, result); |
| 5951 } |
| 5952 delete decFmt; |
| 5953 |
| 5954 decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, NumberFormat::
kScientificStyle, status); |
| 5955 val = -0.0000123; |
| 5956 { |
| 5957 int32_t expected[] = { |
| 5958 NumberFormat::kSignField, 0, 1, |
| 5959 NumberFormat::kIntegerField, 1, 2, |
| 5960 NumberFormat::kDecimalSeparatorField, 2, 3, |
| 5961 NumberFormat::kFractionField, 3, 5, |
| 5962 NumberFormat::kExponentSymbolField, 5, 6, |
| 5963 NumberFormat::kExponentSignField, 6, 7, |
| 5964 NumberFormat::kExponentField, 7, 8 |
| 5965 }; |
| 5966 int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); |
| 5967 |
| 5968 FieldPositionIterator posIter; |
| 5969 UnicodeString result; |
| 5970 decFmt->format(val, result, &posIter, status); |
| 5971 expectPositions(posIter, expected, tupleCount, result); |
| 5972 } |
| 5973 { |
| 5974 FieldPosition fp(NumberFormat::kIntegerField); |
| 5975 UnicodeString result; |
| 5976 decFmt->format(val, result, fp); |
| 5977 expectPosition(fp, NumberFormat::kIntegerField, 1, 2, result); |
| 5978 } |
| 5979 { |
| 5980 FieldPosition fp(NumberFormat::kFractionField); |
| 5981 UnicodeString result; |
| 5982 decFmt->format(val, result, fp); |
| 5983 expectPosition(fp, NumberFormat::kFractionField, 3, 5, result); |
| 5984 } |
| 5985 delete decFmt; |
| 5986 |
| 5987 fflush(stderr); |
| 5988 } |
| 5989 |
| 5990 const char* attrString(int32_t attrId) { |
| 5991 switch (attrId) { |
| 5992 case NumberFormat::kIntegerField: return "integer"; |
| 5993 case NumberFormat::kFractionField: return "fraction"; |
| 5994 case NumberFormat::kDecimalSeparatorField: return "decimal separator"; |
| 5995 case NumberFormat::kExponentSymbolField: return "exponent symbol"; |
| 5996 case NumberFormat::kExponentSignField: return "exponent sign"; |
| 5997 case NumberFormat::kExponentField: return "exponent"; |
| 5998 case NumberFormat::kGroupingSeparatorField: return "grouping separator"; |
| 5999 case NumberFormat::kCurrencyField: return "currency"; |
| 6000 case NumberFormat::kPercentField: return "percent"; |
| 6001 case NumberFormat::kPermillField: return "permille"; |
| 6002 case NumberFormat::kSignField: return "sign"; |
| 6003 default: return ""; |
| 6004 } |
| 6005 } |
| 6006 |
| 6007 // |
| 6008 // Test formatting & parsing of big decimals. |
| 6009 // API test, not a comprehensive test. |
| 6010 // See DecimalFormatTest/DataDrivenTests |
| 6011 // |
| 6012 #define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) errln("file %s, line %d:
status: %s", \ |
| 6013 __FILE__, __LINE__, u_errorName(
status));} |
| 6014 #define ASSERT_EQUALS(expected, actual) {if ((expected) != (actual)) \ |
| 6015 errln("file %s, line %d: %s != %s", __FILE__, __LINE__, #expec
ted, #actual);} |
| 6016 |
| 6017 static UBool operator != (const char *s1, UnicodeString &s2) { |
| 6018 // This function lets ASSERT_EQUALS("literal", UnicodeString) work. |
| 6019 UnicodeString us1(s1); |
| 6020 return us1 != s2; |
| 6021 } |
| 6022 |
| 6023 void NumberFormatTest::TestDecimal() { |
| 6024 { |
| 6025 UErrorCode status = U_ZERO_ERROR; |
| 6026 Formattable f("12.345678999987654321E666", status); |
| 6027 ASSERT_SUCCESS(status); |
| 6028 StringPiece s = f.getDecimalNumber(status); |
| 6029 ASSERT_SUCCESS(status); |
| 6030 ASSERT_EQUALS("1.2345678999987654321E+667", s); |
| 6031 //printf("%s\n", s.data()); |
| 6032 } |
| 6033 |
| 6034 { |
| 6035 UErrorCode status = U_ZERO_ERROR; |
| 6036 Formattable f1("this is not a number", status); |
| 6037 ASSERT_EQUALS(U_DECIMAL_NUMBER_SYNTAX_ERROR, status); |
| 6038 } |
| 6039 |
| 6040 { |
| 6041 UErrorCode status = U_ZERO_ERROR; |
| 6042 Formattable f; |
| 6043 f.setDecimalNumber("123.45", status); |
| 6044 ASSERT_SUCCESS(status); |
| 6045 ASSERT_EQUALS( Formattable::kDouble, f.getType()); |
| 6046 ASSERT_EQUALS(123.45, f.getDouble()); |
| 6047 ASSERT_EQUALS(123.45, f.getDouble(status)); |
| 6048 ASSERT_SUCCESS(status); |
| 6049 ASSERT_EQUALS("123.45", f.getDecimalNumber(status)); |
| 6050 ASSERT_SUCCESS(status); |
| 6051 |
| 6052 f.setDecimalNumber("4.5678E7", status); |
| 6053 int32_t n; |
| 6054 n = f.getLong(); |
| 6055 ASSERT_EQUALS(45678000, n); |
| 6056 |
| 6057 status = U_ZERO_ERROR; |
| 6058 f.setDecimalNumber("-123", status); |
| 6059 ASSERT_SUCCESS(status); |
| 6060 ASSERT_EQUALS( Formattable::kLong, f.getType()); |
| 6061 ASSERT_EQUALS(-123, f.getLong()); |
| 6062 ASSERT_EQUALS(-123, f.getLong(status)); |
| 6063 ASSERT_SUCCESS(status); |
| 6064 ASSERT_EQUALS("-123", f.getDecimalNumber(status)); |
| 6065 ASSERT_SUCCESS(status); |
| 6066 |
| 6067 status = U_ZERO_ERROR; |
| 6068 f.setDecimalNumber("1234567890123", status); // Number too big for 32 b
its |
| 6069 ASSERT_SUCCESS(status); |
| 6070 ASSERT_EQUALS( Formattable::kInt64, f.getType()); |
| 6071 ASSERT_EQUALS(1234567890123LL, f.getInt64()); |
| 6072 ASSERT_EQUALS(1234567890123LL, f.getInt64(status)); |
| 6073 ASSERT_SUCCESS(status); |
| 6074 ASSERT_EQUALS("1234567890123", f.getDecimalNumber(status)); |
| 6075 ASSERT_SUCCESS(status); |
| 6076 } |
| 6077 |
| 6078 { |
| 6079 UErrorCode status = U_ZERO_ERROR; |
| 6080 NumberFormat *fmtr = NumberFormat::createInstance( |
| 6081 Locale::getUS(), NumberFormat::kNumberStyle, status); |
| 6082 if (U_FAILURE(status) || fmtr == NULL) { |
| 6083 dataerrln("Unable to create NumberFormat"); |
| 6084 } else { |
| 6085 UnicodeString formattedResult; |
| 6086 StringPiece num("244444444444444444444444444444444444446.4"); |
| 6087 fmtr->format(num, formattedResult, NULL, status); |
| 6088 ASSERT_SUCCESS(status); |
| 6089 ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4
", formattedResult); |
| 6090 //std::string ss; std::cout << formattedResult.toUTF8String(ss); |
| 6091 delete fmtr; |
| 6092 } |
| 6093 } |
| 6094 |
| 6095 { |
| 6096 // Check formatting a DigitList. DigitList is internal, but this is |
| 6097 // a critical interface that must work. |
| 6098 UErrorCode status = U_ZERO_ERROR; |
| 6099 NumberFormat *fmtr = NumberFormat::createInstance( |
| 6100 Locale::getUS(), NumberFormat::kNumberStyle, status); |
| 6101 if (U_FAILURE(status) || fmtr == NULL) { |
| 6102 dataerrln("Unable to create NumberFormat"); |
| 6103 } else { |
| 6104 UnicodeString formattedResult; |
| 6105 DigitList dl; |
| 6106 StringPiece num("123.4566666666666666666666666666666666621E+40"); |
| 6107 dl.set(num, status); |
| 6108 ASSERT_SUCCESS(status); |
| 6109 fmtr->format(dl, formattedResult, NULL, status); |
| 6110 ASSERT_SUCCESS(status); |
| 6111 ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621
,000", formattedResult); |
| 6112 |
| 6113 status = U_ZERO_ERROR; |
| 6114 num.set("666.666"); |
| 6115 dl.set(num, status); |
| 6116 FieldPosition pos(NumberFormat::FRACTION_FIELD); |
| 6117 ASSERT_SUCCESS(status); |
| 6118 formattedResult.remove(); |
| 6119 fmtr->format(dl, formattedResult, pos, status); |
| 6120 ASSERT_SUCCESS(status); |
| 6121 ASSERT_EQUALS("666.666", formattedResult); |
| 6122 ASSERT_EQUALS(4, pos.getBeginIndex()); |
| 6123 ASSERT_EQUALS(7, pos.getEndIndex()); |
| 6124 delete fmtr; |
| 6125 } |
| 6126 } |
| 6127 |
| 6128 { |
| 6129 // Check a parse with a formatter with a multiplier. |
| 6130 UErrorCode status = U_ZERO_ERROR; |
| 6131 NumberFormat *fmtr = NumberFormat::createInstance( |
| 6132 Locale::getUS(), NumberFormat::kPercentStyle, status); |
| 6133 if (U_FAILURE(status) || fmtr == NULL) { |
| 6134 dataerrln("Unable to create NumberFormat"); |
| 6135 } else { |
| 6136 UnicodeString input = "1.84%"; |
| 6137 Formattable result; |
| 6138 fmtr->parse(input, result, status); |
| 6139 ASSERT_SUCCESS(status); |
| 6140 ASSERT_EQUALS(0, strcmp("0.0184", result.getDecimalNumber(status).da
ta())); |
| 6141 //std::cout << result.getDecimalNumber(status).data(); |
| 6142 delete fmtr; |
| 6143 } |
| 6144 } |
| 6145 |
| 6146 { |
| 6147 // Check that a parse returns a decimal number with full accuracy |
| 6148 UErrorCode status = U_ZERO_ERROR; |
| 6149 NumberFormat *fmtr = NumberFormat::createInstance( |
| 6150 Locale::getUS(), NumberFormat::kNumberStyle, status); |
| 6151 if (U_FAILURE(status) || fmtr == NULL) { |
| 6152 dataerrln("Unable to create NumberFormat"); |
| 6153 } else { |
| 6154 UnicodeString input = "1.002200044400088880000070000"; |
| 6155 Formattable result; |
| 6156 fmtr->parse(input, result, status); |
| 6157 ASSERT_SUCCESS(status); |
| 6158 ASSERT_EQUALS(0, strcmp("1.00220004440008888000007", result.getDecim
alNumber(status).data())); |
| 6159 ASSERT_EQUALS(1.00220004440008888, result.getDouble()); |
| 6160 //std::cout << result.getDecimalNumber(status).data(); |
| 6161 delete fmtr; |
| 6162 } |
| 6163 } |
| 6164 |
| 6165 } |
| 6166 |
| 6167 void NumberFormatTest::TestCurrencyFractionDigits() { |
| 6168 UErrorCode status = U_ZERO_ERROR; |
| 6169 UnicodeString text1, text2; |
| 6170 double value = 99.12345; |
| 6171 |
| 6172 // Create currenct instance |
| 6173 NumberFormat* fmt = NumberFormat::createCurrencyInstance("ja_JP", status); |
| 6174 if (U_FAILURE(status) || fmt == NULL) { |
| 6175 dataerrln("Unable to create NumberFormat"); |
| 6176 } else { |
| 6177 fmt->format(value, text1); |
| 6178 |
| 6179 // Reset the same currency and format the test value again |
| 6180 fmt->setCurrency(fmt->getCurrency(), status); |
| 6181 ASSERT_SUCCESS(status); |
| 6182 fmt->format(value, text2); |
| 6183 |
| 6184 if (text1 != text2) { |
| 6185 errln((UnicodeString)"NumberFormat::format() should return the same
result - text1=" |
| 6186 + text1 + " text2=" + text2); |
| 6187 } |
| 6188 delete fmt; |
| 6189 } |
| 6190 } |
| 6191 |
| 6192 void NumberFormatTest::TestExponentParse() { |
| 6193 |
| 6194 UErrorCode status = U_ZERO_ERROR; |
| 6195 Formattable result; |
| 6196 ParsePosition parsePos(0); |
| 6197 |
| 6198 // set the exponent symbol |
| 6199 status = U_ZERO_ERROR; |
| 6200 DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(
), status); |
| 6201 if(U_FAILURE(status)) { |
| 6202 dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (
Default)"); |
| 6203 return; |
| 6204 } |
| 6205 symbols->setSymbol(DecimalFormatSymbols::kExponentialSymbol,"e"); |
| 6206 |
| 6207 // create format instance |
| 6208 status = U_ZERO_ERROR; |
| 6209 DecimalFormat fmt("#####", symbols, status); |
| 6210 if(U_FAILURE(status)) { |
| 6211 errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, sy
mbols*)"); |
| 6212 } |
| 6213 |
| 6214 // parse the text |
| 6215 fmt.parse("123E4", result, parsePos); |
| 6216 if(result.getType() != Formattable::kDouble && |
| 6217 result.getDouble() != (double)123 && |
| 6218 parsePos.getIndex() != 3 |
| 6219 ) |
| 6220 { |
| 6221 errln("ERROR: parse failed - expected 123.0, 3 - returned %d, %i", |
| 6222 result.getDouble(), parsePos.getIndex()); |
| 6223 } |
| 6224 } |
| 6225 |
| 6226 #endif /* #if !UCONFIG_NO_FORMATTING */ |
OLD | NEW |