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