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