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