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