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