Index: icu46/source/test/intltest/numfmtst.cpp |
=================================================================== |
--- icu46/source/test/intltest/numfmtst.cpp (revision 0) |
+++ icu46/source/test/intltest/numfmtst.cpp (revision 0) |
@@ -0,0 +1,6226 @@ |
+/******************************************************************** |
+ * COPYRIGHT: |
+ * Copyright (c) 1997-2010, International Business Machines Corporation and |
+ * others. All Rights Reserved. |
+ ********************************************************************/ |
+/* Modification History: |
+* Date Name Description |
+* 07/15/99 helena Ported to HPUX 10/11 CC. |
+*/ |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_FORMATTING |
+ |
+#include "numfmtst.h" |
+#include "unicode/dcfmtsym.h" |
+#include "unicode/decimfmt.h" |
+#include "unicode/ucurr.h" |
+#include "unicode/ustring.h" |
+#include "unicode/measfmt.h" |
+#include "unicode/curramt.h" |
+#include "digitlst.h" |
+#include "textfile.h" |
+#include "tokiter.h" |
+#include "charstr.h" |
+#include "putilimp.h" |
+#include "winnmtst.h" |
+#include <float.h> |
+#include <string.h> |
+#include <stdlib.h> |
+#include "cstring.h" |
+#include "unicode/numsys.h" |
+ |
+//#define NUMFMTST_CACHE_DEBUG 1 |
+#include "stdio.h" /* for sprintf */ |
+// #include "iostream" // for cout |
+ |
+//#define NUMFMTST_DEBUG 1 |
+ |
+ |
+static const UChar EUR[] = {69,85,82,0}; // "EUR" |
+static const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD" |
+ |
+// ***************************************************************************** |
+// class NumberFormatTest |
+// ***************************************************************************** |
+ |
+#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break |
+ |
+#define CHECK(status,str) if (U_FAILURE(status)) { errcheckln(status, UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; } |
+#define CHECK_DATA(status,str) if (U_FAILURE(status)) { dataerrln(UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; } |
+ |
+void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) |
+{ |
+ // if (exec) logln((UnicodeString)"TestSuite DateFormatTest"); |
+ switch (index) { |
+ CASE(0,TestCurrencySign); |
+ CASE(1,TestCurrency); |
+ CASE(2,TestParse); |
+ CASE(3,TestRounding487); |
+ CASE(4,TestQuotes); |
+ CASE(5,TestExponential); |
+ CASE(6,TestPatterns); |
+ |
+ // Upgrade to alphaWorks - liu 5/99 |
+ CASE(7,TestExponent); |
+ CASE(8,TestScientific); |
+ CASE(9,TestPad); |
+ CASE(10,TestPatterns2); |
+ CASE(11,TestSecondaryGrouping); |
+ CASE(12,TestSurrogateSupport); |
+ CASE(13,TestAPI); |
+ |
+ CASE(14,TestCurrencyObject); |
+ CASE(15,TestCurrencyPatterns); |
+ //CASE(16,TestDigitList); |
+ CASE(16,TestWhiteSpaceParsing); |
+ CASE(17,TestComplexCurrency); // This test removed because CLDR no longer uses choice formats in currency symbols. |
+ CASE(18,TestRegCurrency); |
+ CASE(19,TestSymbolsWithBadLocale); |
+ CASE(20,TestAdoptDecimalFormatSymbols); |
+ |
+ CASE(21,TestScientific2); |
+ CASE(22,TestScientificGrouping); |
+ CASE(23,TestInt64); |
+ |
+ CASE(24,TestPerMill); |
+ CASE(25,TestIllegalPatterns); |
+ CASE(26,TestCases); |
+ |
+ CASE(27,TestCurrencyNames); |
+ CASE(28,TestCurrencyAmount); |
+ CASE(29,TestCurrencyUnit); |
+ CASE(30,TestCoverage); |
+ CASE(31,TestJB3832); |
+ CASE(32,TestHost); |
+ CASE(33,TestHostClone); |
+ CASE(34,TestCurrencyFormat); |
+ CASE(35,TestRounding); |
+ CASE(36,TestNonpositiveMultiplier); |
+ CASE(37,TestNumberingSystems); |
+ CASE(38,TestSpaceParsing); |
+ CASE(39,TestMultiCurrencySign); |
+ CASE(40,TestCurrencyFormatForMixParsing); |
+ CASE(41,TestDecimalFormatCurrencyParse); |
+ CASE(42,TestCurrencyIsoPluralFormat); |
+ CASE(43,TestCurrencyParsing); |
+ CASE(44,TestParseCurrencyInUCurr); |
+ CASE(45,TestFormatAttributes); |
+ CASE(46,TestFieldPositionIterator); |
+ CASE(47,TestDecimal); |
+ CASE(48,TestCurrencyFractionDigits); |
+ CASE(49,TestExponentParse); |
+ default: name = ""; break; |
+ } |
+} |
+ |
+// ------------------------------------- |
+ |
+// Test API (increase code coverage) |
+void |
+NumberFormatTest::TestAPI(void) |
+{ |
+ logln("Test API"); |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *test = NumberFormat::createInstance("root", status); |
+ if(U_FAILURE(status)) { |
+ dataerrln("unable to create format object - %s", u_errorName(status)); |
+ } |
+ if(test != NULL) { |
+ test->setMinimumIntegerDigits(10); |
+ test->setMaximumIntegerDigits(2); |
+ |
+ test->setMinimumFractionDigits(10); |
+ test->setMaximumFractionDigits(2); |
+ |
+ UnicodeString result; |
+ FieldPosition pos; |
+ Formattable bla("Paja Patak"); // Donald Duck for non Serbian speakers |
+ test->format(bla, result, pos, status); |
+ if(U_SUCCESS(status)) { |
+ errln("Yuck... Formatted a duck... As a number!"); |
+ } else { |
+ status = U_ZERO_ERROR; |
+ } |
+ |
+ result.remove(); |
+ int64_t ll = 12; |
+ test->format(ll, result); |
+ if (result != "12.00"){ |
+ errln("format int64_t error"); |
+ } |
+ |
+ ParsePosition ppos; |
+ test->parseCurrency("",bla,ppos); |
+ if(U_FAILURE(status)) { |
+ errln("Problems accessing the parseCurrency function for NumberFormat"); |
+ } |
+ |
+ delete test; |
+ } |
+} |
+ |
+class StubNumberForamt :public NumberFormat{ |
+public: |
+ StubNumberForamt(){}; |
+ virtual UnicodeString& format(double ,UnicodeString& appendTo,FieldPosition& ) const { |
+ return appendTo; |
+ } |
+ virtual UnicodeString& format(int32_t ,UnicodeString& appendTo,FieldPosition& ) const { |
+ return appendTo.append((UChar)0x0033); |
+ } |
+ virtual UnicodeString& format(int64_t number,UnicodeString& appendTo,FieldPosition& pos) const { |
+ return NumberFormat::format(number, appendTo, pos); |
+ } |
+ virtual UnicodeString& format(const Formattable& , UnicodeString& appendTo, FieldPosition& , UErrorCode& ) const { |
+ return appendTo; |
+ } |
+ virtual void parse(const UnicodeString& , |
+ Formattable& , |
+ ParsePosition& ) const {} |
+ virtual void parse( const UnicodeString& , |
+ Formattable& , |
+ UErrorCode& ) const {} |
+ virtual UClassID getDynamicClassID(void) const { |
+ static char classID = 0; |
+ return (UClassID)&classID; |
+ } |
+ virtual Format* clone() const {return NULL;} |
+}; |
+ |
+void |
+NumberFormatTest::TestCoverage(void){ |
+ StubNumberForamt stub; |
+ UnicodeString agent("agent"); |
+ FieldPosition pos; |
+ int64_t num = 4; |
+ if (stub.format(num, agent, pos) != UnicodeString("agent3")){ |
+ errln("NumberFormat::format(int64, UnicodString&, FieldPosition&) should delegate to (int32, ,)"); |
+ }; |
+} |
+ |
+// Test various patterns |
+void |
+NumberFormatTest::TestPatterns(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols sym(Locale::getUS(), status); |
+ if (U_FAILURE(status)) { errcheckln(status, "FAIL: Could not construct DecimalFormatSymbols - %s", u_errorName(status)); return; } |
+ |
+ const char* pat[] = { "#.#", "#.", ".#", "#" }; |
+ int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); |
+ const char* newpat[] = { "#0.#", "#0.", "#.0", "#" }; |
+ const char* num[] = { "0", "0.", ".0", "0" }; |
+ for (int32_t i=0; i<pat_length; ++i) |
+ { |
+ status = U_ZERO_ERROR; |
+ DecimalFormat fmt(pat[i], sym, status); |
+ if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: DecimalFormat constructor failed for " + pat[i]); continue; } |
+ UnicodeString newp; fmt.toPattern(newp); |
+ if (!(newp == newpat[i])) |
+ errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] + |
+ "; " + newp + " seen instead"); |
+ |
+ UnicodeString s; (*(NumberFormat*)&fmt).format((int32_t)0, s); |
+ if (!(s == num[i])) |
+ { |
+ errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should format zero as " + num[i] + |
+ "; " + s + " seen instead"); |
+ logln((UnicodeString)"Min integer digits = " + fmt.getMinimumIntegerDigits()); |
+ } |
+ } |
+} |
+ |
+/* |
+icu_2_4::DigitList::operator== 0 0 2 icuuc24d.dll digitlst.cpp Doug |
+icu_2_4::DigitList::append 0 0 4 icuin24d.dll digitlst.h Doug |
+icu_2_4::DigitList::operator!= 0 0 1 icuuc24d.dll digitlst.h Doug |
+*/ |
+/* |
+void |
+NumberFormatTest::TestDigitList(void) |
+{ |
+ // API coverage for DigitList |
+ DigitList list1; |
+ list1.append('1'); |
+ list1.fDecimalAt = 1; |
+ DigitList list2; |
+ list2.set((int32_t)1); |
+ if (list1 != list2) { |
+ errln("digitlist append, operator!= or set failed "); |
+ } |
+ if (!(list1 == list2)) { |
+ errln("digitlist append, operator== or set failed "); |
+ } |
+} |
+*/ |
+ |
+// ------------------------------------- |
+ |
+// Test exponential pattern |
+void |
+NumberFormatTest::TestExponential(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols sym(Locale::getUS(), status); |
+ if (U_FAILURE(status)) { errcheckln(status, "FAIL: Bad status returned by DecimalFormatSymbols ct - %s", u_errorName(status)); return; } |
+ const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; |
+ int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0])); |
+ |
+// The following #if statements allow this test to be built and run on |
+// platforms that do not have standard IEEE numerics. For example, |
+// S/390 doubles have an exponent range of -78 to +75. For the |
+// following #if statements to work, float.h must define |
+// DBL_MAX_10_EXP to be a compile-time constant. |
+ |
+// This section may be expanded as needed. |
+ |
+#if DBL_MAX_10_EXP > 300 |
+ double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; |
+ int32_t val_length = (int32_t)(sizeof(val) / sizeof(val[0])); |
+ const char* valFormat[] = |
+ { |
+ // 0.####E0 |
+ "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", |
+ // 00.000E00 |
+ "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", |
+ // ##0.######E000 |
+ "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", |
+ // 0.###E0;[0.###E0] |
+ "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" |
+ }; |
+ double valParse[] = |
+ { |
+ 0.01234, 123460000, 1.23E300, -3.1416E-271, |
+ 0.01234, 123460000, 1.23E300, -3.1416E-271, |
+ 0.01234, 123456800, 1.23E300, -3.141593E-271, |
+ 0.01234, 123500000, 1.23E300, -3.142E-271, |
+ }; |
+#elif DBL_MAX_10_EXP > 70 |
+ double val[] = { 0.01234, 123456789, 1.23e70, -3.141592653e-71 }; |
+ int32_t val_length = sizeof(val) / sizeof(val[0]); |
+ char* valFormat[] = |
+ { |
+ // 0.####E0 |
+ "1.234E-2", "1.2346E8", "1.23E70", "-3.1416E-71", |
+ // 00.000E00 |
+ "12.340E-03", "12.346E07", "12.300E69", "-31.416E-72", |
+ // ##0.######E000 |
+ "12.34E-003", "123.4568E006", "12.3E069", "-31.41593E-072", |
+ // 0.###E0;[0.###E0] |
+ "1.234E-2", "1.235E8", "1.23E70", "[3.142E-71]" |
+ }; |
+ double valParse[] = |
+ { |
+ 0.01234, 123460000, 1.23E70, -3.1416E-71, |
+ 0.01234, 123460000, 1.23E70, -3.1416E-71, |
+ 0.01234, 123456800, 1.23E70, -3.141593E-71, |
+ 0.01234, 123500000, 1.23E70, -3.142E-71, |
+ }; |
+#else |
+ // Don't test double conversion |
+ double* val = 0; |
+ int32_t val_length = 0; |
+ char** valFormat = 0; |
+ double* valParse = 0; |
+ logln("Warning: Skipping double conversion tests"); |
+#endif |
+ |
+ int32_t lval[] = { 0, -1, 1, 123456789 }; |
+ int32_t lval_length = (int32_t)(sizeof(lval) / sizeof(lval[0])); |
+ const char* lvalFormat[] = |
+ { |
+ // 0.####E0 |
+ "0E0", "-1E0", "1E0", "1.2346E8", |
+ // 00.000E00 |
+ "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", |
+ // ##0.######E000 |
+ "0E000", "-1E000", "1E000", "123.4568E006", |
+ // 0.###E0;[0.###E0] |
+ "0E0", "[1E0]", "1E0", "1.235E8" |
+ }; |
+ int32_t lvalParse[] = |
+ { |
+ 0, -1, 1, 123460000, |
+ 0, -1, 1, 123460000, |
+ 0, -1, 1, 123456800, |
+ 0, -1, 1, 123500000, |
+ }; |
+ int32_t ival = 0, ilval = 0; |
+ for (int32_t p=0; p<pat_length; ++p) |
+ { |
+ DecimalFormat fmt(pat[p], sym, status); |
+ if (U_FAILURE(status)) { errln("FAIL: Bad status returned by DecimalFormat ct"); continue; } |
+ UnicodeString pattern; |
+ logln((UnicodeString)"Pattern \"" + pat[p] + "\" -toPattern-> \"" + |
+ fmt.toPattern(pattern) + "\""); |
+ int32_t v; |
+ for (v=0; v<val_length; ++v) |
+ { |
+ UnicodeString s; (*(NumberFormat*)&fmt).format(val[v], s); |
+ logln((UnicodeString)" " + val[v] + " -format-> " + s); |
+ if (s != valFormat[v+ival]) |
+ errln((UnicodeString)"FAIL: Expected " + valFormat[v+ival]); |
+ |
+ ParsePosition pos(0); |
+ Formattable af; |
+ fmt.parse(s, af, pos); |
+ double a; |
+ UBool useEpsilon = FALSE; |
+ if (af.getType() == Formattable::kLong) |
+ a = af.getLong(); |
+ else if (af.getType() == Formattable::kDouble) { |
+ a = af.getDouble(); |
+#if defined(OS390) || defined(OS400) |
+ // S/390 will show a failure like this: |
+ //| -3.141592652999999e-271 -format-> -3.1416E-271 |
+ //| -parse-> -3.1416e-271 |
+ //| FAIL: Expected -3.141599999999999e-271 |
+ // To compensate, we use an epsilon-based equality |
+ // test on S/390 only. We don't want to do this in |
+ // general because it's less exacting. |
+ useEpsilon = TRUE; |
+#endif |
+ } |
+ else { |
+ errln((UnicodeString)"FAIL: Non-numeric Formattable returned"); |
+ continue; |
+ } |
+ if (pos.getIndex() == s.length()) |
+ { |
+ logln((UnicodeString)" -parse-> " + a); |
+ // Use epsilon comparison as necessary |
+ if ((useEpsilon && |
+ (uprv_fabs(a - valParse[v+ival]) / a > (2*DBL_EPSILON))) || |
+ (!useEpsilon && a != valParse[v+ival])) |
+ { |
+ errln((UnicodeString)"FAIL: Expected " + valParse[v+ival]); |
+ } |
+ } |
+ else { |
+ errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); |
+ errln((UnicodeString)" should be (" + s.length() + " chars) -> " + valParse[v+ival]); |
+ } |
+ } |
+ for (v=0; v<lval_length; ++v) |
+ { |
+ UnicodeString s; |
+ (*(NumberFormat*)&fmt).format(lval[v], s); |
+ logln((UnicodeString)" " + lval[v] + "L -format-> " + s); |
+ if (s != lvalFormat[v+ilval]) |
+ errln((UnicodeString)"ERROR: Expected " + lvalFormat[v+ilval] + " Got: " + s); |
+ |
+ ParsePosition pos(0); |
+ Formattable af; |
+ fmt.parse(s, af, pos); |
+ if (af.getType() == Formattable::kLong || |
+ af.getType() == Formattable::kInt64) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ int32_t a = af.getLong(status); |
+ if (pos.getIndex() == s.length()) |
+ { |
+ logln((UnicodeString)" -parse-> " + a); |
+ if (a != lvalParse[v+ilval]) |
+ errln((UnicodeString)"FAIL: Expected " + lvalParse[v+ilval]); |
+ } |
+ else |
+ errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); |
+ } |
+ else |
+ errln((UnicodeString)"FAIL: Non-long Formattable returned for " + s |
+ + " Double: " + af.getDouble() |
+ + ", Long: " + af.getLong()); |
+ } |
+ ival += val_length; |
+ ilval += lval_length; |
+ } |
+} |
+ |
+void |
+NumberFormatTest::TestScientific2() { |
+ // jb 2552 |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormat* fmt = (DecimalFormat*)NumberFormat::createCurrencyInstance("en_US", status); |
+ if (U_SUCCESS(status)) { |
+ double num = 12.34; |
+ expect(*fmt, num, "$12.34"); |
+ fmt->setScientificNotation(TRUE); |
+ expect(*fmt, num, "$1.23E1"); |
+ fmt->setScientificNotation(FALSE); |
+ expect(*fmt, num, "$12.34"); |
+ } |
+ delete fmt; |
+} |
+ |
+void |
+NumberFormatTest::TestScientificGrouping() { |
+ // jb 2552 |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormat fmt("##0.00E0",status); |
+ if (U_SUCCESS(status)) { |
+ expect(fmt, .01234, "12.3E-3"); |
+ expect(fmt, .1234, "123E-3"); |
+ expect(fmt, 1.234, "1.23E0"); |
+ expect(fmt, 12.34, "12.3E0"); |
+ expect(fmt, 123.4, "123E0"); |
+ expect(fmt, 1234., "1.23E3"); |
+ } |
+} |
+ |
+/*static void setFromString(DigitList& dl, const char* str) { |
+ char c; |
+ UBool decimalSet = FALSE; |
+ dl.clear(); |
+ while ((c = *str++)) { |
+ if (c == '-') { |
+ dl.fIsPositive = FALSE; |
+ } else if (c == '+') { |
+ dl.fIsPositive = TRUE; |
+ } else if (c == '.') { |
+ dl.fDecimalAt = dl.fCount; |
+ decimalSet = TRUE; |
+ } else { |
+ dl.append(c); |
+ } |
+ } |
+ if (!decimalSet) { |
+ dl.fDecimalAt = dl.fCount; |
+ } |
+}*/ |
+ |
+void |
+NumberFormatTest::TestInt64() { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormat fmt("#.#E0",status); |
+ fmt.setMaximumFractionDigits(20); |
+ if (U_SUCCESS(status)) { |
+ expect(fmt, (Formattable)(int64_t)0, "0E0"); |
+ expect(fmt, (Formattable)(int64_t)-1, "-1E0"); |
+ expect(fmt, (Formattable)(int64_t)1, "1E0"); |
+ expect(fmt, (Formattable)(int64_t)2147483647, "2.147483647E9"); |
+ expect(fmt, (Formattable)((int64_t)-2147483647-1), "-2.147483648E9"); |
+ expect(fmt, (Formattable)(int64_t)U_INT64_MAX, "9.223372036854775807E18"); |
+ expect(fmt, (Formattable)(int64_t)U_INT64_MIN, "-9.223372036854775808E18"); |
+ } |
+ |
+ // also test digitlist |
+/* int64_t int64max = U_INT64_MAX; |
+ int64_t int64min = U_INT64_MIN; |
+ const char* int64maxstr = "9223372036854775807"; |
+ const char* int64minstr = "-9223372036854775808"; |
+ UnicodeString fail("fail: "); |
+ |
+ // test max int64 value |
+ DigitList dl; |
+ setFromString(dl, int64maxstr); |
+ { |
+ if (!dl.fitsIntoInt64(FALSE)) { |
+ errln(fail + int64maxstr + " didn't fit"); |
+ } |
+ int64_t int64Value = dl.getInt64(); |
+ if (int64Value != int64max) { |
+ errln(fail + int64maxstr); |
+ } |
+ dl.set(int64Value); |
+ int64Value = dl.getInt64(); |
+ if (int64Value != int64max) { |
+ errln(fail + int64maxstr); |
+ } |
+ } |
+ // test negative of max int64 value (1 shy of min int64 value) |
+ dl.fIsPositive = FALSE; |
+ { |
+ if (!dl.fitsIntoInt64(FALSE)) { |
+ errln(fail + "-" + int64maxstr + " didn't fit"); |
+ } |
+ int64_t int64Value = dl.getInt64(); |
+ if (int64Value != -int64max) { |
+ errln(fail + "-" + int64maxstr); |
+ } |
+ dl.set(int64Value); |
+ int64Value = dl.getInt64(); |
+ if (int64Value != -int64max) { |
+ errln(fail + "-" + int64maxstr); |
+ } |
+ } |
+ // test min int64 value |
+ setFromString(dl, int64minstr); |
+ { |
+ if (!dl.fitsIntoInt64(FALSE)) { |
+ errln(fail + "-" + int64minstr + " didn't fit"); |
+ } |
+ int64_t int64Value = dl.getInt64(); |
+ if (int64Value != int64min) { |
+ errln(fail + int64minstr); |
+ } |
+ dl.set(int64Value); |
+ int64Value = dl.getInt64(); |
+ if (int64Value != int64min) { |
+ errln(fail + int64minstr); |
+ } |
+ } |
+ // test negative of min int 64 value (1 more than max int64 value) |
+ dl.fIsPositive = TRUE; // won't fit |
+ { |
+ if (dl.fitsIntoInt64(FALSE)) { |
+ errln(fail + "-(" + int64minstr + ") didn't fit"); |
+ } |
+ }*/ |
+} |
+ |
+// ------------------------------------- |
+ |
+// Test the handling of quotes |
+void |
+NumberFormatTest::TestQuotes(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ UnicodeString *pat; |
+ DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), status); |
+ if (U_FAILURE(status)) { |
+ errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status)); |
+ delete sym; |
+ return; |
+ } |
+ pat = new UnicodeString("a'fo''o'b#"); |
+ DecimalFormat *fmt = new DecimalFormat(*pat, *sym, status); |
+ UnicodeString s; |
+ ((NumberFormat*)fmt)->format((int32_t)123, s); |
+ logln((UnicodeString)"Pattern \"" + *pat + "\""); |
+ logln((UnicodeString)" Format 123 -> " + escape(s)); |
+ if (!(s=="afo'ob123")) |
+ errln((UnicodeString)"FAIL: Expected afo'ob123"); |
+ |
+ s.truncate(0); |
+ delete fmt; |
+ delete pat; |
+ |
+ pat = new UnicodeString("a''b#"); |
+ fmt = new DecimalFormat(*pat, *sym, status); |
+ ((NumberFormat*)fmt)->format((int32_t)123, s); |
+ logln((UnicodeString)"Pattern \"" + *pat + "\""); |
+ logln((UnicodeString)" Format 123 -> " + escape(s)); |
+ if (!(s=="a'b123")) |
+ errln((UnicodeString)"FAIL: Expected a'b123"); |
+ delete fmt; |
+ delete pat; |
+ delete sym; |
+} |
+ |
+/** |
+ * Test the handling of the currency symbol in patterns. |
+ */ |
+void |
+NumberFormatTest::TestCurrencySign(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale::getUS(), status); |
+ UnicodeString pat; |
+ UChar currency = 0x00A4; |
+ if (U_FAILURE(status)) { |
+ errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status)); |
+ delete sym; |
+ return; |
+ } |
+ // "\xA4#,##0.00;-\xA4#,##0.00" |
+ pat.append(currency).append("#,##0.00;-"). |
+ append(currency).append("#,##0.00"); |
+ DecimalFormat *fmt = new DecimalFormat(pat, *sym, status); |
+ UnicodeString s; ((NumberFormat*)fmt)->format(1234.56, s); |
+ pat.truncate(0); |
+ logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); |
+ logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); |
+ if (s != "$1,234.56") dataerrln((UnicodeString)"FAIL: Expected $1,234.56"); |
+ s.truncate(0); |
+ ((NumberFormat*)fmt)->format(- 1234.56, s); |
+ logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); |
+ if (s != "-$1,234.56") dataerrln((UnicodeString)"FAIL: Expected -$1,234.56"); |
+ delete fmt; |
+ pat.truncate(0); |
+ // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00" |
+ pat.append(currency).append(currency). |
+ append(" #,##0.00;"). |
+ append(currency).append(currency). |
+ append(" -#,##0.00"); |
+ fmt = new DecimalFormat(pat, *sym, status); |
+ s.truncate(0); |
+ ((NumberFormat*)fmt)->format(1234.56, s); |
+ logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\""); |
+ logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s)); |
+ if (s != "USD 1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD 1,234.56"); |
+ s.truncate(0); |
+ ((NumberFormat*)fmt)->format(-1234.56, s); |
+ logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s)); |
+ if (s != "USD -1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD -1,234.56"); |
+ delete fmt; |
+ delete sym; |
+ if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + u_errorName(status)); |
+} |
+ |
+// ------------------------------------- |
+ |
+static UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); } |
+ |
+UnicodeString& |
+NumberFormatTest::escape(UnicodeString& s) |
+{ |
+ UnicodeString buf; |
+ for (int32_t i=0; i<s.length(); ++i) |
+ { |
+ UChar c = s[(int32_t)i]; |
+ if (c <= (UChar)0x7F) buf += c; |
+ else { |
+ buf += (UChar)0x5c; buf += (UChar)0x55; |
+ buf += toHexString((c & 0xF000) >> 12); |
+ buf += toHexString((c & 0x0F00) >> 8); |
+ buf += toHexString((c & 0x00F0) >> 4); |
+ buf += toHexString(c & 0x000F); |
+ } |
+ } |
+ return (s = buf); |
+} |
+ |
+ |
+// ------------------------------------- |
+static const char* testCases[][2]= { |
+ /* locale ID */ /* expected */ |
+ {"ca_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
+ {"de_LU_PREEURO", "1,150\\u00A0F" }, |
+ {"el_GR_PREEURO", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" }, |
+ {"en_BE_PREEURO", "1.150,50\\u00A0BF" }, |
+ {"es_ES_PREEURO", "\\u20A7\\u00A01.150" }, |
+ {"eu_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
+ {"gl_ES_PREEURO", "1.150\\u00A0\\u20A7" }, |
+ {"it_IT_PREEURO", "IT\\u20A4\\u00A01.150" }, |
+ {"pt_PT_PREEURO", "1,150$50\\u00A0Esc."}, |
+ {"en_US@currency=JPY", "\\u00A51,150"}, |
+ {"en_US@currency=jpy", "\\u00A51,150"}, |
+ {"en-US-u-cu-jpy", "\\u00A51,150"} |
+}; |
+/** |
+ * Test localized currency patterns. |
+ */ |
+void |
+NumberFormatTest::TestCurrency(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status); |
+ if (U_FAILURE(status)) { |
+ dataerrln("Error calling NumberFormat::createCurrencyInstance()"); |
+ return; |
+ } |
+ |
+ UnicodeString s; currencyFmt->format(1.50, s); |
+ logln((UnicodeString)"Un pauvre ici a..........." + s); |
+ if (!(s==CharsToUnicodeString("1,50\\u00A0$"))) |
+ errln((UnicodeString)"FAIL: Expected 1,50<nbsp>$"); |
+ delete currencyFmt; |
+ s.truncate(0); |
+ char loc[256]={0}; |
+ int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); |
+ currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status); |
+ currencyFmt->format(1.50, s); |
+ logln((UnicodeString)"Un pauvre en Allemagne a.." + s); |
+ if (!(s==CharsToUnicodeString("1,50\\u00A0DM"))) |
+ errln((UnicodeString)"FAIL: Expected 1,50<nbsp>DM"); |
+ delete currencyFmt; |
+ s.truncate(0); |
+ len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); |
+ currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); |
+ currencyFmt->format(1.50, s); |
+ logln((UnicodeString)"Un pauvre en France a....." + s); |
+ if (!(s==CharsToUnicodeString("1,50\\u00A0F"))) |
+ errln((UnicodeString)"FAIL: Expected 1,50<nbsp>F"); |
+ delete currencyFmt; |
+ if (U_FAILURE(status)) |
+ errln((UnicodeString)"FAIL: Status " + (int32_t)status); |
+ |
+ for(int i=0; i < (int)(sizeof(testCases)/sizeof(testCases[i])); i++){ |
+ status = U_ZERO_ERROR; |
+ const char *localeID = testCases[i][0]; |
+ UnicodeString expected(testCases[i][1], -1, US_INV); |
+ expected = expected.unescape(); |
+ s.truncate(0); |
+ char loc[256]={0}; |
+ uloc_canonicalize(localeID, loc, 256, &status); |
+ currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); |
+ if(U_FAILURE(status)){ |
+ errln("Could not create currency formatter for locale %s",localeID); |
+ continue; |
+ } |
+ currencyFmt->format(1150.50, s); |
+ if(s!=expected){ |
+ errln(UnicodeString("FAIL: Expected: ")+expected |
+ + UnicodeString(" Got: ") + s |
+ + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); |
+ } |
+ if (U_FAILURE(status)){ |
+ errln((UnicodeString)"FAIL: Status " + (int32_t)status); |
+ } |
+ delete currencyFmt; |
+ } |
+} |
+ |
+// ------------------------------------- |
+ |
+/** |
+ * Test the Currency object handling, new as of ICU 2.2. |
+ */ |
+void NumberFormatTest::TestCurrencyObject() { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ NumberFormat* fmt = |
+ NumberFormat::createCurrencyInstance(Locale::getUS(), ec); |
+ |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getCurrencyInstance(US) - %s", u_errorName(ec)); |
+ delete fmt; |
+ return; |
+ } |
+ |
+ Locale null("", "", ""); |
+ |
+ expectCurrency(*fmt, null, 1234.56, "$1,234.56"); |
+ |
+ expectCurrency(*fmt, Locale::getFrance(), |
+ 1234.56, CharsToUnicodeString("\\u20AC1,234.56")); // Euro |
+ |
+ expectCurrency(*fmt, Locale::getJapan(), |
+ 1234.56, CharsToUnicodeString("\\u00A51,235")); // Yen |
+ |
+ expectCurrency(*fmt, Locale("fr", "CH", ""), |
+ 1234.56, "CHF1,234.55"); // 0.05 rounding |
+ |
+ expectCurrency(*fmt, Locale::getUS(), |
+ 1234.56, "$1,234.56"); |
+ |
+ delete fmt; |
+ fmt = NumberFormat::createCurrencyInstance(Locale::getFrance(), ec); |
+ |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: getCurrencyInstance(FRANCE)"); |
+ delete fmt; |
+ return; |
+ } |
+ |
+ expectCurrency(*fmt, null, 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); |
+ |
+ expectCurrency(*fmt, Locale::getJapan(), |
+ 1234.56, CharsToUnicodeString("1 235 \\u00A5JP")); // Yen |
+ |
+ expectCurrency(*fmt, Locale("fr", "CH", ""), |
+ 1234.56, "1 234,55 CHF"); // 0.05 rounding |
+ |
+ expectCurrency(*fmt, Locale::getUS(), |
+ 1234.56, "1 234,56 $US"); |
+ |
+ expectCurrency(*fmt, Locale::getFrance(), |
+ 1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); // Euro |
+ |
+ delete fmt; |
+} |
+ |
+// ------------------------------------- |
+ |
+/** |
+ * Do rudimentary testing of parsing. |
+ */ |
+void |
+NumberFormatTest::TestParse(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ UnicodeString arg("0"); |
+ DecimalFormat* format = new DecimalFormat("00", status); |
+ //try { |
+ Formattable n; format->parse(arg, n, status); |
+ logln((UnicodeString)"parse(" + arg + ") = " + n.getLong()); |
+ if (n.getType() != Formattable::kLong || |
+ n.getLong() != 0) errln((UnicodeString)"FAIL: Expected 0"); |
+ delete format; |
+ if (U_FAILURE(status)) errcheckln(status, (UnicodeString)"FAIL: Status " + u_errorName(status)); |
+ //} |
+ //catch(Exception e) { |
+ // errln((UnicodeString)"Exception caught: " + e); |
+ //} |
+} |
+ |
+// ------------------------------------- |
+ |
+/** |
+ * Test proper rounding by the format method. |
+ */ |
+void |
+NumberFormatTest::TestRounding487(void) |
+{ |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *nf = NumberFormat::createInstance(status); |
+ if (U_FAILURE(status)) { |
+ dataerrln("Error calling NumberFormat::createInstance()"); |
+ return; |
+ } |
+ |
+ roundingTest(*nf, 0.00159999, 4, "0.0016"); |
+ roundingTest(*nf, 0.00995, 4, "0.01"); |
+ |
+ roundingTest(*nf, 12.3995, 3, "12.4"); |
+ |
+ roundingTest(*nf, 12.4999, 0, "12"); |
+ roundingTest(*nf, - 19.5, 0, "-20"); |
+ delete nf; |
+ if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)status); |
+} |
+ |
+/** |
+ * Test the functioning of the secondary grouping value. |
+ */ |
+void NumberFormatTest::TestSecondaryGrouping(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols ct"); |
+ |
+ DecimalFormat f("#,##,###", US, status); |
+ CHECK(status, "DecimalFormat ct"); |
+ |
+ expect2(f, (int32_t)123456789L, "12,34,56,789"); |
+ expectPat(f, "#,##,###"); |
+ f.applyPattern("#,###", status); |
+ CHECK(status, "applyPattern"); |
+ |
+ f.setSecondaryGroupingSize(4); |
+ expect2(f, (int32_t)123456789L, "12,3456,789"); |
+ expectPat(f, "#,####,###"); |
+ NumberFormat *g = NumberFormat::createInstance(Locale("hi", "IN"), status); |
+ CHECK_DATA(status, "createInstance(hi_IN)"); |
+ |
+ UnicodeString out; |
+ int32_t l = (int32_t)1876543210L; |
+ g->format(l, out); |
+ delete g; |
+ // expect "1,87,65,43,210", but with Hindi digits |
+ // 01234567890123 |
+ UBool ok = TRUE; |
+ if (out.length() != 14) { |
+ ok = FALSE; |
+ } else { |
+ for (int32_t i=0; i<out.length(); ++i) { |
+ UBool expectGroup = FALSE; |
+ switch (i) { |
+ case 1: |
+ case 4: |
+ case 7: |
+ case 10: |
+ expectGroup = TRUE; |
+ break; |
+ } |
+ // Later -- fix this to get the actual grouping |
+ // character from the resource bundle. |
+ UBool isGroup = (out.charAt(i) == 0x002C); |
+ if (isGroup != expectGroup) { |
+ ok = FALSE; |
+ break; |
+ } |
+ } |
+ } |
+ if (!ok) { |
+ errln((UnicodeString)"FAIL Expected " + l + |
+ " x hi_IN -> \"1,87,65,43,210\" (with Hindi digits), got \"" + |
+ escape(out) + "\""); |
+ } else { |
+ logln((UnicodeString)"Ok " + l + |
+ " x hi_IN -> \"" + |
+ escape(out) + "\""); |
+ } |
+} |
+ |
+void NumberFormatTest::TestWhiteSpaceParsing(void) { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), ec); |
+ DecimalFormat fmt("a b#0c ", US, ec); |
+ if (U_FAILURE(ec)) { |
+ errcheckln(ec, "FAIL: Constructor - %s", u_errorName(ec)); |
+ return; |
+ } |
+ int32_t n = 1234; |
+ expect(fmt, "a b1234c ", n); |
+ expect(fmt, "a b1234c ", n); |
+} |
+ |
+/** |
+ * Test currencies whose display name is a ChoiceFormat. |
+ */ |
+void NumberFormatTest::TestComplexCurrency() { |
+ |
+// UErrorCode ec = U_ZERO_ERROR; |
+// Locale loc("kn", "IN", ""); |
+// NumberFormat* fmt = NumberFormat::createCurrencyInstance(loc, ec); |
+// if (U_SUCCESS(ec)) { |
+// expect2(*fmt, 1.0, CharsToUnicodeString("Re.\\u00A01.00")); |
+// Use .00392625 because that's 2^-8. Any value less than 0.005 is fine. |
+// expect(*fmt, 1.00390625, CharsToUnicodeString("Re.\\u00A01.00")); // tricky |
+// expect2(*fmt, 12345678.0, CharsToUnicodeString("Rs.\\u00A01,23,45,678.00")); |
+// expect2(*fmt, 0.5, CharsToUnicodeString("Rs.\\u00A00.50")); |
+// expect2(*fmt, -1.0, CharsToUnicodeString("-Re.\\u00A01.00")); |
+// expect2(*fmt, -10.0, CharsToUnicodeString("-Rs.\\u00A010.00")); |
+// } else { |
+// errln("FAIL: getCurrencyInstance(kn_IN)"); |
+// } |
+// delete fmt; |
+ |
+} |
+ |
+// ------------------------------------- |
+ |
+void |
+NumberFormatTest::roundingTest(NumberFormat& nf, double x, int32_t maxFractionDigits, const char* expected) |
+{ |
+ nf.setMaximumFractionDigits(maxFractionDigits); |
+ UnicodeString out; nf.format(x, out); |
+ logln((UnicodeString)"" + x + " formats with " + maxFractionDigits + " fractional digits to " + out); |
+ if (!(out==expected)) errln((UnicodeString)"FAIL: Expected " + expected); |
+} |
+ |
+/** |
+ * Upgrade to alphaWorks |
+ */ |
+void NumberFormatTest::TestExponent(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ DecimalFormat fmt1(UnicodeString("0.###E0"), US, status); |
+ CHECK(status, "DecimalFormat(0.###E0)"); |
+ DecimalFormat fmt2(UnicodeString("0.###E+0"), US, status); |
+ CHECK(status, "DecimalFormat(0.###E+0)"); |
+ int32_t n = 1234; |
+ expect2(fmt1, n, "1.234E3"); |
+ expect2(fmt2, n, "1.234E+3"); |
+ expect(fmt1, "1.234E+3", n); // Either format should parse "E+3" |
+} |
+ |
+/** |
+ * Upgrade to alphaWorks |
+ */ |
+void NumberFormatTest::TestScientific(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ |
+ // Test pattern round-trip |
+ const char* PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", |
+ "0.###E0;[0.###E0]" }; |
+ int32_t PAT_length = (int32_t)(sizeof(PAT) / sizeof(PAT[0])); |
+ int32_t DIGITS[] = { |
+ // min int, max int, min frac, max frac |
+ 0, 1, 0, 0, // "#E0" |
+ 1, 1, 0, 4, // "0.####E0" |
+ 2, 2, 3, 3, // "00.000E00" |
+ 1, 3, 0, 4, // "##0.####E000" |
+ 1, 1, 0, 3, // "0.###E0;[0.###E0]" |
+ }; |
+ for (int32_t i=0; i<PAT_length; ++i) { |
+ UnicodeString pat(PAT[i]); |
+ DecimalFormat df(pat, US, status); |
+ CHECK(status, "DecimalFormat constructor"); |
+ UnicodeString pat2; |
+ df.toPattern(pat2); |
+ if (pat == pat2) { |
+ logln(UnicodeString("Ok Pattern rt \"") + |
+ pat + "\" -> \"" + |
+ pat2 + "\""); |
+ } else { |
+ errln(UnicodeString("FAIL Pattern rt \"") + |
+ pat + "\" -> \"" + |
+ pat2 + "\""); |
+ } |
+ // Make sure digit counts match what we expect |
+ if (df.getMinimumIntegerDigits() != DIGITS[4*i] || |
+ df.getMaximumIntegerDigits() != DIGITS[4*i+1] || |
+ df.getMinimumFractionDigits() != DIGITS[4*i+2] || |
+ df.getMaximumFractionDigits() != DIGITS[4*i+3]) { |
+ errln(UnicodeString("FAIL \"" + pat + |
+ "\" min/max int; min/max frac = ") + |
+ df.getMinimumIntegerDigits() + "/" + |
+ df.getMaximumIntegerDigits() + ";" + |
+ df.getMinimumFractionDigits() + "/" + |
+ df.getMaximumFractionDigits() + ", expect " + |
+ DIGITS[4*i] + "/" + |
+ DIGITS[4*i+1] + ";" + |
+ DIGITS[4*i+2] + "/" + |
+ DIGITS[4*i+3]); |
+ } |
+ } |
+ |
+ |
+ // Test the constructor for default locale. We have to |
+ // manually set the default locale, as there is no |
+ // guarantee that the default locale has the same |
+ // scientific format. |
+ Locale def = Locale::getDefault(); |
+ Locale::setDefault(Locale::getUS(), status); |
+ expect2(NumberFormat::createScientificInstance(status), |
+ 12345.678901, |
+ "1.2345678901E4", status); |
+ Locale::setDefault(def, status); |
+ |
+ expect2(new DecimalFormat("#E0", US, status), |
+ 12345.0, |
+ "1.2345E4", status); |
+ expect(new DecimalFormat("0E0", US, status), |
+ 12345.0, |
+ "1E4", status); |
+ expect2(NumberFormat::createScientificInstance(Locale::getUS(), status), |
+ 12345.678901, |
+ "1.2345678901E4", status); |
+ expect(new DecimalFormat("##0.###E0", US, status), |
+ 12345.0, |
+ "12.34E3", status); |
+ expect(new DecimalFormat("##0.###E0", US, status), |
+ 12345.00001, |
+ "12.35E3", status); |
+ expect2(new DecimalFormat("##0.####E0", US, status), |
+ (int32_t) 12345, |
+ "12.345E3", status); |
+ expect2(NumberFormat::createScientificInstance(Locale::getFrance(), status), |
+ 12345.678901, |
+ "1,2345678901E4", status); |
+ expect(new DecimalFormat("##0.####E0", US, status), |
+ 789.12345e-9, |
+ "789.12E-9", status); |
+ expect2(new DecimalFormat("##0.####E0", US, status), |
+ 780.e-9, |
+ "780E-9", status); |
+ expect(new DecimalFormat(".###E0", US, status), |
+ 45678.0, |
+ ".457E5", status); |
+ expect2(new DecimalFormat(".###E0", US, status), |
+ (int32_t) 0, |
+ ".0E0", status); |
+ /* |
+ expect(new DecimalFormat[] { new DecimalFormat("#E0", US), |
+ new DecimalFormat("##E0", US), |
+ new DecimalFormat("####E0", US), |
+ new DecimalFormat("0E0", US), |
+ new DecimalFormat("00E0", US), |
+ new DecimalFormat("000E0", US), |
+ }, |
+ new Long(45678000), |
+ new String[] { "4.5678E7", |
+ "45.678E6", |
+ "4567.8E4", |
+ "5E7", |
+ "46E6", |
+ "457E5", |
+ } |
+ ); |
+ ! |
+ ! Unroll this test into individual tests below... |
+ ! |
+ */ |
+ expect2(new DecimalFormat("#E0", US, status), |
+ (int32_t) 45678000, "4.5678E7", status); |
+ expect2(new DecimalFormat("##E0", US, status), |
+ (int32_t) 45678000, "45.678E6", status); |
+ expect2(new DecimalFormat("####E0", US, status), |
+ (int32_t) 45678000, "4567.8E4", status); |
+ expect(new DecimalFormat("0E0", US, status), |
+ (int32_t) 45678000, "5E7", status); |
+ expect(new DecimalFormat("00E0", US, status), |
+ (int32_t) 45678000, "46E6", status); |
+ expect(new DecimalFormat("000E0", US, status), |
+ (int32_t) 45678000, "457E5", status); |
+ /* |
+ expect(new DecimalFormat("###E0", US, status), |
+ new Object[] { new Double(0.0000123), "12.3E-6", |
+ new Double(0.000123), "123E-6", |
+ new Double(0.00123), "1.23E-3", |
+ new Double(0.0123), "12.3E-3", |
+ new Double(0.123), "123E-3", |
+ new Double(1.23), "1.23E0", |
+ new Double(12.3), "12.3E0", |
+ new Double(123), "123E0", |
+ new Double(1230), "1.23E3", |
+ }); |
+ ! |
+ ! Unroll this test into individual tests below... |
+ ! |
+ */ |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 0.0000123, "12.3E-6", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 0.000123, "123E-6", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 0.00123, "1.23E-3", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 0.0123, "12.3E-3", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 0.123, "123E-3", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 1.23, "1.23E0", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 12.3, "12.3E0", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 123.0, "123E0", status); |
+ expect2(new DecimalFormat("###E0", US, status), |
+ 1230.0, "1.23E3", status); |
+ /* |
+ expect(new DecimalFormat("0.#E+00", US, status), |
+ new Object[] { new Double(0.00012), "1.2E-04", |
+ new Long(12000), "1.2E+04", |
+ }); |
+ ! |
+ ! Unroll this test into individual tests below... |
+ ! |
+ */ |
+ expect2(new DecimalFormat("0.#E+00", US, status), |
+ 0.00012, "1.2E-04", status); |
+ expect2(new DecimalFormat("0.#E+00", US, status), |
+ (int32_t) 12000, "1.2E+04", status); |
+} |
+ |
+/** |
+ * Upgrade to alphaWorks |
+ */ |
+void NumberFormatTest::TestPad(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ |
+ expect2(new DecimalFormat("*^##.##", US, status), |
+ int32_t(0), "^^^^0", status); |
+ expect2(new DecimalFormat("*^##.##", US, status), |
+ -1.3, "^-1.3", status); |
+ expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), |
+ int32_t(0), "0.0E0______ g-m/s^2", status); |
+ expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), |
+ 1.0/3, "333.333E-3_ g-m/s^2", status); |
+ expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), |
+ int32_t(0), "0.0______ g-m/s^2", status); |
+ expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), |
+ 1.0/3, "0.33333__ g-m/s^2", status); |
+ |
+ // Test padding before a sign |
+ const char *formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)"; |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(-10), "xxxxxxxxxx(10.0)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(-1000),"xxxxxxx(1,000.0)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(-1000000),"xxx(1,000,000.0)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ -100.37, "xxxxxxxx(100.37)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ -10456.37, "xxxxx(10,456.37)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ -1120456.37, "xx(1,120,456.37)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ -112045600.37, "(112,045,600.37)", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ -1252045600.37,"(1,252,045,600.37)", status); |
+ |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(10), "xxxxxxxxxxxx10.0", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(1000),"xxxxxxxxx1,000.0", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ int32_t(1000000),"xxxxx1,000,000.0", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ 100.37, "xxxxxxxxxx100.37", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ 10456.37, "xxxxxxx10,456.37", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ 1120456.37, "xxxx1,120,456.37", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ 112045600.37, "xx112,045,600.37", status); |
+ expect2(new DecimalFormat(formatStr, US, status), |
+ 10252045600.37,"10,252,045,600.37", status); |
+ |
+ |
+ // Test padding between a sign and a number |
+ const char *formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)"; |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(-10), "(10.0xxxxxxxxxx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(-1000),"(1,000.0xxxxxxx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(-1000000),"(1,000,000.0xxx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ -100.37, "(100.37xxxxxxxx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ -10456.37, "(10,456.37xxxxx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ -1120456.37, "(1,120,456.37xx)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ -112045600.37, "(112,045,600.37)", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ -1252045600.37,"(1,252,045,600.37)", status); |
+ |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(10), "10.0xxxxxxxxxxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(1000),"1,000.0xxxxxxxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ int32_t(1000000),"1,000,000.0xxxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ 100.37, "100.37xxxxxxxxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ 10456.37, "10,456.37xxxxxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ 1120456.37, "1,120,456.37xxxx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ 112045600.37, "112,045,600.37xx", status); |
+ expect2(new DecimalFormat(formatStr2, US, status), |
+ 10252045600.37,"10,252,045,600.37", status); |
+ |
+ //testing the setPadCharacter(UnicodeString) and getPadCharacterString() |
+ DecimalFormat fmt("#", US, status); |
+ CHECK(status, "DecimalFormat constructor"); |
+ UnicodeString padString("P"); |
+ fmt.setPadCharacter(padString); |
+ expectPad(fmt, "*P##.##", DecimalFormat::kPadBeforePrefix, 5, padString); |
+ fmt.setPadCharacter((UnicodeString)"^"); |
+ expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, (UnicodeString)"^"); |
+ //commented untill implementation is complete |
+ /* fmt.setPadCharacter((UnicodeString)"^^^"); |
+ expectPad(fmt, "*^^^#", DecimalFormat::kPadBeforePrefix, 3, (UnicodeString)"^^^"); |
+ padString.remove(); |
+ padString.append((UChar)0x0061); |
+ padString.append((UChar)0x0302); |
+ fmt.setPadCharacter(padString); |
+ UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000}; |
+ UnicodeString pattern(patternChars); |
+ expectPad(fmt, pattern , DecimalFormat::kPadBeforePrefix, 4, padString); |
+ */ |
+ |
+} |
+ |
+/** |
+ * Upgrade to alphaWorks |
+ */ |
+void NumberFormatTest::TestPatterns2(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ |
+ DecimalFormat fmt("#", US, status); |
+ CHECK(status, "DecimalFormat constructor"); |
+ |
+ UChar hat = 0x005E; /*^*/ |
+ |
+ expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, hat); |
+ expectPad(fmt, "$*^#", DecimalFormat::kPadAfterPrefix, 2, hat); |
+ expectPad(fmt, "#*^", DecimalFormat::kPadBeforeSuffix, 1, hat); |
+ expectPad(fmt, "#$*^", DecimalFormat::kPadAfterSuffix, 2, hat); |
+ expectPad(fmt, "$*^$#", ILLEGAL); |
+ expectPad(fmt, "#$*^$", ILLEGAL); |
+ expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat::kPadBeforeSuffix, |
+ 12, (UChar)0x0078 /*x*/); |
+ expectPad(fmt, "''#0*x", DecimalFormat::kPadBeforeSuffix, |
+ 3, (UChar)0x0078 /*x*/); |
+ expectPad(fmt, "'I''ll'*a###.##", DecimalFormat::kPadAfterPrefix, |
+ 10, (UChar)0x0061 /*a*/); |
+ |
+ fmt.applyPattern("AA#,##0.00ZZ", status); |
+ CHECK(status, "applyPattern"); |
+ fmt.setPadCharacter(hat); |
+ |
+ fmt.setFormatWidth(10); |
+ |
+ fmt.setPadPosition(DecimalFormat::kPadBeforePrefix); |
+ expectPat(fmt, "*^AA#,##0.00ZZ"); |
+ |
+ fmt.setPadPosition(DecimalFormat::kPadBeforeSuffix); |
+ expectPat(fmt, "AA#,##0.00*^ZZ"); |
+ |
+ fmt.setPadPosition(DecimalFormat::kPadAfterSuffix); |
+ expectPat(fmt, "AA#,##0.00ZZ*^"); |
+ |
+ // 12 3456789012 |
+ UnicodeString exp("AA*^#,##0.00ZZ", ""); |
+ fmt.setFormatWidth(12); |
+ fmt.setPadPosition(DecimalFormat::kPadAfterPrefix); |
+ expectPat(fmt, exp); |
+ |
+ fmt.setFormatWidth(13); |
+ // 12 34567890123 |
+ expectPat(fmt, "AA*^##,##0.00ZZ"); |
+ |
+ fmt.setFormatWidth(14); |
+ // 12 345678901234 |
+ expectPat(fmt, "AA*^###,##0.00ZZ"); |
+ |
+ fmt.setFormatWidth(15); |
+ // 12 3456789012345 |
+ expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case |
+ |
+ fmt.setFormatWidth(16); |
+ // 12 34567890123456 |
+ expectPat(fmt, "AA*^#,###,##0.00ZZ"); |
+} |
+ |
+void NumberFormatTest::TestSurrogateSupport(void) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols custom(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ |
+ custom.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, "decimal"); |
+ custom.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, "plus"); |
+ custom.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, " minus "); |
+ custom.setSymbol(DecimalFormatSymbols::kExponentialSymbol, "exponent"); |
+ |
+ UnicodeString patternStr("*\\U00010000##.##", ""); |
+ patternStr = patternStr.unescape(); |
+ UnicodeString expStr("\\U00010000\\U00010000\\U00010000\\U000100000", ""); |
+ expStr = expStr.unescape(); |
+ expect2(new DecimalFormat(patternStr, custom, status), |
+ int32_t(0), expStr, status); |
+ |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat("*^##.##", custom, status), |
+ int32_t(0), "^^^^0", status); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat("##.##", custom, status), |
+ -1.3, " minus 1decimal3", status); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), |
+ int32_t(0), "0decimal0exponent0 g-m/s^2", status); |
+ status = U_ZERO_ERROR; |
+ expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), |
+ 1.0/3, "333decimal333exponent minus 3 g-m/s^2", status); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), |
+ int32_t(0), "0decimal0 g-m/s^2", status); |
+ status = U_ZERO_ERROR; |
+ expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), |
+ 1.0/3, "0decimal33333 g-m/s^2", status); |
+ |
+ UnicodeString zero((UChar32)0x10000); |
+ UnicodeString one((UChar32)0x10001); |
+ UnicodeString two((UChar32)0x10002); |
+ UnicodeString five((UChar32)0x10005); |
+ custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero); |
+ custom.setSymbol(DecimalFormatSymbols::kOneDigitSymbol, one); |
+ custom.setSymbol(DecimalFormatSymbols::kTwoDigitSymbol, two); |
+ custom.setSymbol(DecimalFormatSymbols::kFiveDigitSymbol, five); |
+ expStr = UnicodeString("\\U00010001decimal\\U00010002\\U00010005\\U00010000", ""); |
+ expStr = expStr.unescape(); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat("##0.000", custom, status), |
+ 1.25, expStr, status); |
+ |
+ custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, (UChar)0x30); |
+ custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "units of money"); |
+ custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, "money separator"); |
+ patternStr = UNICODE_STRING_SIMPLE("0.00 \\u00A4' in your bank account'"); |
+ patternStr = patternStr.unescape(); |
+ expStr = UnicodeString(" minus 20money separator00 units of money in your bank account", ""); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat(patternStr, custom, status), |
+ int32_t(-20), expStr, status); |
+ |
+ custom.setSymbol(DecimalFormatSymbols::kPercentSymbol, "percent"); |
+ patternStr = "'You''ve lost ' -0.00 %' of your money today'"; |
+ patternStr = patternStr.unescape(); |
+ expStr = UnicodeString(" minus You've lost minus 2000decimal00 percent of your money today", ""); |
+ status = U_ZERO_ERROR; |
+ expect2(new DecimalFormat(patternStr, custom, status), |
+ int32_t(-20), expStr, status); |
+} |
+ |
+void NumberFormatTest::TestCurrencyPatterns(void) { |
+ int32_t i, locCount; |
+ const Locale* locs = NumberFormat::getAvailableLocales(locCount); |
+ for (i=0; i<locCount; ++i) { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ NumberFormat* nf = NumberFormat::createCurrencyInstance(locs[i], ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Can't create NumberFormat(%s) - %s", locs[i].getName(), u_errorName(ec)); |
+ } else { |
+ // Make sure currency formats do not have a variable number |
+ // of fraction digits |
+ int32_t min = nf->getMinimumFractionDigits(); |
+ int32_t max = nf->getMaximumFractionDigits(); |
+ if (min != max) { |
+ UnicodeString a, b; |
+ nf->format(1.0, a); |
+ nf->format(1.125, b); |
+ errln((UnicodeString)"FAIL: " + locs[i].getName() + |
+ " min fraction digits != max fraction digits; " |
+ "x 1.0 => " + escape(a) + |
+ "; x 1.125 => " + escape(b)); |
+ } |
+ |
+ // Make sure EURO currency formats have exactly 2 fraction digits |
+ DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf); |
+ if (df != NULL) { |
+ if (u_strcmp(EUR, df->getCurrency()) == 0) { |
+ if (min != 2 || max != 2) { |
+ UnicodeString a; |
+ nf->format(1.0, a); |
+ errln((UnicodeString)"FAIL: " + locs[i].getName() + |
+ " is a EURO format but it does not have 2 fraction digits; " |
+ "x 1.0 => " + |
+ escape(a)); |
+ } |
+ } |
+ } |
+ } |
+ delete nf; |
+ } |
+} |
+ |
+void NumberFormatTest::TestRegCurrency(void) { |
+#if !UCONFIG_NO_SERVICE |
+ UErrorCode status = U_ZERO_ERROR; |
+ UChar USD[4]; |
+ ucurr_forLocale("en_US", USD, 4, &status); |
+ UChar YEN[4]; |
+ ucurr_forLocale("ja_JP", YEN, 4, &status); |
+ UChar TMP[4]; |
+ static const UChar QQQ[] = {0x51, 0x51, 0x51, 0}; |
+ if(U_FAILURE(status)) { |
+ errcheckln(status, "Unable to get currency for locale, error %s", u_errorName(status)); |
+ return; |
+ } |
+ |
+ UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status); |
+ UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status); |
+ |
+ ucurr_forLocale("en_US", TMP, 4, &status); |
+ if (u_strcmp(YEN, TMP) != 0) { |
+ errln("FAIL: didn't return YEN registered for en_US"); |
+ } |
+ |
+ ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
+ if (u_strcmp(QQQ, TMP) != 0) { |
+ errln("FAIL: didn't return QQQ for en_US_EURO"); |
+ } |
+ |
+ int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status); |
+ if (fallbackLen) { |
+ errln("FAIL: tried to fallback en_XX_BAR"); |
+ } |
+ status = U_ZERO_ERROR; // reset |
+ |
+ if (!ucurr_unregister(enkey, &status)) { |
+ errln("FAIL: couldn't unregister enkey"); |
+ } |
+ |
+ ucurr_forLocale("en_US", TMP, 4, &status); |
+ if (u_strcmp(USD, TMP) != 0) { |
+ errln("FAIL: didn't return USD for en_US after unregister of en_US"); |
+ } |
+ status = U_ZERO_ERROR; // reset |
+ |
+ ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
+ if (u_strcmp(QQQ, TMP) != 0) { |
+ errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US"); |
+ } |
+ |
+ ucurr_forLocale("en_US_BLAH", TMP, 4, &status); |
+ if (u_strcmp(USD, TMP) != 0) { |
+ errln("FAIL: could not find USD for en_US_BLAH after unregister of en"); |
+ } |
+ status = U_ZERO_ERROR; // reset |
+ |
+ if (!ucurr_unregister(enUSEUROkey, &status)) { |
+ errln("FAIL: couldn't unregister enUSEUROkey"); |
+ } |
+ |
+ ucurr_forLocale("en_US_EURO", TMP, 4, &status); |
+ if (u_strcmp(EUR, TMP) != 0) { |
+ errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_EURO"); |
+ } |
+ status = U_ZERO_ERROR; // reset |
+#endif |
+} |
+ |
+void NumberFormatTest::TestCurrencyNames(void) { |
+ // Do a basic check of getName() |
+ // USD { "US$", "US Dollar" } // 04/04/1792- |
+ UErrorCode ec = U_ZERO_ERROR; |
+ static const UChar USD[] = {0x55, 0x53, 0x44, 0}; /*USD*/ |
+ static const UChar USX[] = {0x55, 0x53, 0x58, 0}; /*USX*/ |
+ static const UChar CAD[] = {0x43, 0x41, 0x44, 0}; /*CAD*/ |
+ static const UChar ITL[] = {0x49, 0x54, 0x4C, 0}; /*ITL*/ |
+ UBool isChoiceFormat; |
+ int32_t len; |
+ const UBool possibleDataError = TRUE; |
+ // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK |
+ // THE LOCALE DATA before diving into the code. |
+ assertEquals("USD.getName(SYMBOL_NAME)", |
+ UnicodeString("$"), |
+ UnicodeString(ucurr_getName(USD, "en", |
+ UCURR_SYMBOL_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("USD.getName(LONG_NAME)", |
+ UnicodeString("US Dollar"), |
+ UnicodeString(ucurr_getName(USD, "en", |
+ UCURR_LONG_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("CAD.getName(SYMBOL_NAME)", |
+ UnicodeString("CA$"), |
+ UnicodeString(ucurr_getName(CAD, "en", |
+ UCURR_SYMBOL_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("CAD.getName(SYMBOL_NAME)", |
+ UnicodeString("$"), |
+ UnicodeString(ucurr_getName(CAD, "en_CA", |
+ UCURR_SYMBOL_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("USD.getName(SYMBOL_NAME)", |
+ UnicodeString("US$"), |
+ UnicodeString(ucurr_getName(USD, "en_AU", |
+ UCURR_SYMBOL_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("CAD.getName(SYMBOL_NAME)", |
+ UnicodeString("CA$"), |
+ UnicodeString(ucurr_getName(CAD, "en_AU", |
+ UCURR_SYMBOL_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertEquals("USX.getName(LONG_NAME)", |
+ UnicodeString("USX"), |
+ UnicodeString(ucurr_getName(USX, "en_US", |
+ UCURR_LONG_NAME, |
+ &isChoiceFormat, &len, &ec)), |
+ possibleDataError); |
+ assertSuccess("ucurr_getName", ec); |
+ |
+ ec = U_ZERO_ERROR; |
+ |
+ // Test that a default or fallback warning is being returned. JB 4239. |
+ ucurr_getName(CAD, "es_ES", UCURR_LONG_NAME, &isChoiceFormat, |
+ &len, &ec); |
+ assertTrue("ucurr_getName (es_ES fallback)", |
+ U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); |
+ |
+ ucurr_getName(CAD, "zh_TW", UCURR_LONG_NAME, &isChoiceFormat, |
+ &len, &ec); |
+ assertTrue("ucurr_getName (zh_TW fallback)", |
+ U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError); |
+ |
+ ucurr_getName(CAD, "en_US", UCURR_LONG_NAME, &isChoiceFormat, |
+ &len, &ec); |
+ assertTrue("ucurr_getName (en_US default)", |
+ U_USING_DEFAULT_WARNING == ec || U_USING_FALLBACK_WARNING == ec, TRUE); |
+ |
+ ucurr_getName(CAD, "vi", UCURR_LONG_NAME, &isChoiceFormat, |
+ &len, &ec); |
+ assertTrue("ucurr_getName (vi default)", |
+ U_USING_DEFAULT_WARNING == ec, TRUE); |
+ |
+ // Test that a default warning is being returned when falling back to root. JB 4536. |
+ ucurr_getName(ITL, "cy", UCURR_LONG_NAME, &isChoiceFormat, |
+ &len, &ec); |
+ assertTrue("ucurr_getName (cy default to root)", |
+ U_USING_DEFAULT_WARNING == ec, TRUE); |
+ |
+ // TODO add more tests later |
+} |
+ |
+void NumberFormatTest::TestCurrencyUnit(void){ |
+ UErrorCode ec = U_ZERO_ERROR; |
+ static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ |
+ CurrencyUnit cu(USD, ec); |
+ assertSuccess("CurrencyUnit", ec); |
+ |
+ const UChar * r = cu.getISOCurrency(); // who is the buffer owner ? |
+ assertEquals("getISOCurrency()", USD, r); |
+ |
+ CurrencyUnit cu2(cu); |
+ if (!(cu2 == cu)){ |
+ errln("CurrencyUnit copy constructed object should be same"); |
+ } |
+ |
+ CurrencyUnit * cu3 = (CurrencyUnit *)cu.clone(); |
+ if (!(*cu3 == cu)){ |
+ errln("CurrencyUnit cloned object should be same"); |
+ } |
+ delete cu3; |
+} |
+ |
+void NumberFormatTest::TestCurrencyAmount(void){ |
+ UErrorCode ec = U_ZERO_ERROR; |
+ static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ |
+ CurrencyAmount ca(9, USD, ec); |
+ assertSuccess("CurrencyAmount", ec); |
+ |
+ CurrencyAmount ca2(ca); |
+ if (!(ca2 == ca)){ |
+ errln("CurrencyAmount copy constructed object should be same"); |
+ } |
+ |
+ ca2=ca; |
+ if (!(ca2 == ca)){ |
+ errln("CurrencyAmount assigned object should be same"); |
+ } |
+ |
+ CurrencyAmount *ca3 = (CurrencyAmount *)ca.clone(); |
+ if (!(*ca3 == ca)){ |
+ errln("CurrencyAmount cloned object should be same"); |
+ } |
+ delete ca3; |
+} |
+ |
+void NumberFormatTest::TestSymbolsWithBadLocale(void) { |
+ Locale locDefault; |
+ Locale locBad("x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_VARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME"); |
+ UErrorCode status = U_ZERO_ERROR; |
+ UnicodeString intlCurrencySymbol((UChar)0xa4); |
+ |
+ intlCurrencySymbol.append((UChar)0xa4); |
+ |
+ logln("Current locale is %s", Locale::getDefault().getName()); |
+ Locale::setDefault(locBad, status); |
+ logln("Current locale is %s", Locale::getDefault().getName()); |
+ DecimalFormatSymbols mySymbols(status); |
+ if (status != U_USING_FALLBACK_WARNING) { |
+ errln("DecimalFormatSymbols should returned U_USING_FALLBACK_WARNING."); |
+ } |
+ if (strcmp(mySymbols.getLocale().getName(), locBad.getName()) != 0) { |
+ errln("DecimalFormatSymbols does not have the right locale."); |
+ } |
+ int symbolEnum = (int)DecimalFormatSymbols::kDecimalSeparatorSymbol; |
+ for (; symbolEnum < (int)DecimalFormatSymbols::kFormatSymbolCount; symbolEnum++) { |
+ logln(UnicodeString("DecimalFormatSymbols[") + symbolEnum + UnicodeString("] = ") |
+ + prettify(mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum))); |
+ |
+ if (mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum).length() == 0 |
+ && symbolEnum != (int)DecimalFormatSymbols::kGroupingSeparatorSymbol |
+ && symbolEnum != (int)DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol) |
+ { |
+ errln("DecimalFormatSymbols has an empty string at index %d.", symbolEnum); |
+ } |
+ } |
+ status = U_ZERO_ERROR; |
+ Locale::setDefault(locDefault, status); |
+ logln("Current locale is %s", Locale::getDefault().getName()); |
+} |
+ |
+/** |
+ * Check that adoptDecimalFormatSymbols and setDecimalFormatSymbols |
+ * behave the same, except for memory ownership semantics. (No |
+ * version of this test on Java, since Java has only one method.) |
+ */ |
+void NumberFormatTest::TestAdoptDecimalFormatSymbols(void) { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
+ if (U_FAILURE(ec)) { |
+ errcheckln(ec, "Fail: DecimalFormatSymbols constructor - %s", u_errorName(ec)); |
+ delete sym; |
+ return; |
+ } |
+ UnicodeString pat(" #,##0.00"); |
+ pat.insert(0, (UChar)0x00A4); |
+ DecimalFormat fmt(pat, sym, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("Fail: DecimalFormat constructor"); |
+ return; |
+ } |
+ |
+ UnicodeString str; |
+ fmt.format(2350.75, str); |
+ if (str == "$ 2,350.75") { |
+ logln(str); |
+ } else { |
+ dataerrln("Fail: " + str + ", expected $ 2,350.75"); |
+ } |
+ |
+ sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
+ if (U_FAILURE(ec)) { |
+ errln("Fail: DecimalFormatSymbols constructor"); |
+ delete sym; |
+ return; |
+ } |
+ sym->setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); |
+ fmt.adoptDecimalFormatSymbols(sym); |
+ |
+ str.truncate(0); |
+ fmt.format(2350.75, str); |
+ if (str == "Q 2,350.75") { |
+ logln(str); |
+ } else { |
+ dataerrln("Fail: adoptDecimalFormatSymbols -> " + str + ", expected Q 2,350.75"); |
+ } |
+ |
+ sym = new DecimalFormatSymbols(Locale::getUS(), ec); |
+ if (U_FAILURE(ec)) { |
+ errln("Fail: DecimalFormatSymbols constructor"); |
+ delete sym; |
+ return; |
+ } |
+ DecimalFormat fmt2(pat, sym, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("Fail: DecimalFormat constructor"); |
+ return; |
+ } |
+ |
+ DecimalFormatSymbols sym2(Locale::getUS(), ec); |
+ if (U_FAILURE(ec)) { |
+ errln("Fail: DecimalFormatSymbols constructor"); |
+ return; |
+ } |
+ sym2.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q"); |
+ fmt2.setDecimalFormatSymbols(sym2); |
+ |
+ str.truncate(0); |
+ fmt2.format(2350.75, str); |
+ if (str == "Q 2,350.75") { |
+ logln(str); |
+ } else { |
+ dataerrln("Fail: setDecimalFormatSymbols -> " + str + ", expected Q 2,350.75"); |
+ } |
+} |
+ |
+void NumberFormatTest::TestPerMill() { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ UnicodeString str; |
+ DecimalFormat fmt(ctou("###.###\\u2030"), ec); |
+ if (!assertSuccess("DecimalFormat ct", ec)) return; |
+ assertEquals("0.4857 x ###.###\\u2030", |
+ ctou("485.7\\u2030"), fmt.format(0.4857, str)); |
+ |
+ DecimalFormatSymbols sym(Locale::getUS(), ec); |
+ sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, ctou("m")); |
+ DecimalFormat fmt2("", sym, ec); |
+ fmt2.applyLocalizedPattern("###.###m", ec); |
+ if (!assertSuccess("setup", ec)) return; |
+ str.truncate(0); |
+ assertEquals("0.4857 x ###.###m", |
+ "485.7m", fmt2.format(0.4857, str)); |
+} |
+ |
+/** |
+ * Generic test for patterns that should be legal/illegal. |
+ */ |
+void NumberFormatTest::TestIllegalPatterns() { |
+ // Test cases: |
+ // Prefix with "-:" for illegal patterns |
+ // Prefix with "+:" for legal patterns |
+ const char* DATA[] = { |
+ // Unquoted special characters in the suffix are illegal |
+ "-:000.000|###", |
+ "+:000.000'|###'", |
+ 0 |
+ }; |
+ for (int32_t i=0; DATA[i]; ++i) { |
+ const char* pat=DATA[i]; |
+ UBool valid = (*pat) == '+'; |
+ pat += 2; |
+ UErrorCode ec = U_ZERO_ERROR; |
+ DecimalFormat fmt(pat, ec); // locale doesn't matter here |
+ if (U_SUCCESS(ec) == valid) { |
+ logln("Ok: pattern \"%s\": %s", |
+ pat, u_errorName(ec)); |
+ } else { |
+ errcheckln(ec, "FAIL: pattern \"%s\" should have %s; got %s", |
+ pat, (valid?"succeeded":"failed"), |
+ u_errorName(ec)); |
+ } |
+ } |
+} |
+ |
+//---------------------------------------------------------------------- |
+ |
+static const char* KEYWORDS[] = { |
+ /*0*/ "ref=", // <reference pattern to parse numbers> |
+ /*1*/ "loc=", // <locale for formats> |
+ /*2*/ "f:", // <pattern or '-'> <number> <exp. string> |
+ /*3*/ "fp:", // <pattern or '-'> <number> <exp. string> <exp. number> |
+ /*4*/ "rt:", // <pattern or '-'> <(exp.) number> <(exp.) string> |
+ /*5*/ "p:", // <pattern or '-'> <string> <exp. number> |
+ /*6*/ "perr:", // <pattern or '-'> <invalid string> |
+ /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'> |
+ /*8*/ "fpc:", // <pattern or '-'> <curr.amt> <exp. string> <exp. curr.amt> |
+ 0 |
+}; |
+ |
+/** |
+ * Return an integer representing the next token from this |
+ * iterator. The integer will be an index into the given list, or |
+ * -1 if there are no more tokens, or -2 if the token is not on |
+ * the list. |
+ */ |
+static int32_t keywordIndex(const UnicodeString& tok) { |
+ for (int32_t i=0; KEYWORDS[i]!=0; ++i) { |
+ if (tok==KEYWORDS[i]) { |
+ return i; |
+ } |
+ } |
+ return -1; |
+} |
+ |
+/** |
+ * Parse a CurrencyAmount using the given NumberFormat, with |
+ * the 'delim' character separating the number and the currency. |
+ */ |
+static void parseCurrencyAmount(const UnicodeString& str, |
+ const NumberFormat& fmt, |
+ UChar delim, |
+ Formattable& result, |
+ UErrorCode& ec) { |
+ UnicodeString num, cur; |
+ int32_t i = str.indexOf(delim); |
+ str.extractBetween(0, i, num); |
+ str.extractBetween(i+1, INT32_MAX, cur); |
+ Formattable n; |
+ fmt.parse(num, n, ec); |
+ result.adoptObject(new CurrencyAmount(n, cur.getTerminatedBuffer(), ec)); |
+} |
+ |
+void NumberFormatTest::TestCases() { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ TextFile reader("NumberFormatTestCases.txt", "UTF8", ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("Couldn't open NumberFormatTestCases.txt"); |
+ return; |
+ } |
+ TokenIterator tokens(&reader); |
+ |
+ Locale loc("en", "US", ""); |
+ DecimalFormat *ref = 0, *fmt = 0; |
+ MeasureFormat *mfmt = 0; |
+ UnicodeString pat, tok, mloc, str, out, where, currAmt; |
+ Formattable n; |
+ |
+ for (;;) { |
+ ec = U_ZERO_ERROR; |
+ if (!tokens.next(tok, ec)) { |
+ break; |
+ } |
+ where = UnicodeString("(") + tokens.getLineNumber() + ") "; |
+ int32_t cmd = keywordIndex(tok); |
+ switch (cmd) { |
+ case 0: |
+ // ref= <reference pattern> |
+ if (!tokens.next(tok, ec)) goto error; |
+ delete ref; |
+ ref = new DecimalFormat(tok, |
+ new DecimalFormatSymbols(Locale::getUS(), ec), ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("Error constructing DecimalFormat"); |
+ goto error; |
+ } |
+ break; |
+ case 1: |
+ // loc= <locale> |
+ if (!tokens.next(tok, ec)) goto error; |
+ loc = Locale::createFromName(CharString().appendInvariantChars(tok, ec).data()); |
+ break; |
+ case 2: // f: |
+ case 3: // fp: |
+ case 4: // rt: |
+ case 5: // p: |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (tok != "-") { |
+ pat = tok; |
+ delete fmt; |
+ fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc, ec), ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: " + where + "Pattern \"" + pat + "\": " + u_errorName(ec)); |
+ ec = U_ZERO_ERROR; |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (cmd == 3) { |
+ if (!tokens.next(tok, ec)) goto error; |
+ } |
+ continue; |
+ } |
+ } |
+ if (cmd == 2 || cmd == 3 || cmd == 4) { |
+ // f: <pattern or '-'> <number> <exp. string> |
+ // fp: <pattern or '-'> <number> <exp. string> <exp. number> |
+ // rt: <pattern or '-'> <number> <string> |
+ UnicodeString num; |
+ if (!tokens.next(num, ec)) goto error; |
+ if (!tokens.next(str, ec)) goto error; |
+ ref->parse(num, n, ec); |
+ assertSuccess("parse", ec); |
+ assertEquals(where + "\"" + pat + "\".format(" + num + ")", |
+ str, fmt->format(n, out.remove(), ec)); |
+ assertSuccess("format", ec); |
+ if (cmd == 3) { // fp: |
+ if (!tokens.next(num, ec)) goto error; |
+ ref->parse(num, n, ec); |
+ assertSuccess("parse", ec); |
+ } |
+ if (cmd != 2) { // != f: |
+ Formattable m; |
+ fmt->parse(str, m, ec); |
+ assertSuccess("parse", ec); |
+ assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", |
+ n, m); |
+ } |
+ } |
+ // p: <pattern or '-'> <string to parse> <exp. number> |
+ else { |
+ UnicodeString expstr; |
+ if (!tokens.next(str, ec)) goto error; |
+ if (!tokens.next(expstr, ec)) goto error; |
+ Formattable exp, n; |
+ ref->parse(expstr, exp, ec); |
+ assertSuccess("parse", ec); |
+ fmt->parse(str, n, ec); |
+ assertSuccess("parse", ec); |
+ assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", |
+ exp, n); |
+ } |
+ break; |
+ case 8: // fpc: |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (tok != "-") { |
+ mloc = tok; |
+ delete mfmt; |
+ mfmt = MeasureFormat::createCurrencyFormat( |
+ Locale::createFromName( |
+ CharString().appendInvariantChars(mloc, ec).data()), ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: " + where + "Loc \"" + mloc + "\": " + u_errorName(ec)); |
+ ec = U_ZERO_ERROR; |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (!tokens.next(tok, ec)) goto error; |
+ if (!tokens.next(tok, ec)) goto error; |
+ continue; |
+ } |
+ } |
+ // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> |
+ if (!tokens.next(currAmt, ec)) goto error; |
+ if (!tokens.next(str, ec)) goto error; |
+ parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); |
+ if (assertSuccess("parseCurrencyAmount", ec)) { |
+ assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")", |
+ str, mfmt->format(n, out.remove(), ec)); |
+ assertSuccess("format", ec); |
+ } |
+ if (!tokens.next(currAmt, ec)) goto error; |
+ parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); |
+ if (assertSuccess("parseCurrencyAmount", ec)) { |
+ Formattable m; |
+ |
+ mfmt->parseObject(str, m, ec); |
+ if (assertSuccess("parseCurrency", ec)) { |
+ assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", |
+ n, m); |
+ } else { |
+ errln("FAIL: source " + str); |
+ } |
+ } |
+ break; |
+ case 6: |
+ // perr: <pattern or '-'> <invalid string> |
+ errln("FAIL: Under construction"); |
+ goto done; |
+ case 7: { |
+ // pat: <pattern> <exp. toPattern, or '-' or 'err'> |
+ UnicodeString testpat; |
+ UnicodeString exppat; |
+ if (!tokens.next(testpat, ec)) goto error; |
+ if (!tokens.next(exppat, ec)) goto error; |
+ UBool err = exppat == "err"; |
+ UBool existingPat = FALSE; |
+ if (testpat == "-") { |
+ if (err) { |
+ errln("FAIL: " + where + "Invalid command \"pat: - err\""); |
+ continue; |
+ } |
+ existingPat = TRUE; |
+ testpat = pat; |
+ } |
+ if (exppat == "-") exppat = testpat; |
+ DecimalFormat* f = 0; |
+ UErrorCode ec2 = U_ZERO_ERROR; |
+ if (existingPat) { |
+ f = fmt; |
+ } else { |
+ f = new DecimalFormat(testpat, ec2); |
+ } |
+ if (U_SUCCESS(ec2)) { |
+ if (err) { |
+ errln("FAIL: " + where + "Invalid pattern \"" + testpat + |
+ "\" was accepted"); |
+ } else { |
+ UnicodeString pat2; |
+ assertEquals(where + "\"" + testpat + "\".toPattern()", |
+ exppat, f->toPattern(pat2)); |
+ } |
+ } else { |
+ if (err) { |
+ logln("Ok: " + where + "Invalid pattern \"" + testpat + |
+ "\" failed: " + u_errorName(ec2)); |
+ } else { |
+ errln("FAIL: " + where + "Valid pattern \"" + testpat + |
+ "\" failed: " + u_errorName(ec2)); |
+ } |
+ } |
+ if (!existingPat) delete f; |
+ } break; |
+ case -1: |
+ errln("FAIL: " + where + "Unknown command \"" + tok + "\""); |
+ goto done; |
+ } |
+ } |
+ goto done; |
+ |
+ error: |
+ if (U_SUCCESS(ec)) { |
+ errln("FAIL: Unexpected EOF"); |
+ } else { |
+ errcheckln(ec, "FAIL: " + where + "Unexpected " + u_errorName(ec)); |
+ } |
+ |
+ done: |
+ delete mfmt; |
+ delete fmt; |
+ delete ref; |
+} |
+ |
+ |
+//---------------------------------------------------------------------- |
+// Support methods |
+//---------------------------------------------------------------------- |
+ |
+UBool NumberFormatTest::equalValue(const Formattable& a, const Formattable& b) { |
+ if (a.getType() == b.getType()) { |
+ return a == b; |
+ } |
+ |
+ if (a.getType() == Formattable::kLong) { |
+ if (b.getType() == Formattable::kInt64) { |
+ return a.getLong() == b.getLong(); |
+ } else if (b.getType() == Formattable::kDouble) { |
+ return (double) a.getLong() == b.getDouble(); // TODO check use of double instead of long |
+ } |
+ } else if (a.getType() == Formattable::kDouble) { |
+ if (b.getType() == Formattable::kLong) { |
+ return a.getDouble() == (double) b.getLong(); |
+ } else if (b.getType() == Formattable::kInt64) { |
+ return a.getDouble() == (double)b.getInt64(); |
+ } |
+ } else if (a.getType() == Formattable::kInt64) { |
+ if (b.getType() == Formattable::kLong) { |
+ return a.getInt64() == (int64_t)b.getLong(); |
+ } else if (b.getType() == Formattable::kDouble) { |
+ return a.getInt64() == (int64_t)b.getDouble(); |
+ } |
+ } |
+ return FALSE; |
+} |
+ |
+void NumberFormatTest::expect3(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) { |
+ // Don't round-trip format test, since we explicitly do it |
+ expect_rbnf(fmt, n, str, FALSE); |
+ expect_rbnf(fmt, str, n); |
+} |
+ |
+void NumberFormatTest::expect2(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) { |
+ // Don't round-trip format test, since we explicitly do it |
+ expect(fmt, n, str, FALSE); |
+ expect(fmt, str, n); |
+} |
+ |
+void NumberFormatTest::expect2(NumberFormat* fmt, const Formattable& n, |
+ const UnicodeString& exp, |
+ UErrorCode status) { |
+ if (fmt == NULL || U_FAILURE(status)) { |
+ dataerrln("FAIL: NumberFormat constructor"); |
+ } else { |
+ expect2(*fmt, n, exp); |
+ } |
+ delete fmt; |
+} |
+ |
+void NumberFormatTest::expect(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable num; |
+ fmt.parse(str, num, status); |
+ if (U_FAILURE(status)) { |
+ dataerrln(UnicodeString("FAIL: Parse failed for \"") + str + "\" - " + u_errorName(status)); |
+ return; |
+ } |
+ UnicodeString pat; |
+ ((DecimalFormat*) &fmt)->toPattern(pat); |
+ if (equalValue(num, n)) { |
+ logln(UnicodeString("Ok \"") + str + "\" x " + |
+ pat + " = " + |
+ toString(num)); |
+ } else { |
+ dataerrln(UnicodeString("FAIL \"") + str + "\" x " + |
+ pat + " = " + |
+ toString(num) + ", expected " + toString(n)); |
+ } |
+} |
+ |
+void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable num; |
+ fmt.parse(str, num, status); |
+ if (U_FAILURE(status)) { |
+ errln(UnicodeString("FAIL: Parse failed for \"") + str + "\""); |
+ return; |
+ } |
+ if (equalValue(num, n)) { |
+ logln(UnicodeString("Ok \"") + str + " = " + |
+ toString(num)); |
+ } else { |
+ errln(UnicodeString("FAIL \"") + str + " = " + |
+ toString(num) + ", expected " + toString(n)); |
+ } |
+} |
+ |
+void NumberFormatTest::expect_rbnf(NumberFormat& fmt, const Formattable& n, |
+ const UnicodeString& exp, UBool rt) { |
+ UnicodeString saw; |
+ FieldPosition pos; |
+ UErrorCode status = U_ZERO_ERROR; |
+ fmt.format(n, saw, pos, status); |
+ CHECK(status, "NumberFormat::format"); |
+ if (saw == exp) { |
+ logln(UnicodeString("Ok ") + toString(n) + |
+ " = \"" + |
+ escape(saw) + "\""); |
+ // We should be able to round-trip the formatted string => |
+ // number => string (but not the other way around: number |
+ // => string => number2, might have number2 != number): |
+ if (rt) { |
+ Formattable n2; |
+ fmt.parse(exp, n2, status); |
+ if (U_FAILURE(status)) { |
+ errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\""); |
+ return; |
+ } |
+ UnicodeString saw2; |
+ fmt.format(n2, saw2, pos, status); |
+ CHECK(status, "NumberFormat::format"); |
+ if (saw2 != exp) { |
+ errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + |
+ " => \"" + saw2 + "\""); |
+ } |
+ } |
+ } else { |
+ errln(UnicodeString("FAIL ") + toString(n) + |
+ " = \"" + |
+ escape(saw) + "\", expected \"" + exp + "\""); |
+ } |
+} |
+ |
+void NumberFormatTest::expect(NumberFormat& fmt, const Formattable& n, |
+ const UnicodeString& exp, UBool rt) { |
+ UnicodeString saw; |
+ FieldPosition pos; |
+ UErrorCode status = U_ZERO_ERROR; |
+ fmt.format(n, saw, pos, status); |
+ CHECK(status, "NumberFormat::format"); |
+ UnicodeString pat; |
+ ((DecimalFormat*) &fmt)->toPattern(pat); |
+ if (saw == exp) { |
+ logln(UnicodeString("Ok ") + toString(n) + " x " + |
+ escape(pat) + " = \"" + |
+ escape(saw) + "\""); |
+ // We should be able to round-trip the formatted string => |
+ // number => string (but not the other way around: number |
+ // => string => number2, might have number2 != number): |
+ if (rt) { |
+ Formattable n2; |
+ fmt.parse(exp, n2, status); |
+ if (U_FAILURE(status)) { |
+ errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\" - " + u_errorName(status)); |
+ return; |
+ } |
+ UnicodeString saw2; |
+ fmt.format(n2, saw2, pos, status); |
+ CHECK(status, "NumberFormat::format"); |
+ if (saw2 != exp) { |
+ errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) + |
+ " => \"" + saw2 + "\""); |
+ } |
+ } |
+ } else { |
+ dataerrln(UnicodeString("FAIL ") + toString(n) + " x " + |
+ escape(pat) + " = \"" + |
+ escape(saw) + "\", expected \"" + exp + "\""); |
+ } |
+} |
+ |
+void NumberFormatTest::expect(NumberFormat* fmt, const Formattable& n, |
+ const UnicodeString& exp, |
+ UErrorCode status) { |
+ if (fmt == NULL || U_FAILURE(status)) { |
+ dataerrln("FAIL: NumberFormat constructor"); |
+ } else { |
+ expect(*fmt, n, exp); |
+ } |
+ delete fmt; |
+} |
+ |
+void NumberFormatTest::expectCurrency(NumberFormat& nf, const Locale& locale, |
+ double value, const UnicodeString& string) { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ DecimalFormat& fmt = * (DecimalFormat*) &nf; |
+ const UChar DEFAULT_CURR[] = {45/*-*/,0}; |
+ UChar curr[4]; |
+ u_strcpy(curr, DEFAULT_CURR); |
+ if (*locale.getLanguage() != 0) { |
+ ucurr_forLocale(locale.getName(), curr, 4, &ec); |
+ assertSuccess("ucurr_forLocale", ec); |
+ fmt.setCurrency(curr, ec); |
+ assertSuccess("DecimalFormat::setCurrency", ec); |
+ fmt.setCurrency(curr); //Deprecated variant, for coverage only |
+ } |
+ UnicodeString s; |
+ fmt.format(value, s); |
+ s.findAndReplace((UChar32)0x00A0, (UChar32)0x0020); |
+ |
+ // Default display of the number yields "1234.5599999999999" |
+ // instead of "1234.56". Use a formatter to fix this. |
+ NumberFormat* f = |
+ NumberFormat::createInstance(Locale::getUS(), ec); |
+ UnicodeString v; |
+ if (U_FAILURE(ec)) { |
+ // Oops; bad formatter. Use default op+= display. |
+ v = (UnicodeString)"" + value; |
+ } else { |
+ f->setMaximumFractionDigits(4); |
+ f->setGroupingUsed(FALSE); |
+ f->format(value, v); |
+ } |
+ delete f; |
+ |
+ if (s == string) { |
+ logln((UnicodeString)"Ok: " + v + " x " + curr + " => " + prettify(s)); |
+ } else { |
+ errln((UnicodeString)"FAIL: " + v + " x " + curr + " => " + prettify(s) + |
+ ", expected " + prettify(string)); |
+ } |
+} |
+ |
+void NumberFormatTest::expectPat(DecimalFormat& fmt, const UnicodeString& exp) { |
+ UnicodeString pat; |
+ fmt.toPattern(pat); |
+ if (pat == exp) { |
+ logln(UnicodeString("Ok \"") + pat + "\""); |
+ } else { |
+ errln(UnicodeString("FAIL \"") + pat + "\", expected \"" + exp + "\""); |
+ } |
+} |
+ |
+void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
+ int32_t pos) { |
+ expectPad(fmt, pat, pos, 0, (UnicodeString)""); |
+} |
+void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
+ int32_t pos, int32_t width, UChar pad) { |
+ expectPad(fmt, pat, pos, width, UnicodeString(pad)); |
+} |
+void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, |
+ int32_t pos, int32_t width, const UnicodeString& pad) { |
+ int32_t apos = 0, awidth = 0; |
+ UnicodeString apadStr; |
+ UErrorCode status = U_ZERO_ERROR; |
+ fmt.applyPattern(pat, status); |
+ if (U_SUCCESS(status)) { |
+ apos = fmt.getPadPosition(); |
+ awidth = fmt.getFormatWidth(); |
+ apadStr=fmt.getPadCharacterString(); |
+ } else { |
+ apos = -1; |
+ awidth = width; |
+ apadStr = pad; |
+ } |
+ if (apos == pos && awidth == width && apadStr == pad) { |
+ UnicodeString infoStr; |
+ if (pos == ILLEGAL) { |
+ infoStr = UnicodeString(" width=", "") + awidth + UnicodeString(" pad=", "") + apadStr; |
+ } |
+ logln(UnicodeString("Ok \"") + pat + "\" pos=" + apos + infoStr); |
+ } else { |
+ errln(UnicodeString("FAIL \"") + pat + "\" pos=" + apos + |
+ " width=" + awidth + " pad=" + apadStr + |
+ ", expected " + pos + " " + width + " " + pad); |
+ } |
+} |
+void NumberFormatTest::TestJB3832(){ |
+ const char* localeID = "pt_PT@currency=PTE"; |
+ Locale loc(localeID); |
+ UErrorCode status = U_ZERO_ERROR; |
+ UnicodeString expected(CharsToUnicodeString("1,150$50\\u00A0Esc.")); |
+ UnicodeString s; |
+ NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(loc, status); |
+ if(U_FAILURE(status)){ |
+ dataerrln("Could not create currency formatter for locale %s - %s", localeID, u_errorName(status)); |
+ return; |
+ } |
+ currencyFmt->format(1150.50, s); |
+ if(s!=expected){ |
+ errln(UnicodeString("FAIL: Expected: ")+expected |
+ + UnicodeString(" Got: ") + s |
+ + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); |
+ } |
+ if (U_FAILURE(status)){ |
+ errln("FAIL: Status %s", u_errorName(status)); |
+ } |
+ delete currencyFmt; |
+} |
+ |
+void NumberFormatTest::TestHost() |
+{ |
+#ifdef U_WINDOWS |
+ Win32NumberTest::testLocales(this); |
+#endif |
+ for (NumberFormat::EStyles k = NumberFormat::kNumberStyle; |
+ k < NumberFormat::kStyleCount; k = (NumberFormat::EStyles)(k+1)) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Locale loc("en_US@compat=host"); |
+ NumberFormat *full = NumberFormat::createInstance(loc, status); |
+ if (full == NULL || U_FAILURE(status)) { |
+ dataerrln("FAIL: Can't create number instance for host - %s", u_errorName(status)); |
+ return; |
+ } |
+ UnicodeString result1; |
+ Formattable number(10.00); |
+ full->format(number, result1, status); |
+ if (U_FAILURE(status)) { |
+ errln("FAIL: Can't format for host"); |
+ return; |
+ } |
+ Formattable formattable; |
+ full->parse(result1, formattable, status); |
+ if (U_FAILURE(status)) { |
+ errln("FAIL: Can't parse for host"); |
+ return; |
+ } |
+ delete full; |
+ } |
+} |
+ |
+void NumberFormatTest::TestHostClone() |
+{ |
+ /* |
+ Verify that a cloned formatter gives the same results |
+ and is useable after the original has been deleted. |
+ */ |
+ // This is mainly important on Windows. |
+ UErrorCode status = U_ZERO_ERROR; |
+ Locale loc("en_US@compat=host"); |
+ UDate now = Calendar::getNow(); |
+ NumberFormat *full = NumberFormat::createInstance(loc, status); |
+ if (full == NULL || U_FAILURE(status)) { |
+ dataerrln("FAIL: Can't create Relative date instance - %s", u_errorName(status)); |
+ return; |
+ } |
+ UnicodeString result1; |
+ full->format(now, result1, status); |
+ Format *fullClone = full->clone(); |
+ delete full; |
+ full = NULL; |
+ |
+ UnicodeString result2; |
+ fullClone->format(now, result2, status); |
+ if (U_FAILURE(status)) { |
+ errln("FAIL: format failure."); |
+ } |
+ if (result1 != result2) { |
+ errln("FAIL: Clone returned different result from non-clone."); |
+ } |
+ delete fullClone; |
+} |
+ |
+void NumberFormatTest::TestCurrencyFormat() |
+{ |
+ // This test is here to increase code coverage. |
+ UErrorCode status = U_ZERO_ERROR; |
+ MeasureFormat *cloneObj; |
+ UnicodeString str; |
+ Formattable toFormat, result; |
+ static const UChar ISO_CODE[4] = {0x0047, 0x0042, 0x0050, 0}; |
+ |
+ Locale saveDefaultLocale = Locale::getDefault(); |
+ Locale::setDefault( Locale::getUK(), status ); |
+ if (U_FAILURE(status)) { |
+ errln("couldn't set default Locale!"); |
+ return; |
+ } |
+ |
+ MeasureFormat *measureObj = MeasureFormat::createCurrencyFormat(status); |
+ Locale::setDefault( saveDefaultLocale, status ); |
+ if (U_FAILURE(status)){ |
+ dataerrln("FAIL: Status %s", u_errorName(status)); |
+ return; |
+ } |
+ cloneObj = (MeasureFormat *)measureObj->clone(); |
+ if (cloneObj == NULL) { |
+ errln("Clone doesn't work"); |
+ return; |
+ } |
+ toFormat.adoptObject(new CurrencyAmount(1234.56, ISO_CODE, status)); |
+ measureObj->format(toFormat, str, status); |
+ measureObj->parseObject(str, result, status); |
+ if (U_FAILURE(status)){ |
+ errln("FAIL: Status %s", u_errorName(status)); |
+ } |
+ if (result != toFormat) { |
+ errln("measureObj does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat)); |
+ } |
+ status = U_ZERO_ERROR; |
+ str.truncate(0); |
+ cloneObj->format(toFormat, str, status); |
+ cloneObj->parseObject(str, result, status); |
+ if (U_FAILURE(status)){ |
+ errln("FAIL: Status %s", u_errorName(status)); |
+ } |
+ if (result != toFormat) { |
+ errln("Clone does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat)); |
+ } |
+ if (*measureObj != *cloneObj) { |
+ errln("Cloned object is not equal to the original object"); |
+ } |
+ delete measureObj; |
+ delete cloneObj; |
+ |
+ status = U_USELESS_COLLATOR_ERROR; |
+ if (MeasureFormat::createCurrencyFormat(status) != NULL) { |
+ errln("createCurrencyFormat should have returned NULL."); |
+ } |
+} |
+ |
+/* Port of ICU4J rounding test. */ |
+void NumberFormatTest::TestRounding() { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Locale::getEnglish(), status); |
+ |
+ if (U_FAILURE(status)) { |
+ dataerrln("Unable to create decimal formatter. - %s", u_errorName(status)); |
+ return; |
+ } |
+ |
+ int roundingIncrements[]={1, 2, 5, 20, 50, 100}; |
+ int testValues[]={0, 300}; |
+ |
+ for (int j=0; j<2; j++) { |
+ for (int mode=DecimalFormat::kRoundUp;mode<DecimalFormat::kRoundHalfEven;mode++) { |
+ df->setRoundingMode((DecimalFormat::ERoundingMode)mode); |
+ for (int increment=0; increment<6; increment++) { |
+ double base=testValues[j]; |
+ double rInc=roundingIncrements[increment]; |
+ checkRounding(df, base, 20, rInc); |
+ rInc=1.000000000/rInc; |
+ checkRounding(df, base, 20, rInc); |
+ } |
+ } |
+ } |
+ delete df; |
+} |
+ |
+void NumberFormatTest::checkRounding(DecimalFormat* df, double base, int iterations, double increment) { |
+ df->setRoundingIncrement(increment); |
+ double lastParsed=INT32_MIN; //Intger.MIN_VALUE |
+ for (int i=-iterations; i<=iterations;i++) { |
+ double iValue=base+(increment*(i*0.1)); |
+ double smallIncrement=0.00000001; |
+ if (iValue!=0) { |
+ smallIncrement*=iValue; |
+ } |
+ //we not only test the value, but some values in a small range around it |
+ lastParsed=checkRound(df, iValue-smallIncrement, lastParsed); |
+ lastParsed=checkRound(df, iValue, lastParsed); |
+ lastParsed=checkRound(df, iValue+smallIncrement, lastParsed); |
+ } |
+} |
+ |
+double NumberFormatTest::checkRound(DecimalFormat* df, double iValue, double lastParsed) { |
+ UErrorCode status=U_ZERO_ERROR; |
+ UnicodeString formattedDecimal; |
+ double parsed; |
+ Formattable result; |
+ df->format(iValue, formattedDecimal, status); |
+ |
+ if (U_FAILURE(status)) { |
+ errln("Error formatting number."); |
+ } |
+ |
+ df->parse(formattedDecimal, result, status); |
+ |
+ if (U_FAILURE(status)) { |
+ errln("Error parsing number."); |
+ } |
+ |
+ parsed=result.getDouble(); |
+ |
+ if (lastParsed>parsed) { |
+ errln("Rounding wrong direction! %d > %d", lastParsed, parsed); |
+ } |
+ |
+ return lastParsed; |
+} |
+ |
+void NumberFormatTest::TestNonpositiveMultiplier() { |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols US(Locale::getUS(), status); |
+ CHECK(status, "DecimalFormatSymbols constructor"); |
+ DecimalFormat df(UnicodeString("0"), US, status); |
+ CHECK(status, "DecimalFormat(0)"); |
+ |
+ // test zero multiplier |
+ |
+ int32_t mult = df.getMultiplier(); |
+ df.setMultiplier(0); |
+ if (df.getMultiplier() != mult) { |
+ errln("DecimalFormat.setMultiplier(0) did not ignore its zero input"); |
+ } |
+ |
+ // test negative multiplier |
+ |
+ df.setMultiplier(-1); |
+ if (df.getMultiplier() != -1) { |
+ errln("DecimalFormat.setMultiplier(-1) ignored its negative input"); |
+ return; |
+ } |
+ |
+ expect(df, "1122.123", -1122.123); |
+ expect(df, "-1122.123", 1122.123); |
+ expect(df, "1.2", -1.2); |
+ expect(df, "-1.2", 1.2); |
+ |
+ // Note: the tests with the final parameter of FALSE will not round trip. |
+ // The initial numeric value will format correctly, after the multiplier. |
+ // Parsing the formatted text will be out-of-range for an int64, however. |
+ // The expect() function could be modified to detect this and fall back |
+ // to looking at the decimal parsed value, but it doesn't. |
+ expect(df, U_INT64_MIN, "9223372036854775808", FALSE); |
+ expect(df, U_INT64_MIN+1, "9223372036854775807"); |
+ expect(df, (int64_t)-123, "123"); |
+ expect(df, (int64_t)123, "-123"); |
+ expect(df, U_INT64_MAX-1, "-9223372036854775806"); |
+ expect(df, U_INT64_MAX, "-9223372036854775807"); |
+ |
+ df.setMultiplier(-2); |
+ expect(df, -(U_INT64_MIN/2)-1, "-9223372036854775806"); |
+ expect(df, -(U_INT64_MIN/2), "-9223372036854775808"); |
+ expect(df, -(U_INT64_MIN/2)+1, "-9223372036854775810", FALSE); |
+ |
+ df.setMultiplier(-7); |
+ expect(df, -(U_INT64_MAX/7)-1, "9223372036854775814", FALSE); |
+ expect(df, -(U_INT64_MAX/7), "9223372036854775807"); |
+ expect(df, -(U_INT64_MAX/7)+1, "9223372036854775800"); |
+ |
+ // TODO: uncomment (and fix up) all the following int64_t tests once BigInteger is ported |
+ // (right now the big numbers get turned into doubles and lose tons of accuracy) |
+ //expect2(df, U_INT64_MAX, Int64ToUnicodeString(-U_INT64_MAX)); |
+ //expect2(df, U_INT64_MIN, UnicodeString(Int64ToUnicodeString(U_INT64_MIN), 1)); |
+ //expect2(df, U_INT64_MAX / 2, Int64ToUnicodeString(-(U_INT64_MAX / 2))); |
+ //expect2(df, U_INT64_MIN / 2, Int64ToUnicodeString(-(U_INT64_MIN / 2))); |
+ |
+ // TODO: uncomment (and fix up) once BigDecimal is ported and DecimalFormat can handle it |
+ //expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); |
+ //expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); |
+ //expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); |
+ //expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestSpaceParsing() { |
+ // the data are: |
+ // the string to be parsed, parsed position, parsed error index |
+ const char* DATA[][3] = { |
+ {"$124", "4", "-1"}, |
+ {"$124 $124", "4", "-1"}, |
+ {"$124 ", "4", "-1"}, |
+ //{"$ 124 ", "5", "-1"}, // TODO: need to handle space correctly |
+ //{"$\\u00A0124 ", "5", "-1"}, // TODO: need to handle space correctly |
+ {"$ 124 ", "0", "0"}, |
+ {"$\\u00A0124 ", "0", "0"}, |
+ {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly |
+ {"124$", "0", "3"}, // TODO: need to handle space correctly |
+ // {"124 $", "5", "-1"}, TODO: OK or not, need currency spacing rule |
+ {"124 $", "0", "3"}, |
+ }; |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* foo = NumberFormat::createCurrencyInstance(status); |
+ if (U_FAILURE(status)) { |
+ delete foo; |
+ return; |
+ } |
+ for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ ParsePosition parsePosition(0); |
+ UnicodeString stringToBeParsed = ctou(DATA[i][0]); |
+ int parsedPosition = atoi(DATA[i][1]); |
+ int errorIndex = atoi(DATA[i][2]); |
+ Formattable result; |
+ foo->parse(stringToBeParsed, result, parsePosition); |
+ if (parsePosition.getIndex() != parsedPosition || |
+ parsePosition.getErrorIndex() != errorIndex) { |
+ errln("FAILED parse " + stringToBeParsed + "; wrong position, expected: (" + parsedPosition + ", " + errorIndex + "); got (" + parsePosition.getIndex() + ", " + parsePosition.getErrorIndex() + ")"); |
+ } |
+ if (parsePosition.getErrorIndex() == -1 && |
+ result.getType() == Formattable::kLong && |
+ result.getLong() != 124) { |
+ errln("FAILED parse " + stringToBeParsed + "; wrong number, expect: 124, got " + result.getLong()); |
+ } |
+ } |
+ delete foo; |
+} |
+ |
+/** |
+ * Test using various numbering systems and numbering system keyword. |
+ */ |
+void NumberFormatTest::TestNumberingSystems() { |
+ UErrorCode ec = U_ZERO_ERROR; |
+ |
+ Locale loc1("en", "US", "", "numbers=thai"); |
+ Locale loc2("en", "US", "", "numbers=hebr"); |
+ Locale loc3("en", "US", "", "numbers=arabext"); |
+ Locale loc4("en", "US", "", "numbers=foobar"); |
+ Locale loc5("ar", "EG", "", ""); // ar_EG uses arab numbering system |
+ Locale loc6("ar", "MA", "", ""); // ar_MA uses latn numbering system |
+ Locale loc7("en", "US", "", "numbers=hanidec"); |
+ |
+ NumberFormat* fmt1= NumberFormat::createInstance(loc1, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(en_US@numbers=thai) - %s", u_errorName(ec)); |
+ } |
+ NumberFormat* fmt2= NumberFormat::createInstance(loc2, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(en_US@numbers=hebr) - %s", u_errorName(ec)); |
+ } |
+ NumberFormat* fmt3= NumberFormat::createInstance(loc3, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(en_US@numbers=arabext) - %s", u_errorName(ec)); |
+ } |
+ NumberFormat* fmt5= NumberFormat::createInstance(loc5, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(ar_EG) - %s", u_errorName(ec)); |
+ } |
+ NumberFormat* fmt6= NumberFormat::createInstance(loc6, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(ar_MA) - %s", u_errorName(ec)); |
+ } |
+ |
+ NumberFormat* fmt7= NumberFormat::createInstance(loc7, ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: getInstance(en_US@numbers=hanidec) - %s", u_errorName(ec)); |
+ } |
+ |
+ if (U_SUCCESS(ec) && fmt1 != NULL && fmt2 != NULL && fmt3 != NULL && |
+ fmt5 != NULL && fmt6 != NULL && fmt7 != NULL) { |
+ expect2(*fmt1, 1234.567, CharsToUnicodeString("\\u0E51,\\u0E52\\u0E53\\u0E54.\\u0E55\\u0E56\\u0E57")); |
+ expect3(*fmt2, 5678.0, CharsToUnicodeString("\\u05D4\\u05F3\\u05EA\\u05E8\\u05E2\\u05F4\\u05D7")); |
+ expect2(*fmt3, 1234.567, CharsToUnicodeString("\\u06F1,\\u06F2\\u06F3\\u06F4.\\u06F5\\u06F6\\u06F7")); |
+ expect2(*fmt5, 1234.567, CharsToUnicodeString("\\u0661\\u066c\\u0662\\u0663\\u0664\\u066b\\u0665\\u0666\\u0667")); |
+ expect2(*fmt6, 1234.567, CharsToUnicodeString("1.234,567")); |
+ expect2(*fmt7, 1234.567, CharsToUnicodeString("\\u4e00,\\u4e8c\\u4e09\\u56db.\\u4e94\\u516d\\u4e03")); |
+ } |
+ |
+ // Test bogus keyword value |
+ NumberFormat* fmt4= NumberFormat::createInstance(loc4, ec); |
+ if ( ec != U_UNSUPPORTED_ERROR ) { |
+ errln("FAIL: getInstance(en_US@numbers=foobar) should have returned U_UNSUPPORTED_ERROR"); |
+ } |
+ |
+ ec = U_ZERO_ERROR; |
+ NumberingSystem *ns = NumberingSystem::createInstance(ec); |
+ if (U_FAILURE(ec)) { |
+ dataerrln("FAIL: NumberingSystem::createInstance(ec); - %s", u_errorName(ec)); |
+ } |
+ |
+ if ( ns != NULL ) { |
+ ns->getDynamicClassID(); |
+ ns->getStaticClassID(); |
+ } else { |
+ errln("FAIL: getInstance() returned NULL."); |
+ } |
+ |
+ NumberingSystem *ns1 = new NumberingSystem(*ns); |
+ if (ns1 == NULL) { |
+ errln("FAIL: NumberSystem copy constructor returned NULL."); |
+ } |
+ |
+ delete ns1; |
+ delete ns; |
+ delete fmt1; |
+ delete fmt2; |
+ delete fmt3; |
+ delete fmt4; |
+ delete fmt5; |
+ delete fmt6; |
+ delete fmt7; |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestMultiCurrencySign() { |
+ const char* DATA[][6] = { |
+ // the fields in the following test are: |
+ // locale, |
+ // currency pattern (with negative pattern), |
+ // currency number to be formatted, |
+ // currency format using currency symbol name, such as "$" for USD, |
+ // currency format using currency ISO name, such as "USD", |
+ // currency format using plural name, such as "US dollars". |
+ // for US locale |
+ {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"}, |
+ {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"}, |
+ {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollar1.00"}, |
+ // for CHINA locale |
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\uFFE51,234.56", "CNY1,234.56", "\\u4EBA\\u6C11\\u5E011,234.56"}, |
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\uFFE51,234.56)", "(CNY1,234.56)", "(\\u4EBA\\u6C11\\u5E011,234.56)"}, |
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\uFFE51.00", "CNY1.00", "\\u4EBA\\u6C11\\u5E011.00"} |
+ }; |
+ |
+ const UChar doubleCurrencySign[] = {0xA4, 0xA4, 0}; |
+ UnicodeString doubleCurrencyStr(doubleCurrencySign); |
+ const UChar tripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; |
+ UnicodeString tripleCurrencyStr(tripleCurrencySign); |
+ |
+ for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ const char* locale = DATA[i][0]; |
+ UnicodeString pat = ctou(DATA[i][1]); |
+ double numberToBeFormat = atof(DATA[i][2]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale(locale), status); |
+ if (U_FAILURE(status)) { |
+ delete sym; |
+ continue; |
+ } |
+ for (int j=1; j<=3; ++j) { |
+ // j represents the number of currency sign in the pattern. |
+ if (j == 2) { |
+ pat = pat.findAndReplace(ctou("\\u00A4"), doubleCurrencyStr); |
+ } else if (j == 3) { |
+ pat = pat.findAndReplace(ctou("\\u00A4\\u00A4"), tripleCurrencyStr); |
+ } |
+ |
+ DecimalFormat* fmt = new DecimalFormat(pat, new DecimalFormatSymbols(*sym), status); |
+ if (U_FAILURE(status)) { |
+ errln("FAILED init DecimalFormat "); |
+ delete fmt; |
+ continue; |
+ } |
+ UnicodeString s; |
+ ((NumberFormat*) fmt)->format(numberToBeFormat, s); |
+ // DATA[i][3] is the currency format result using a |
+ // single currency sign. |
+ // DATA[i][4] is the currency format result using |
+ // double currency sign. |
+ // DATA[i][5] is the currency format result using |
+ // triple currency sign. |
+ // DATA[i][j+2] is the currency format result using |
+ // 'j' number of currency sign. |
+ UnicodeString currencyFormatResult = ctou(DATA[i][2+j]); |
+ if (s.compare(currencyFormatResult)) { |
+ errln("FAIL format: Expected " + currencyFormatResult + "; Got " + s); |
+ } |
+ // mix style parsing |
+ for (int k=3; k<=5; ++k) { |
+ // DATA[i][3] is the currency format result using a |
+ // single currency sign. |
+ // DATA[i][4] is the currency format result using |
+ // double currency sign. |
+ // DATA[i][5] is the currency format result using |
+ // triple currency sign. |
+ UnicodeString oneCurrencyFormat = ctou(DATA[i][k]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable parseRes; |
+ fmt->parse(oneCurrencyFormat, parseRes, status); |
+ if (U_FAILURE(status) || |
+ (parseRes.getType() == Formattable::kDouble && |
+ parseRes.getDouble() != numberToBeFormat) || |
+ (parseRes.getType() == Formattable::kLong && |
+ parseRes.getLong() != numberToBeFormat)) { |
+ errln("FAILED parse " + oneCurrencyFormat + "; (i, j, k): " + |
+ i + ", " + j + ", " + k); |
+ } |
+ } |
+ delete fmt; |
+ } |
+ delete sym; |
+ } |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestCurrencyFormatForMixParsing() { |
+ UErrorCode status = U_ZERO_ERROR; |
+ MeasureFormat* curFmt = MeasureFormat::createCurrencyFormat(Locale("en_US"), status); |
+ if (U_FAILURE(status)) { |
+ delete curFmt; |
+ return; |
+ } |
+ const char* formats[] = { |
+ "$1,234.56", // string to be parsed |
+ "USD1,234.56", |
+ "US dollars1,234.56", |
+ "1,234.56 US dollars" |
+ }; |
+ const CurrencyAmount* curramt = NULL; |
+ for (uint32_t i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) { |
+ UnicodeString stringToBeParsed = ctou(formats[i]); |
+ logln(UnicodeString("stringToBeParsed: ") + stringToBeParsed); |
+ Formattable result; |
+ UErrorCode status = U_ZERO_ERROR; |
+ curFmt->parseObject(stringToBeParsed, result, status); |
+ if (U_FAILURE(status)) { |
+ errln("FAIL: measure format parsing: '%s' ec: %s", formats[i], u_errorName(status)); |
+ } else if (result.getType() != Formattable::kObject || |
+ (curramt = dynamic_cast<const CurrencyAmount*>(result.getObject())) == NULL || |
+ curramt->getNumber().getDouble() != 1234.56 || |
+ UnicodeString(curramt->getISOCurrency()).compare(ISO_CURRENCY_USD) |
+ ) { |
+ errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number "); |
+ if (curramt->getNumber().getDouble() != 1234.56) { |
+ errln((UnicodeString)"wong number, expect: 1234.56" + ", got: " + curramt->getNumber().getDouble()); |
+ } |
+ if (curramt->getISOCurrency() != ISO_CURRENCY_USD) { |
+ errln((UnicodeString)"wong currency, expect: USD" + ", got: " + curramt->getISOCurrency()); |
+ } |
+ } |
+ } |
+ delete curFmt; |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestDecimalFormatCurrencyParse() { |
+ // Locale.US |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale("en_US"), status); |
+ if (U_FAILURE(status)) { |
+ delete sym; |
+ return; |
+ } |
+ UnicodeString pat; |
+ UChar currency = 0x00A4; |
+ // "\xA4#,##0.00;-\xA4#,##0.00" |
+ pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00"); |
+ DecimalFormat* fmt = new DecimalFormat(pat, sym, status); |
+ if (U_FAILURE(status)) { |
+ delete fmt; |
+ errln("failed to new DecimalFormat in TestDecimalFormatCurrencyParse"); |
+ return; |
+ } |
+ const char* DATA[][2] = { |
+ // the data are: |
+ // string to be parsed, the parsed result (number) |
+ {"$1.00", "1"}, |
+ {"USD1.00", "1"}, |
+ {"1.00 US dollar", "1"}, |
+ {"$1,234.56", "1234.56"}, |
+ {"USD1,234.56", "1234.56"}, |
+ {"1,234.56 US dollar", "1234.56"}, |
+ }; |
+ for (uint32_t i = 0; i < sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ UnicodeString stringToBeParsed = ctou(DATA[i][0]); |
+ double parsedResult = atof(DATA[i][1]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable result; |
+ fmt->parse(stringToBeParsed, result, status); |
+ if (U_FAILURE(status) || |
+ (result.getType() == Formattable::kDouble && |
+ result.getDouble() != parsedResult) || |
+ (result.getType() == Formattable::kLong && |
+ result.getLong() != parsedResult)) { |
+ errln((UnicodeString)"FAIL parse: Expected " + parsedResult); |
+ } |
+ } |
+ delete fmt; |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestCurrencyIsoPluralFormat() { |
+ const char* DATA[][6] = { |
+ // the data are: |
+ // locale, |
+ // currency amount to be formatted, |
+ // currency ISO code to be formatted, |
+ // format result using CURRENCYSTYLE, |
+ // format result using ISOCURRENCYSTYLE, |
+ // format result using PLURALCURRENCYSTYLE, |
+ |
+ {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"}, |
+ {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"}, |
+ {"en_US", "-1234.56", "USD", "($1,234.56)", "(USD1,234.56)", "-1,234.56 US dollars"}, |
+ {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00 \\u7F8E\\u5143"}, |
+ {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56 \\u7F8E\\u5143"}, |
+ // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"}, |
+ // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"}, |
+ {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4EBA\\u6C11\\u5E01"}, |
+ {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "CNY1,234.56", "1,234.56 \\u4EBA\\u6C11\\u5E01"}, |
+ {"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"}, |
+ {"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"}, |
+ {"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"}, |
+ // test locale without currency information |
+ {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"}, |
+ // test choice format |
+ {"es_AR", "1", "INR", "Rs\\u00A01,00", "INR\\u00A01,00", "1,00 rupia india"}, |
+ }; |
+ |
+ for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ for (NumberFormat::EStyles k = NumberFormat::kCurrencyStyle; |
+ k <= NumberFormat::kPluralCurrencyStyle; |
+ k = (NumberFormat::EStyles)(k+1)) { |
+ // k represents currency format style. |
+ if ( k != NumberFormat::kCurrencyStyle && |
+ k != NumberFormat::kIsoCurrencyStyle && |
+ k != NumberFormat::kPluralCurrencyStyle ) { |
+ continue; |
+ } |
+ const char* localeString = DATA[i][0]; |
+ double numberToBeFormat = atof(DATA[i][1]); |
+ const char* currencyISOCode = DATA[i][2]; |
+ Locale locale(localeString); |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); |
+ if (U_FAILURE(status)) { |
+ delete numFmt; |
+ dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status)); |
+ continue; |
+ } |
+ UChar currencyCode[4]; |
+ u_charsToUChars(currencyISOCode, currencyCode, 4); |
+ numFmt->setCurrency(currencyCode, status); |
+ if (U_FAILURE(status)) { |
+ delete numFmt; |
+ errln((UnicodeString)"can not set currency:" + currencyISOCode); |
+ continue; |
+ } |
+ |
+ UnicodeString strBuf; |
+ numFmt->format(numberToBeFormat, strBuf); |
+ int resultDataIndex = k; |
+ if ( k == NumberFormat::kCurrencyStyle ) { |
+ resultDataIndex = k+2; |
+ } |
+ // DATA[i][resultDataIndex] is the currency format result |
+ // using 'k' currency style. |
+ UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); |
+ if (strBuf.compare(formatResult)) { |
+ errln("FAIL: Expected " + formatResult + " actual: " + strBuf); |
+ } |
+ // test parsing, and test parsing for all currency formats. |
+ for (int j = 3; j < 6; ++j) { |
+ // DATA[i][3] is the currency format result using |
+ // CURRENCYSTYLE formatter. |
+ // DATA[i][4] is the currency format result using |
+ // ISOCURRENCYSTYLE formatter. |
+ // DATA[i][5] is the currency format result using |
+ // PLURALCURRENCYSTYLE formatter. |
+ UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable parseResult; |
+ numFmt->parse(oneCurrencyFormatResult, parseResult, status); |
+ if (U_FAILURE(status) || |
+ (parseResult.getType() == Formattable::kDouble && |
+ parseResult.getDouble() != numberToBeFormat) || |
+ (parseResult.getType() == Formattable::kLong && |
+ parseResult.getLong() != numberToBeFormat)) { |
+ errln((UnicodeString)"FAIL: getCurrencyFormat of locale " + |
+ localeString + " failed roundtripping the number"); |
+ if (parseResult.getType() == Formattable::kDouble) { |
+ errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getDouble()); |
+ } else { |
+ errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getLong()); |
+ } |
+ } |
+ } |
+ delete numFmt; |
+ } |
+ } |
+} |
+ |
+void |
+NumberFormatTest::TestCurrencyParsing() { |
+ const char* DATA[][6] = { |
+ // the data are: |
+ // locale, |
+ // currency amount to be formatted, |
+ // currency ISO code to be formatted, |
+ // format result using CURRENCYSTYLE, |
+ // format result using ISOCURRENCYSTYLE, |
+ // format result using PLURALCURRENCYSTYLE, |
+ {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"}, |
+ {"pa_IN", "1", "USD", "US$\\u00a0\\u0a67.\\u0a66\\u0a66", "USD\\u00a0\\u0a67.\\u0a66\\u0a66", "\\u0a67.\\u0a66\\u0a66 USD"}, |
+ {"es_AR", "1", "USD", "US$\\u00a01,00", "USD\\u00a01,00", "1,00 d\\u00f3lar estadounidense"}, |
+ {"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"}, |
+ {"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"}, |
+ {"he_IL", "1", "USD", "1.00\\u00a0US$", "1.00\\u00a0USD", "1.00 \\u05d3\\u05d5\\u05dc\\u05e8 \\u05d0\\u05de\\u05e8\\u05d9\\u05e7\\u05d0\\u05d9"}, |
+ {"hr_HR", "1", "USD", "1,00\\u00a0$", "1,00\\u00a0USD", "1,00 Ameri\\u010dki dolar"}, |
+ {"id_ID", "1", "USD", "US$1,00", "USD1,00", "1,00 USD"}, |
+ {"it_IT", "1", "USD", "US$\\u00a01,00", "USD\\u00a01,00", "1,00 Dollaro Statunitense"}, |
+ {"ko_KR", "1", "USD", "US$1.00", "USD1.00", "1.00 \\ubbf8\\uad6d \\ub2ec\\ub7ec"}, |
+ {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00 \\u7c73\\u30c9\\u30eb"}, |
+ {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4EBA\\u6C11\\u5E01"}, |
+ {"zh_TW", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"}, |
+ {"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"}, |
+ }; |
+ |
+#ifdef NUMFMTST_CACHE_DEBUG |
+int deadloop = 0; |
+for (;;) { |
+ printf("loop: %d\n", deadloop++); |
+#endif |
+ for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ for (NumberFormat::EStyles k = NumberFormat::kCurrencyStyle; |
+ k <= NumberFormat::kPluralCurrencyStyle; |
+ k = (NumberFormat::EStyles)(k+1)) { |
+ // k represents currency format style. |
+ if ( k != NumberFormat::kCurrencyStyle && |
+ k != NumberFormat::kIsoCurrencyStyle && |
+ k != NumberFormat::kPluralCurrencyStyle ) { |
+ continue; |
+ } |
+ const char* localeString = DATA[i][0]; |
+ double numberToBeFormat = atof(DATA[i][1]); |
+ const char* currencyISOCode = DATA[i][2]; |
+ Locale locale(localeString); |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status); |
+ if (U_FAILURE(status)) { |
+ delete numFmt; |
+ dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status)); |
+ continue; |
+ } |
+ // TODO: need to be UChar* |
+ UChar currencyCode[4]; |
+ currencyCode[0] = currencyISOCode[0]; |
+ currencyCode[1] = currencyISOCode[1]; |
+ currencyCode[2] = currencyISOCode[2]; |
+ currencyCode[3] = currencyISOCode[3]; |
+ numFmt->setCurrency(currencyCode, status); |
+ if (U_FAILURE(status)) { |
+ delete numFmt; |
+ errln((UnicodeString)"can not set currency:" + currencyISOCode); |
+ continue; |
+ } |
+ |
+ /* |
+ UnicodeString strBuf; |
+ numFmt->format(numberToBeFormat, strBuf); |
+ int resultDataIndex = k; |
+ if ( k == NumberFormat::kCurrencyStyle ) { |
+ resultDataIndex = k+2; |
+ } |
+ // DATA[i][resultDataIndex] is the currency format result |
+ // using 'k' currency style. |
+ UnicodeString formatResult = ctou(DATA[i][resultDataIndex]); |
+ if (strBuf.compare(formatResult)) { |
+ errln("FAIL: Expected " + formatResult + " actual: " + strBuf); |
+ } |
+ */ |
+ // test parsing, and test parsing for all currency formats. |
+ for (int j = 3; j < 6; ++j) { |
+ // DATA[i][3] is the currency format result using |
+ // CURRENCYSTYLE formatter. |
+ // DATA[i][4] is the currency format result using |
+ // ISOCURRENCYSTYLE formatter. |
+ // DATA[i][5] is the currency format result using |
+ // PLURALCURRENCYSTYLE formatter. |
+ UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable parseResult; |
+ numFmt->parse(oneCurrencyFormatResult, parseResult, status); |
+ if (U_FAILURE(status) || |
+ (parseResult.getType() == Formattable::kDouble && |
+ parseResult.getDouble() != numberToBeFormat) || |
+ (parseResult.getType() == Formattable::kLong && |
+ parseResult.getLong() != numberToBeFormat)) { |
+ errln((UnicodeString)"FAIL: getCurrencyFormat of locale " + |
+ localeString + " failed roundtripping the number" + |
+ "(i,k,j): " + i + ", " + k + ", " + j); |
+ if (parseResult.getType() == Formattable::kDouble) { |
+ errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getDouble()); |
+ } else { |
+ errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getLong()); |
+ } |
+ } |
+ } |
+ delete numFmt; |
+ } |
+ } |
+#ifdef NUMFMTST_CACHE_DEBUG |
+} |
+#endif |
+} |
+ |
+ |
+void |
+NumberFormatTest::TestParseCurrencyInUCurr() { |
+ const char* DATA[] = { |
+ "1.00 US DOLLAR", // case in-sensitive |
+ "$1.00", |
+ "USD1.00", |
+ "US dollar1.00", |
+ "US dollars1.00", |
+ "$1.00", |
+ "AU$1.00", |
+ "ADP1.00", |
+ "ADP1.00", |
+ "AED1.00", |
+ "AED1.00", |
+ "AFA1.00", |
+ "AFA1.00", |
+ "AFN1.00", |
+ "ALL1.00", |
+ "AMD1.00", |
+ "ANG1.00", |
+ "AOA1.00", |
+ "AOK1.00", |
+ "AOK1.00", |
+ "AON1.00", |
+ "AON1.00", |
+ "AOR1.00", |
+ "AOR1.00", |
+ "AR$1.00", |
+ "ARA1.00", |
+ "ARA1.00", |
+ "ARP1.00", |
+ "ARP1.00", |
+ "ARS1.00", |
+ "ATS1.00", |
+ "ATS1.00", |
+ "AUD1.00", |
+ "AWG1.00", |
+ "AZM1.00", |
+ "AZM1.00", |
+ "AZN1.00", |
+ "Af1.00", |
+ "Afghan Afghani (1927-2002)1.00", |
+ "Afghan Afghani (AFA)1.00", |
+ "Afghan Afghani1.00", |
+ "Afghan Afghani1.00", |
+ "Afghan Afghanis (AFA)1.00", |
+ "Afghan Afghanis1.00", |
+ "Afl.1.00", |
+ "Albanian Lek1.00", |
+ "Albanian lek1.00", |
+ "Albanian lek\\u00eb1.00", |
+ "Algerian Dinar1.00", |
+ "Algerian dinar1.00", |
+ "Algerian dinars1.00", |
+ "Andorran Peseta1.00", |
+ "Andorran peseta1.00", |
+ "Andorran pesetas1.00", |
+ "Angolan Kwanza (1977-1991)1.00", |
+ "Angolan Readjusted Kwanza (1995-1999)1.00", |
+ "Angolan Kwanza1.00", |
+ "Angolan New Kwanza (1990-2000)1.00", |
+ "Angolan kwanza (1977-1991)1.00", |
+ "Angolan readjusted kwanza (1995-1999)1.00", |
+ "Angolan kwanza1.00", |
+ "Angolan kwanzas (1977-1991)1.00", |
+ "Angolan readjusted kwanzas (1995-1999)1.00", |
+ "Angolan kwanzas1.00", |
+ "Angolan new kwanza (1990-2000)1.00", |
+ "Angolan new kwanzas (1990-2000)1.00", |
+ "Argentine Austral1.00", |
+ "Argentine Peso (1983-1985)1.00", |
+ "Argentine Peso1.00", |
+ "Argentine austral1.00", |
+ "Argentine australs1.00", |
+ "Argentine peso (1983-1985)1.00", |
+ "Argentine peso1.00", |
+ "Argentine pesos (1983-1985)1.00", |
+ "Argentine pesos1.00", |
+ "Armenian Dram1.00", |
+ "Armenian dram1.00", |
+ "Armenian drams1.00", |
+ "Aruban Florin1.00", |
+ "Aruban florin1.00", |
+ "Australian Dollar1.00", |
+ "Australian dollar1.00", |
+ "Australian dollars1.00", |
+ "Austrian Schilling1.00", |
+ "Austrian schilling1.00", |
+ "Austrian schillings1.00", |
+ "Azerbaijani Manat (1993-2006)1.00", |
+ "Azerbaijani Manat1.00", |
+ "Azerbaijani manat (1993-2006)1.00", |
+ "Azerbaijani manat1.00", |
+ "Azerbaijani manats (1993-2006)1.00", |
+ "Azerbaijani manats1.00", |
+ "BN$1.00", |
+ "BAD1.00", |
+ "BAD1.00", |
+ "BAM1.00", |
+ "BBD1.00", |
+ "BD$1.00", |
+ "BDT1.00", |
+ "BEC1.00", |
+ "BEC1.00", |
+ "BEF1.00", |
+ "BEL1.00", |
+ "BEL1.00", |
+ "BF1.00", |
+ "BGL1.00", |
+ "BGN1.00", |
+ "BGN1.00", |
+ "BHD1.00", |
+ "BIF1.00", |
+ "BMD1.00", |
+ "BND1.00", |
+ "BOB1.00", |
+ "BOP1.00", |
+ "BOP1.00", |
+ "BOV1.00", |
+ "BOV1.00", |
+ "BRB1.00", |
+ "BRB1.00", |
+ "BRC1.00", |
+ "BRC1.00", |
+ "BRE1.00", |
+ "BRE1.00", |
+ "BRL1.00", |
+ "BRN1.00", |
+ "BRN1.00", |
+ "BRR1.00", |
+ "BRR1.00", |
+ "BSD1.00", |
+ "BSD1.00", |
+ "BTN1.00", |
+ "BUK1.00", |
+ "BUK1.00", |
+ "BWP1.00", |
+ "BYB1.00", |
+ "BYB1.00", |
+ "BYR1.00", |
+ "BZ$1.00", |
+ "BZD1.00", |
+ "Bahamian Dollar1.00", |
+ "Bahamian dollar1.00", |
+ "Bahamian dollars1.00", |
+ "Bahraini Dinar1.00", |
+ "Bahraini dinar1.00", |
+ "Bahraini dinars1.00", |
+ "Bangladeshi Taka1.00", |
+ "Bangladeshi taka1.00", |
+ "Bangladeshi takas1.00", |
+ "Barbadian Dollar1.00", |
+ "Barbadian dollar1.00", |
+ "Barbadian dollars1.00", |
+ "Bds$1.00", |
+ "Belarusian New Ruble (1994-1999)1.00", |
+ "Belarusian Ruble1.00", |
+ "Belarusian new ruble (1994-1999)1.00", |
+ "Belarusian new rubles (1994-1999)1.00", |
+ "Belarusian ruble1.00", |
+ "Belarusian rubles1.00", |
+ "Belgian Franc (convertible)1.00", |
+ "Belgian Franc (financial)1.00", |
+ "Belgian Franc1.00", |
+ "Belgian franc (convertible)1.00", |
+ "Belgian franc (financial)1.00", |
+ "Belgian franc1.00", |
+ "Belgian francs (convertible)1.00", |
+ "Belgian francs (financial)1.00", |
+ "Belgian francs1.00", |
+ "Belize Dollar1.00", |
+ "Belize dollar1.00", |
+ "Belize dollars1.00", |
+ "Bermudan Dollar1.00", |
+ "Bermudan dollar1.00", |
+ "Bermudan dollars1.00", |
+ "Bhutanese Ngultrum1.00", |
+ "Bhutanese ngultrum1.00", |
+ "Bhutanese ngultrums1.00", |
+ "Bolivian Mvdol1.00", |
+ "Bolivian Peso1.00", |
+ "Bolivian mvdol1.00", |
+ "Bolivian mvdols1.00", |
+ "Bolivian peso1.00", |
+ "Bolivian pesos1.00", |
+ "Bolivian Boliviano1.00", |
+ "Bolivian Boliviano1.00", |
+ "Bolivian Bolivianos1.00", |
+ "Bosnia-Herzegovina Convertible Mark1.00", |
+ "Bosnia-Herzegovina Dinar (1992-1994)1.00", |
+ "Bosnia-Herzegovina convertible mark1.00", |
+ "Bosnia-Herzegovina convertible marks1.00", |
+ "Bosnia-Herzegovina dinar (1992-1994)1.00", |
+ "Bosnia-Herzegovina dinars (1992-1994)1.00", |
+ "Botswanan Pula1.00", |
+ "Botswanan pula1.00", |
+ "Botswanan pulas1.00", |
+ "Br1.00", |
+ "Brazilian New Cruzado (1989-1990)1.00", |
+ "Brazilian Cruzado (1986-1989)1.00", |
+ "Brazilian Cruzeiro (1990-1993)1.00", |
+ "Brazilian New Cruzeiro (1967-1986)1.00", |
+ "Brazilian Cruzeiro (1993-1994)1.00", |
+ "Brazilian Real1.00", |
+ "Brazilian new cruzado (1989-1990)1.00", |
+ "Brazilian new cruzados (1989-1990)1.00", |
+ "Brazilian cruzado (1986-1989)1.00", |
+ "Brazilian cruzados (1986-1989)1.00", |
+ "Brazilian cruzeiro (1990-1993)1.00", |
+ "Brazilian new cruzeiro (1967-1986)1.00", |
+ "Brazilian cruzeiro (1993-1994)1.00", |
+ "Brazilian cruzeiros (1990-1993)1.00", |
+ "Brazilian new cruzeiros (1967-1986)1.00", |
+ "Brazilian cruzeiros (1993-1994)1.00", |
+ "Brazilian real1.00", |
+ "Brazilian reals1.00", |
+ "British Pound Sterling1.00", |
+ "British pound sterling1.00", |
+ "British pounds sterling1.00", |
+ "Brunei Dollar1.00", |
+ "Brunei dollar1.00", |
+ "Brunei dollars1.00", |
+ "Bs1.00", |
+ "Bs.F.1.00", |
+ "Bulgarian Hard Lev1.00", |
+ "Bulgarian Lev1.00", |
+ "Bulgarian Leva1.00", |
+ "Bulgarian hard lev1.00", |
+ "Bulgarian hard leva1.00", |
+ "Bulgarian lev1.00", |
+ "Burmese Kyat1.00", |
+ "Burmese kyat1.00", |
+ "Burmese kyats1.00", |
+ "Burundian Franc1.00", |
+ "Burundian franc1.00", |
+ "Burundian francs1.00", |
+ "C$1.00", |
+ "CA$1.00", |
+ "CAD1.00", |
+ "CDF1.00", |
+ "CDF1.00", |
+ "CF1.00", |
+ "CFA Franc BCEAO1.00", |
+ "CFA Franc BEAC1.00", |
+ "CFA franc BCEAO1.00", |
+ "CFA franc BEAC1.00", |
+ "CFA francs BCEAO1.00", |
+ "CFA francs BEAC1.00", |
+ "CFP Franc1.00", |
+ "CFP franc1.00", |
+ "CFP francs1.00", |
+ "CFPF1.00", |
+ "CHE1.00", |
+ "CHE1.00", |
+ "CHF1.00", |
+ "CHW1.00", |
+ "CHW1.00", |
+ "CL$1.00", |
+ "CLF1.00", |
+ "CLF1.00", |
+ "CLP1.00", |
+ "CNY1.00", |
+ "CO$1.00", |
+ "COP1.00", |
+ "COU1.00", |
+ "COU1.00", |
+ "CRC1.00", |
+ "CSD1.00", |
+ "CSD1.00", |
+ "CSK1.00", |
+ "CSK1.00", |
+ "CUP1.00", |
+ "CUP1.00", |
+ "CVE1.00", |
+ "CYP1.00", |
+ "CZK1.00", |
+ "Cambodian Riel1.00", |
+ "Cambodian riel1.00", |
+ "Cambodian riels1.00", |
+ "Canadian Dollar1.00", |
+ "Canadian dollar1.00", |
+ "Canadian dollars1.00", |
+ "Cape Verdean Escudo1.00", |
+ "Cape Verdean escudo1.00", |
+ "Cape Verdean escudos1.00", |
+ "Cayman Islands Dollar1.00", |
+ "Cayman Islands dollar1.00", |
+ "Cayman Islands dollars1.00", |
+ "Chilean Peso1.00", |
+ "Chilean Unit of Account (UF)1.00", |
+ "Chilean peso1.00", |
+ "Chilean pesos1.00", |
+ "Chilean unit of account (UF)1.00", |
+ "Chilean units of account (UF)1.00", |
+ "Chinese Yuan1.00", |
+ "Chinese yuan1.00", |
+ "Colombian Peso1.00", |
+ "Colombian peso1.00", |
+ "Colombian pesos1.00", |
+ "Comorian Franc1.00", |
+ "Comorian franc1.00", |
+ "Comorian francs1.00", |
+ "Congolese Franc1.00", |
+ "Congolese franc1.00", |
+ "Congolese francs1.00", |
+ "Costa Rican Col\\u00f3n1.00", |
+ "Costa Rican col\\u00f3n1.00", |
+ "Costa Rican col\\u00f3ns1.00", |
+ "Croatian Dinar1.00", |
+ "Croatian Kuna1.00", |
+ "Croatian dinar1.00", |
+ "Croatian dinars1.00", |
+ "Croatian kuna1.00", |
+ "Croatian kunas1.00", |
+ "Cuban Peso1.00", |
+ "Cuban peso1.00", |
+ "Cuban pesos1.00", |
+ "Cypriot Pound1.00", |
+ "Cypriot pound1.00", |
+ "Cypriot pounds1.00", |
+ "Czech Republic Koruna1.00", |
+ "Czech Republic koruna1.00", |
+ "Czech Republic korunas1.00", |
+ "Czechoslovak Hard Koruna1.00", |
+ "Czechoslovak hard koruna1.00", |
+ "Czechoslovak hard korunas1.00", |
+ "DA1.00", |
+ "DDM1.00", |
+ "DDM1.00", |
+ "DEM1.00", |
+ "DEM1.00", |
+ "DJF1.00", |
+ "DKK1.00", |
+ "DOP1.00", |
+ "DZD1.00", |
+ "Danish Krone1.00", |
+ "Danish krone1.00", |
+ "Danish kroner1.00", |
+ "Db1.00", |
+ "German Mark1.00", |
+ "German mark1.00", |
+ "German marks1.00", |
+ "Djiboutian Franc1.00", |
+ "Djiboutian franc1.00", |
+ "Djiboutian francs1.00", |
+ "Dkr1.00", |
+ "Dominican Peso1.00", |
+ "Dominican peso1.00", |
+ "Dominican pesos1.00", |
+ "EC$1.00", |
+ "ECS1.00", |
+ "ECS1.00", |
+ "ECV1.00", |
+ "ECV1.00", |
+ "EEK1.00", |
+ "EEK1.00", |
+ "EGP1.00", |
+ "EGP1.00", |
+ "ERN1.00", |
+ "ERN1.00", |
+ "ESA1.00", |
+ "ESA1.00", |
+ "ESB1.00", |
+ "ESB1.00", |
+ "ESP1.00", |
+ "ETB1.00", |
+ "EUR1.00", |
+ "East Caribbean Dollar1.00", |
+ "East Caribbean dollar1.00", |
+ "East Caribbean dollars1.00", |
+ "East German Mark1.00", |
+ "East German mark1.00", |
+ "East German marks1.00", |
+ "Ecuadorian Sucre1.00", |
+ "Ecuadorian Unit of Constant Value1.00", |
+ "Ecuadorian sucre1.00", |
+ "Ecuadorian sucres1.00", |
+ "Ecuadorian unit of constant value1.00", |
+ "Ecuadorian units of constant value1.00", |
+ "Egyptian Pound1.00", |
+ "Egyptian pound1.00", |
+ "Egyptian pounds1.00", |
+ "Salvadoran Col\\u00f3n1.00", |
+ "Salvadoran col\\u00f3n1.00", |
+ "Salvadoran colones1.00", |
+ "Equatorial Guinean Ekwele1.00", |
+ "Equatorial Guinean ekwele1.00", |
+ "Eritrean Nakfa1.00", |
+ "Eritrean nakfa1.00", |
+ "Eritrean nakfas1.00", |
+ "Esc1.00", |
+ "Estonian Kroon1.00", |
+ "Estonian kroon1.00", |
+ "Estonian kroons1.00", |
+ "Ethiopian Birr1.00", |
+ "Ethiopian birr1.00", |
+ "Ethiopian birrs1.00", |
+ "Euro1.00", |
+ "European Composite Unit1.00", |
+ "European Currency Unit1.00", |
+ "European Monetary Unit1.00", |
+ "European Unit of Account (XBC)1.00", |
+ "European Unit of Account (XBD)1.00", |
+ "European composite unit1.00", |
+ "European composite units1.00", |
+ "European currency unit1.00", |
+ "European currency units1.00", |
+ "European monetary unit1.00", |
+ "European monetary units1.00", |
+ "European unit of account (XBC)1.00", |
+ "European unit of account (XBD)1.00", |
+ "European units of account (XBC)1.00", |
+ "European units of account (XBD)1.00", |
+ "FJ$1.00", |
+ "FBu1.00", |
+ "FIM1.00", |
+ "FIM1.00", |
+ "FJD1.00", |
+ "FKP1.00", |
+ "FKP1.00", |
+ "FRF1.00", |
+ "FRF1.00", |
+ "Falkland Islands Pound1.00", |
+ "Falkland Islands pound1.00", |
+ "Falkland Islands pounds1.00", |
+ "Fdj1.00", |
+ "Fijian Dollar1.00", |
+ "Fijian dollar1.00", |
+ "Fijian dollars1.00", |
+ "Finnish Markka1.00", |
+ "Finnish markka1.00", |
+ "Finnish markkas1.00", |
+ "CHF1.00", |
+ "French Franc1.00", |
+ "French Gold Franc1.00", |
+ "French UIC-Franc1.00", |
+ "French UIC-franc1.00", |
+ "French UIC-francs1.00", |
+ "French franc1.00", |
+ "French francs1.00", |
+ "French gold franc1.00", |
+ "French gold francs1.00", |
+ "Ft1.00", |
+ "GY$1.00", |
+ "GBP1.00", |
+ "GEK1.00", |
+ "GEK1.00", |
+ "GEL1.00", |
+ "FG1.00", |
+ "GHC1.00", |
+ "GHC1.00", |
+ "GHS1.00", |
+ "GIP1.00", |
+ "GIP1.00", |
+ "GMD1.00", |
+ "GMD1.00", |
+ "GNF1.00", |
+ "GNS1.00", |
+ "GNS1.00", |
+ "GQE1.00", |
+ "GQE1.00", |
+ "GRD1.00", |
+ "GRD1.00", |
+ "GTQ1.00", |
+ "GWE1.00", |
+ "GWE1.00", |
+ "GWP1.00", |
+ "GWP1.00", |
+ "GYD1.00", |
+ "Gambian Dalasi1.00", |
+ "Gambian dalasi1.00", |
+ "Gambian dalasis1.00", |
+ "Georgian Kupon Larit1.00", |
+ "Georgian Lari1.00", |
+ "Georgian kupon larit1.00", |
+ "Georgian kupon larits1.00", |
+ "Georgian lari1.00", |
+ "Georgian laris1.00", |
+ "Ghanaian Cedi (1979-2007)1.00", |
+ "Ghanaian Cedi1.00", |
+ "Ghanaian cedi (1979-2007)1.00", |
+ "Ghanaian cedi1.00", |
+ "Ghanaian cedis (1979-2007)1.00", |
+ "Ghanaian cedis1.00", |
+ "Gibraltar Pound1.00", |
+ "Gibraltar pound1.00", |
+ "Gibraltar pounds1.00", |
+ "Gold1.00", |
+ "Gold1.00", |
+ "Greek Drachma1.00", |
+ "Greek drachma1.00", |
+ "Greek drachmas1.00", |
+ "Guatemalan Quetzal1.00", |
+ "Guatemalan quetzal1.00", |
+ "Guatemalan quetzals1.00", |
+ "Guinean Franc1.00", |
+ "Guinean Syli1.00", |
+ "Guinean franc1.00", |
+ "Guinean francs1.00", |
+ "Guinean syli1.00", |
+ "Guinean sylis1.00", |
+ "Guinea-Bissau Peso1.00", |
+ "Guinea-Bissau peso1.00", |
+ "Guinea-Bissau pesos1.00", |
+ "Guyanaese Dollar1.00", |
+ "Guyanaese dollar1.00", |
+ "Guyanaese dollars1.00", |
+ "HK$1.00", |
+ "HKD1.00", |
+ "HNL1.00", |
+ "HRD1.00", |
+ "HRD1.00", |
+ "HRK1.00", |
+ "HRK1.00", |
+ "HTG1.00", |
+ "HTG1.00", |
+ "HUF1.00", |
+ "Haitian Gourde1.00", |
+ "Haitian gourde1.00", |
+ "Haitian gourdes1.00", |
+ "Honduran Lempira1.00", |
+ "Honduran lempira1.00", |
+ "Honduran lempiras1.00", |
+ "Hong Kong Dollar1.00", |
+ "Hong Kong dollar1.00", |
+ "Hong Kong dollars1.00", |
+ "Hungarian Forint1.00", |
+ "Hungarian forint1.00", |
+ "Hungarian forints1.00", |
+ "IDR1.00", |
+ "IEP1.00", |
+ "ILP1.00", |
+ "ILP1.00", |
+ "ILS1.00", |
+ "INR1.00", |
+ "IQD1.00", |
+ "IRR1.00", |
+ "IR\\u00a31.00", |
+ "ISK1.00", |
+ "ISK1.00", |
+ "ITL1.00", |
+ "Icelandic Kr\\u00f3na1.00", |
+ "Icelandic kr\\u00f3na1.00", |
+ "Icelandic kr\\u00f3nur1.00", |
+ "Indian Rupee1.00", |
+ "Indian rupee1.00", |
+ "Indian rupees1.00", |
+ "Indonesian Rupiah1.00", |
+ "Indonesian rupiah1.00", |
+ "Indonesian rupiahs1.00", |
+ "Iranian Rial1.00", |
+ "Iranian rial1.00", |
+ "Iranian rials1.00", |
+ "Iraqi Dinar1.00", |
+ "Iraqi dinar1.00", |
+ "Iraqi dinars1.00", |
+ "Irish Pound1.00", |
+ "Irish pound1.00", |
+ "Irish pounds1.00", |
+ "Israeli Pound1.00", |
+ "Israeli new sheqel1.00", |
+ "Israeli pound1.00", |
+ "Israeli pounds1.00", |
+ "Italian Lira1.00", |
+ "Italian lira1.00", |
+ "Italian liras1.00", |
+ "J$1.00", |
+ "JD1.00", |
+ "JMD1.00", |
+ "JOD1.00", |
+ "JPY1.00", |
+ "Jamaican Dollar1.00", |
+ "Jamaican dollar1.00", |
+ "Jamaican dollars1.00", |
+ "Japanese Yen1.00", |
+ "Japanese yen1.00", |
+ "Jordanian Dinar1.00", |
+ "Jordanian dinar1.00", |
+ "Jordanian dinars1.00", |
+ "Ksh1.00", |
+ "KD1.00", |
+ "KES1.00", |
+ "KGS1.00", |
+ "KHR1.00", |
+ "KMF1.00", |
+ "KPW1.00", |
+ "KPW1.00", |
+ "KRW1.00", |
+ "KWD1.00", |
+ "KYD1.00", |
+ "KYD1.00", |
+ "KZT1.00", |
+ "Kazakhstani Tenge1.00", |
+ "Kazakhstani tenge1.00", |
+ "Kazakhstani tenges1.00", |
+ "Kenyan Shilling1.00", |
+ "Kenyan shilling1.00", |
+ "Kenyan shillings1.00", |
+ "Kuwaiti Dinar1.00", |
+ "Kuwaiti dinar1.00", |
+ "Kuwaiti dinars1.00", |
+ "Kyrgystani Som1.00", |
+ "Kyrgystani som1.00", |
+ "Kyrgystani soms1.00", |
+ "Kz1.00", |
+ "K\\u010d1.00", |
+ "HNL1.00", |
+ "LAK1.00", |
+ "LAK1.00", |
+ "LBP1.00", |
+ "LD1.00", |
+ "LKR1.00", |
+ "LB\\u00a31.00", |
+ "LRD1.00", |
+ "LRD1.00", |
+ "LSL1.00", |
+ "LTL1.00", |
+ "LTL1.00", |
+ "LTT1.00", |
+ "LTT1.00", |
+ "LUC1.00", |
+ "LUC1.00", |
+ "LUF1.00", |
+ "LUF1.00", |
+ "LUL1.00", |
+ "LUL1.00", |
+ "LVL1.00", |
+ "LVL1.00", |
+ "LVR1.00", |
+ "LVR1.00", |
+ "LYD1.00", |
+ "Laotian Kip1.00", |
+ "Laotian kip1.00", |
+ "Laotian kips1.00", |
+ "Latvian Lats1.00", |
+ "Latvian Ruble1.00", |
+ "Latvian lats1.00", |
+ "Latvian lati.00", |
+ "Latvian ruble1.00", |
+ "Latvian rubles1.00", |
+ "Lebanese Pound1.00", |
+ "Lebanese pound1.00", |
+ "Lebanese pounds1.00", |
+ "Lesotho Loti1.00", |
+ "Lesotho loti1.00", |
+ "Lesotho lotis1.00", |
+ "Liberian Dollar1.00", |
+ "Liberian dollar1.00", |
+ "Liberian dollars1.00", |
+ "Libyan Dinar1.00", |
+ "Libyan dinar1.00", |
+ "Libyan dinars1.00", |
+ "Lithuanian Litas1.00", |
+ "Lithuanian Talonas1.00", |
+ "Lithuanian litas1.00", |
+ "Lithuanian litai1.00", |
+ "Lithuanian talonas1.00", |
+ "Lithuanian talonases1.00", |
+ "Lm1.00", |
+ "Luxembourgian Convertible Franc1.00", |
+ "Luxembourg Financial Franc1.00", |
+ "Luxembourgian Franc1.00", |
+ "Luxembourgian convertible franc1.00", |
+ "Luxembourgian convertible francs1.00", |
+ "Luxembourg financial franc1.00", |
+ "Luxembourg financial francs1.00", |
+ "Luxembourgian franc1.00", |
+ "Luxembourgian francs1.00", |
+ "MAD1.00", |
+ "MAD1.00", |
+ "MAF1.00", |
+ "MAF1.00", |
+ "MDL1.00", |
+ "MDL1.00", |
+ "MX$1.00", |
+ "MGA1.00", |
+ "MGA1.00", |
+ "MGF1.00", |
+ "MGF1.00", |
+ "MKD1.00", |
+ "MLF1.00", |
+ "MLF1.00", |
+ "MMK1.00", |
+ "MMK1.00", |
+ "MNT1.00", |
+ "MOP1.00", |
+ "MOP1.00", |
+ "MRO1.00", |
+ "MTL1.00", |
+ "MTP1.00", |
+ "MTP1.00", |
+ "MTn1.00", |
+ "MUR1.00", |
+ "MUR1.00", |
+ "MVR1.00", |
+ "MVR1.00", |
+ "MWK1.00", |
+ "MXN1.00", |
+ "MXP1.00", |
+ "MXP1.00", |
+ "MXV1.00", |
+ "MXV1.00", |
+ "MYR1.00", |
+ "MZE1.00", |
+ "MZE1.00", |
+ "MZM1.00", |
+ "MZN1.00", |
+ "Macanese Pataca1.00", |
+ "Macanese pataca1.00", |
+ "Macanese patacas1.00", |
+ "Macedonian Denar1.00", |
+ "Macedonian denar1.00", |
+ "Macedonian denari1.00", |
+ "Malagasy Ariaries1.00", |
+ "Malagasy Ariary1.00", |
+ "Malagasy Ariary1.00", |
+ "Malagasy Franc1.00", |
+ "Malagasy franc1.00", |
+ "Malagasy francs1.00", |
+ "Malawian Kwacha1.00", |
+ "Malawian Kwacha1.00", |
+ "Malawian Kwachas1.00", |
+ "Malaysian Ringgit1.00", |
+ "Malaysian ringgit1.00", |
+ "Malaysian ringgits1.00", |
+ "Maldivian Rufiyaa1.00", |
+ "Maldivian rufiyaa1.00", |
+ "Maldivian rufiyaas1.00", |
+ "Malian Franc1.00", |
+ "Malian franc1.00", |
+ "Malian francs1.00", |
+ "Maltese Lira1.00", |
+ "Maltese Pound1.00", |
+ "Maltese lira1.00", |
+ "Maltese lira1.00", |
+ "Maltese pound1.00", |
+ "Maltese pounds1.00", |
+ "Mauritanian Ouguiya1.00", |
+ "Mauritanian ouguiya1.00", |
+ "Mauritanian ouguiyas1.00", |
+ "Mauritian Rupee1.00", |
+ "Mauritian rupee1.00", |
+ "Mauritian rupees1.00", |
+ "Mexican Peso1.00", |
+ "Mexican Silver Peso (1861-1992)1.00", |
+ "Mexican Investment Unit1.00", |
+ "Mexican peso1.00", |
+ "Mexican pesos1.00", |
+ "Mexican silver peso (1861-1992)1.00", |
+ "Mexican silver pesos (1861-1992)1.00", |
+ "Mexican investment unit1.00", |
+ "Mexican investment units1.00", |
+ "Moldovan Leu1.00", |
+ "Moldovan leu1.00", |
+ "Moldovan lei1.00", |
+ "Mongolian Tugrik1.00", |
+ "Mongolian tugrik1.00", |
+ "Mongolian tugriks1.00", |
+ "Moroccan Dirham1.00", |
+ "Moroccan Franc1.00", |
+ "Moroccan dirham1.00", |
+ "Moroccan dirhams1.00", |
+ "Moroccan franc1.00", |
+ "Moroccan francs1.00", |
+ "Mozambican Escudo1.00", |
+ "Mozambican Metical1.00", |
+ "Mozambican escudo1.00", |
+ "Mozambican escudos1.00", |
+ "Mozambican metical1.00", |
+ "Mozambican meticals1.00", |
+ "Mt1.00", |
+ "Myanma Kyat1.00", |
+ "Myanma kyat1.00", |
+ "Myanma kyats1.00", |
+ "N$1.00", |
+ "NAD1.00", |
+ "NAf.1.00", |
+ "NGN1.00", |
+ "NIC1.00", |
+ "NIO1.00", |
+ "NIO1.00", |
+ "Nkr1.00", |
+ "NLG1.00", |
+ "NLG1.00", |
+ "NOK1.00", |
+ "NPR1.00", |
+ "NT$1.00", |
+ "NZ$1.00", |
+ "NZD1.00", |
+ "Namibian Dollar1.00", |
+ "Namibian dollar1.00", |
+ "Namibian dollars1.00", |
+ "Nepalese Rupee1.00", |
+ "Nepalese rupee1.00", |
+ "Nepalese rupees1.00", |
+ "Netherlands Antillean Guilder1.00", |
+ "Netherlands Antillean guilder1.00", |
+ "Netherlands Antillean guilders1.00", |
+ "Dutch Guilder1.00", |
+ "Dutch guilder1.00", |
+ "Dutch guilders1.00", |
+ "Israeli New Sheqel1.00", |
+ "Israeli New Sheqels1.00", |
+ "New Zealand Dollar1.00", |
+ "New Zealand dollar1.00", |
+ "New Zealand dollars1.00", |
+ "Nicaraguan C\\u00f3rdoba1.00", |
+ "Nicaraguan C\\u00f3rdoba (1988-1991)1.00", |
+ "Nicaraguan c\\u00f3rdoba1.00", |
+ "Nicaraguan c\\u00f3rdobas1.00", |
+ "Nicaraguan c\\u00f3rdoba (1988-1991)1.00", |
+ "Nicaraguan c\\u00f3rdobas (1988-1991)1.00", |
+ "Nigerian Naira1.00", |
+ "Nigerian naira1.00", |
+ "Nigerian nairas1.00", |
+ "North Korean Won1.00", |
+ "North Korean won1.00", |
+ "North Korean won1.00", |
+ "Norwegian Krone1.00", |
+ "Norwegian krone1.00", |
+ "Norwegian kroner1.00", |
+ "NPRs1.00", |
+ "Nu.1.00", |
+ "OMR1.00", |
+ "Mozambican Metical (1980-2006)1.00", |
+ "Mozambican metical (1980-2006)1.00", |
+ "Mozambican meticals (1980-2006)1.00", |
+ "Romanian Lei (1952-2006)1.00", |
+ "Romanian Leu (1952-2006)1.00", |
+ "Romanian leu (1952-2006)1.00", |
+ "Serbian Dinar (2002-2006)1.00", |
+ "Serbian dinar (2002-2006)1.00", |
+ "Serbian dinars (2002-2006)1.00", |
+ "Sudanese Dinar (1992-2007)1.00", |
+ "Sudanese Pound (1957-1998)1.00", |
+ "Sudanese dinar (1992-2007)1.00", |
+ "Sudanese dinars (1992-2007)1.00", |
+ "Sudanese pound (1957-1998)1.00", |
+ "Sudanese pounds (1957-1998)1.00", |
+ "Turkish Lira (1922-2005)1.00", |
+ "Turkish Lira (1922-2005)1.00", |
+ "Omani Rial1.00", |
+ "Omani rial1.00", |
+ "Omani rials1.00", |
+ "PAB1.00", |
+ "PAB1.00", |
+ "PEI1.00", |
+ "PEI1.00", |
+ "PEN1.00", |
+ "PEN1.00", |
+ "PES1.00", |
+ "PES1.00", |
+ "PGK1.00", |
+ "PGK1.00", |
+ "PHP1.00", |
+ "PKR1.00", |
+ "PLN1.00", |
+ "PLZ1.00", |
+ "PLZ1.00", |
+ "PTE1.00", |
+ "PTE1.00", |
+ "PYG1.00", |
+ "Pakistani Rupee1.00", |
+ "Pakistani rupee1.00", |
+ "Pakistani rupees1.00", |
+ "Palladium1.00", |
+ "Palladium1.00", |
+ "Panamanian Balboa1.00", |
+ "Panamanian balboa1.00", |
+ "Panamanian balboas1.00", |
+ "Papua New Guinean Kina1.00", |
+ "Papua New Guinean kina1.00", |
+ "Papua New Guinean kina1.00", |
+ "Paraguayan Guarani1.00", |
+ "Paraguayan guarani1.00", |
+ "Paraguayan guaranis1.00", |
+ "Peruvian Inti1.00", |
+ "Peruvian Nuevo Sol1.00", |
+ "Peruvian Sol (1863-1965)1.00", |
+ "Peruvian inti1.00", |
+ "Peruvian intis1.00", |
+ "Peruvian nuevo sol1.00", |
+ "Peruvian nuevos soles1.00", |
+ "Peruvian sol (1863-1965)1.00", |
+ "Peruvian soles (1863-1965)1.00", |
+ "Philippine Peso1.00", |
+ "Philippine peso1.00", |
+ "Philippine pesos1.00", |
+ "Platinum1.00", |
+ "Platinum1.00", |
+ "Polish Zloty (1950-1995)1.00", |
+ "Polish Zloty1.00", |
+ "Polish zlotys1.00", |
+ "Polish zloty (PLZ)1.00", |
+ "Polish zloty1.00", |
+ "Polish zlotys (PLZ)1.00", |
+ "Portuguese Escudo1.00", |
+ "Portuguese Guinea Escudo1.00", |
+ "Portuguese Guinea escudo1.00", |
+ "Portuguese Guinea escudos1.00", |
+ "Portuguese escudo1.00", |
+ "Portuguese escudos1.00", |
+ "PKRs1.00", |
+ "GTQ1.00", |
+ "QAR1.00", |
+ "QR1.00", |
+ "Qatari Rial1.00", |
+ "Qatari rial1.00", |
+ "Qatari rials1.00", |
+ "R1.00", |
+ "R$1.00", |
+ "RD$1.00", |
+ "RHD1.00", |
+ "RHD1.00", |
+ "RINET Funds1.00", |
+ "RINET Funds1.00", |
+ "RM1.00", |
+ "CN\\u00a51.00", |
+ "ROL1.00", |
+ "ROL1.00", |
+ "RON1.00", |
+ "RON1.00", |
+ "RSD1.00", |
+ "RSD1.00", |
+ "RUB1.00", |
+ "RUB1.00", |
+ "RUR1.00", |
+ "RUR1.00", |
+ "RWF1.00", |
+ "RWF1.00", |
+ "Rhodesian Dollar1.00", |
+ "Rhodesian dollar1.00", |
+ "Rhodesian dollars1.00", |
+ "Romanian Leu1.00", |
+ "Romanian lei1.00", |
+ "Romanian leu1.00", |
+ "Rp1.00", |
+ "Russian Ruble (1991-1998)1.00", |
+ "Russian Ruble1.00", |
+ "Russian ruble (1991-1998)1.00", |
+ "Russian ruble1.00", |
+ "Russian rubles (1991-1998)1.00", |
+ "Russian rubles1.00", |
+ "Rwandan Franc1.00", |
+ "Rwandan franc1.00", |
+ "Rwandan francs1.00", |
+ "S$1.00", |
+ "SAR1.00", |
+ "SBD1.00", |
+ "SCR1.00", |
+ "SDD1.00", |
+ "SDD1.00", |
+ "SDG1.00", |
+ "SDG1.00", |
+ "SDP1.00", |
+ "SDP1.00", |
+ "SEK1.00", |
+ "SGD1.00", |
+ "SHP1.00", |
+ "SHP1.00", |
+ "SI$1.00", |
+ "SIT1.00", |
+ "SIT1.00", |
+ "SKK1.00", |
+ "Skr1.00", |
+ "SLRs1.00", |
+ "SLL1.00", |
+ "SLL1.00", |
+ "SOS1.00", |
+ "SRD1.00", |
+ "SRD1.00", |
+ "SRG1.00", |
+ "SRe1.00", |
+ "STD1.00", |
+ "SUR1.00", |
+ "SUR1.00", |
+ "SVC1.00", |
+ "SVC1.00", |
+ "SYP1.00", |
+ "SZL1.00", |
+ "Saint Helena Pound1.00", |
+ "Saint Helena pound1.00", |
+ "Saint Helena pounds1.00", |
+ "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobra1.00", |
+ "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobra1.00", |
+ "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobras1.00", |
+ "Saudi Riyal1.00", |
+ "Saudi riyal1.00", |
+ "Saudi riyals1.00", |
+ "Serbian Dinar1.00", |
+ "Serbian dinar1.00", |
+ "Serbian dinars1.00", |
+ "Seychellois Rupee1.00", |
+ "Seychellois rupee1.00", |
+ "Seychellois rupees1.00", |
+ "Sf1.00", |
+ "Ssh1.00", |
+ "Sierra Leonean Leone1.00", |
+ "Sierra Leonean leone1.00", |
+ "Sierra Leonean leones1.00", |
+ "Silver1.00", |
+ "Silver1.00", |
+ "Singapore Dollar1.00", |
+ "Singapore dollar1.00", |
+ "Singapore dollars1.00", |
+ "Sk1.00", |
+ "Slovak Koruna1.00", |
+ "Slovak koruna1.00", |
+ "Slovak korunas1.00", |
+ "Slovenian Tolar1.00", |
+ "Slovenian tolar1.00", |
+ "Slovenian tolars1.00", |
+ "Solomon Islands Dollar1.00", |
+ "Solomon Islands dollar1.00", |
+ "Solomon Islands dollars1.00", |
+ "Somali Shilling1.00", |
+ "Somali shilling1.00", |
+ "Somali shillings1.00", |
+ "South African Rand (financial)1.00", |
+ "South African Rand1.00", |
+ "South African rand (financial)1.00", |
+ "South African rand1.00", |
+ "South African rands (financial)1.00", |
+ "South African rand1.00", |
+ "South Korean Won1.00", |
+ "South Korean won1.00", |
+ "South Korean won1.00", |
+ "Soviet Rouble1.00", |
+ "Soviet rouble1.00", |
+ "Soviet roubles1.00", |
+ "Spanish Peseta (A account)1.00", |
+ "Spanish Peseta (convertible account)1.00", |
+ "Spanish Peseta1.00", |
+ "Spanish peseta (A account)1.00", |
+ "Spanish peseta (convertible account)1.00", |
+ "Spanish peseta1.00", |
+ "Spanish pesetas (A account)1.00", |
+ "Spanish pesetas (convertible account)1.00", |
+ "Spanish pesetas1.00", |
+ "Special Drawing Rights1.00", |
+ "Sri Lankan Rupee1.00", |
+ "Sri Lankan rupee1.00", |
+ "Sri Lankan rupees1.00", |
+ "Sudanese Pound1.00", |
+ "Sudanese pound1.00", |
+ "Sudanese pounds1.00", |
+ "Surinamese Dollar1.00", |
+ "Surinamese dollar1.00", |
+ "Surinamese dollars1.00", |
+ "Surinamese Guilder1.00", |
+ "Surinamese guilder1.00", |
+ "Surinamese guilders1.00", |
+ "Swazi Lilangeni1.00", |
+ "Swazi lilangeni1.00", |
+ "Swazi emalangeni1.00", |
+ "Swedish Krona1.00", |
+ "Swedish krona1.00", |
+ "Swedish kronor1.00", |
+ "Swiss Franc1.00", |
+ "Swiss franc1.00", |
+ "Swiss francs1.00", |
+ "Syrian Pound1.00", |
+ "Syrian pound1.00", |
+ "Syrian pounds1.00", |
+ "TSh1.00", |
+ "T$1.00", |
+ "THB1.00", |
+ "TJR1.00", |
+ "TJR1.00", |
+ "TJS1.00", |
+ "TJS1.00", |
+ "TL1.00", |
+ "TMM1.00", |
+ "TMM1.00", |
+ "TND1.00", |
+ "TND1.00", |
+ "TOP1.00", |
+ "TPE1.00", |
+ "TPE1.00", |
+ "TRL1.00", |
+ "TRY1.00", |
+ "TRY1.00", |
+ "TT$1.00", |
+ "TTD1.00", |
+ "TWD1.00", |
+ "TZS1.00", |
+ "New Taiwan Dollar1.00", |
+ "New Taiwan dollar1.00", |
+ "New Taiwan dollars1.00", |
+ "Tajikistani Ruble1.00", |
+ "Tajikistani Somoni1.00", |
+ "Tajikistani ruble1.00", |
+ "Tajikistani rubles1.00", |
+ "Tajikistani somoni1.00", |
+ "Tajikistani somonis1.00", |
+ "Tanzanian Shilling1.00", |
+ "Tanzanian shilling1.00", |
+ "Tanzanian shillings1.00", |
+ "Testing Currency Code1.00", |
+ "Testing Currency Code1.00", |
+ "Thai Baht1.00", |
+ "Thai baht1.00", |
+ "Thai baht1.00", |
+ "Timorese Escudo1.00", |
+ "Timorese escudo1.00", |
+ "Timorese escudos1.00", |
+ "Tk1.00", |
+ "Tongan Pa\\u02bbanga1.00", |
+ "Tongan pa\\u02bbanga1.00", |
+ "Tongan pa\\u02bbanga1.00", |
+ "Trinidad and Tobago Dollar1.00", |
+ "Trinidad and Tobago dollar1.00", |
+ "Trinidad and Tobago dollars1.00", |
+ "Tunisian Dinar1.00", |
+ "Tunisian dinar1.00", |
+ "Tunisian dinars1.00", |
+ "Turkish Lira1.00", |
+ "Turkish Lira1.00", |
+ "Turkish lira1.00", |
+ "Turkmenistani Manat1.00", |
+ "Turkmenistani manat1.00", |
+ "Turkmenistani manat1.00", |
+ "USh1.00", |
+ "UAE dirham1.00", |
+ "UAE dirhams1.00", |
+ "UAH1.00", |
+ "UAK1.00", |
+ "UAK1.00", |
+ "UGS1.00", |
+ "UGS1.00", |
+ "UGX1.00", |
+ "UM1.00", |
+ "US Dollar (Next day)1.00", |
+ "US Dollar (Same day)1.00", |
+ "US Dollar1.00", |
+ "US dollar (next day)1.00", |
+ "US dollar (same day)1.00", |
+ "US dollar1.00", |
+ "US dollars (next day)1.00", |
+ "US dollars (same day)1.00", |
+ "US dollars1.00", |
+ "USD1.00", |
+ "USN1.00", |
+ "USN1.00", |
+ "USS1.00", |
+ "USS1.00", |
+ "UYI1.00", |
+ "UYI1.00", |
+ "UYP1.00", |
+ "UYP1.00", |
+ "UYU1.00", |
+ "UZS1.00", |
+ "UZS1.00", |
+ "Ugandan Shilling (1966-1987)1.00", |
+ "Ugandan Shilling1.00", |
+ "Ugandan shilling (1966-1987)1.00", |
+ "Ugandan shilling1.00", |
+ "Ugandan shillings (1966-1987)1.00", |
+ "Ugandan shillings1.00", |
+ "Ukrainian Hryvnia1.00", |
+ "Ukrainian Karbovanets1.00", |
+ "Ukrainian hryvnia1.00", |
+ "Ukrainian hryvnias1.00", |
+ "Ukrainian karbovanets1.00", |
+ "Ukrainian karbovantsiv1.00", |
+ "Colombian Real Value Unit1.00", |
+ "United Arab Emirates Dirham1.00", |
+ "Unknown Currency1.00", |
+ "$U1.00", |
+ "Uruguayan Peso (1975-1993)1.00", |
+ "Uruguayan Peso1.00", |
+ "Uruguayan Peso (Indexed Units)1.00", |
+ "Uruguayan peso (1975-1993)1.00", |
+ "Uruguayan peso (indexed units)1.00", |
+ "Uruguayan peso1.00", |
+ "Uruguayan pesos (1975-1993)1.00", |
+ "Uruguayan pesos (indexed units)1.00", |
+ "Uruguayan pesos1.00", |
+ "Uzbekistan Som1.00", |
+ "Uzbekistan som1.00", |
+ "Uzbekistan som1.00", |
+ "VEB1.00", |
+ "VEF1.00", |
+ "VND1.00", |
+ "VT1.00", |
+ "VUV1.00", |
+ "Vanuatu Vatu1.00", |
+ "Vanuatu vatu1.00", |
+ "Vanuatu vatus1.00", |
+ "Venezuelan Bol\\u00edvar1.00", |
+ "Venezuelan Bol\\u00edvar (1871-2008)1.00", |
+ "Venezuelan bol\\u00edvar1.00", |
+ "Venezuelan bol\\u00edvars1.00", |
+ "Venezuelan bol\\u00edvar (1871-2008)1.00", |
+ "Venezuelan bol\\u00edvars (1871-2008)1.00", |
+ "Vietnamese Dong1.00", |
+ "Vietnamese dong1.00", |
+ "Vietnamese dong1.00", |
+ "WIR Euro1.00", |
+ "WIR Franc1.00", |
+ "WIR euro1.00", |
+ "WIR euros1.00", |
+ "WIR franc1.00", |
+ "WIR francs1.00", |
+ "WST1.00", |
+ "WST1.00", |
+ "Samoan Tala1.00", |
+ "Samoan tala1.00", |
+ "Samoan tala1.00", |
+ "XAF1.00", |
+ "XAF1.00", |
+ "XAG1.00", |
+ "XAG1.00", |
+ "XAU1.00", |
+ "XAU1.00", |
+ "XBA1.00", |
+ "XBA1.00", |
+ "XBB1.00", |
+ "XBB1.00", |
+ "XBC1.00", |
+ "XBC1.00", |
+ "XBD1.00", |
+ "XBD1.00", |
+ "XCD1.00", |
+ "XDR1.00", |
+ "XDR1.00", |
+ "XEU1.00", |
+ "XEU1.00", |
+ "XFO1.00", |
+ "XFO1.00", |
+ "XFU1.00", |
+ "XFU1.00", |
+ "XOF1.00", |
+ "XOF1.00", |
+ "XPD1.00", |
+ "XPD1.00", |
+ "XPF1.00", |
+ "XPT1.00", |
+ "XPT1.00", |
+ "XRE1.00", |
+ "XRE1.00", |
+ "XTS1.00", |
+ "XTS1.00", |
+ "XXX1.00", |
+ "XXX1.00", |
+ "YDD1.00", |
+ "YDD1.00", |
+ "YER1.00", |
+ "YUD1.00", |
+ "YUD1.00", |
+ "YUM1.00", |
+ "YUM1.00", |
+ "YUN1.00", |
+ "YUN1.00", |
+ "Yemeni Dinar1.00", |
+ "Yemeni Rial1.00", |
+ "Yemeni dinar1.00", |
+ "Yemeni dinars1.00", |
+ "Yemeni rial1.00", |
+ "Yemeni rials1.00", |
+ "Yugoslavian Convertible Dinar (1990-1992)1.00", |
+ "Yugoslavian Hard Dinar (1966-1990)1.00", |
+ "Yugoslavian New Dinar (1994-2002)1.00", |
+ "Yugoslavian convertible dinar (1990-1992)1.00", |
+ "Yugoslavian convertible dinars (1990-1992)1.00", |
+ "Yugoslavian hard dinar (1966-1990)1.00", |
+ "Yugoslavian hard dinars (1966-1990)1.00", |
+ "Yugoslavian new dinar (1994-2002)1.00", |
+ "Yugoslavian new dinars (1994-2002)1.00", |
+ "Z$1.00", |
+ "ZAL1.00", |
+ "ZAL1.00", |
+ "ZAR1.00", |
+ "ZMK1.00", |
+ "ZMK1.00", |
+ "ZRN1.00", |
+ "ZRN1.00", |
+ "ZRZ1.00", |
+ "ZRZ1.00", |
+ "ZWD1.00", |
+ "Zairean New Zaire (1993-1998)1.00", |
+ "Zairean Zaire (1971-1993)1.00", |
+ "Zairean new zaire (1993-1998)1.00", |
+ "Zairean new zaires (1993-1998)1.00", |
+ "Zairean zaire (1971-1993)1.00", |
+ "Zairean zaires (1971-1993)1.00", |
+ "Zambian Kwacha1.00", |
+ "Zambian kwacha1.00", |
+ "Zambian kwachas1.00", |
+ "Zimbabwean Dollar (1980-2008)1.00", |
+ "Zimbabwean dollar (1980-2008)1.00", |
+ "Zimbabwean dollars (1980-2008)1.00", |
+ "euro1.00", |
+ "euros1.00", |
+ "man.1.00", |
+ "Turkish lira (1922-2005)1.00", |
+ "special drawing rights1.00", |
+ "Colombian real value unit1.00", |
+ "Colombian real value units1.00", |
+ "unknown/invalid currency1.00", |
+ "z\\u01421.00", |
+ "\\u00a31.00", |
+ "CY\\u00a31.00", |
+ "\\u00a51.00", |
+ "\\u0e3f1.00", |
+ "\\u20ab1.00", |
+ "\\u20a11.00", |
+ "Pts1.00", |
+ "\\u20aa1.00", |
+ "\\u20ac1.00", |
+ "Rs1.00", |
+ "\\u20a61.00", |
+ "\\u20ae1.00", |
+ "IT\\u20a41.00", |
+ // for GHS |
+ // for PHP |
+ // for PYG |
+ // for UAH |
+ // |
+ // Following has extra text, should be parsed correctly too |
+ "$1.00 random", |
+ "USD1.00 random", |
+ "1.00 US dollar random", |
+ "1.00 US dollars random", |
+ "1.00 Afghan Afghani random", |
+ "1.00 Afghan Afghani random", |
+ "1.00 Afghan Afghanis (AFA) random", |
+ "1.00 Afghan Afghanis random", |
+ "1.00 Albanian Lek random", |
+ "1.00 Albanian lek random", |
+ "1.00 Albanian lek\\u00eb random", |
+ "1.00 Algerian Dinar random", |
+ "1.00 Algerian dinar random", |
+ "1.00 Algerian dinars random", |
+ "1.00 Andorran Peseta random", |
+ "1.00 Andorran peseta random", |
+ "1.00 Andorran pesetas random", |
+ "1.00 Angolan Kwanza (1977-1990) random", |
+ "1.00 Angolan Readjusted Kwanza (1995-1999) random", |
+ "1.00 Angolan Kwanza random", |
+ "1.00 Angolan New Kwanza (1990-2000) random", |
+ "1.00 Angolan kwanza (1977-1991) random", |
+ "1.00 Angolan readjusted kwanza (1995-1999) random", |
+ "1.00 Angolan kwanza random", |
+ "1.00 Angolan kwanzas (1977-1991) random", |
+ "1.00 Angolan readjusted kwanzas (1995-1999) random", |
+ "1.00 Angolan kwanzas random", |
+ "1.00 Angolan new kwanza (1990-2000) random", |
+ "1.00 Angolan new kwanzas (1990-2000) random", |
+ "1.00 Argentine Austral random", |
+ "1.00 Argentine Peso (1983-1985) random", |
+ "1.00 Argentine Peso random", |
+ "1.00 Argentine austral random", |
+ "1.00 Argentine australs random", |
+ "1.00 Argentine peso (1983-1985) random", |
+ "1.00 Argentine peso random", |
+ "1.00 Argentine pesos (1983-1985) random", |
+ "1.00 Argentine pesos random", |
+ "1.00 Armenian Dram random", |
+ "1.00 Armenian dram random", |
+ "1.00 Armenian drams random", |
+ "1.00 Aruban Florin random", |
+ "1.00 Aruban florin random", |
+ "1.00 Australian Dollar random", |
+ "1.00 Australian dollar random", |
+ "1.00 Australian dollars random", |
+ "1.00 Austrian Schilling random", |
+ "1.00 Austrian schilling random", |
+ "1.00 Austrian schillings random", |
+ "1.00 Azerbaijani Manat (1993-2006) random", |
+ "1.00 Azerbaijani Manat random", |
+ "1.00 Azerbaijani manat (1993-2006) random", |
+ "1.00 Azerbaijani manat random", |
+ "1.00 Azerbaijani manats (1993-2006) random", |
+ "1.00 Azerbaijani manats random", |
+ "1.00 Bahamian Dollar random", |
+ "1.00 Bahamian dollar random", |
+ "1.00 Bahamian dollars random", |
+ "1.00 Bahraini Dinar random", |
+ "1.00 Bahraini dinar random", |
+ "1.00 Bahraini dinars random", |
+ "1.00 Bangladeshi Taka random", |
+ "1.00 Bangladeshi taka random", |
+ "1.00 Bangladeshi takas random", |
+ "1.00 Barbadian Dollar random", |
+ "1.00 Barbadian dollar random", |
+ "1.00 Barbadian dollars random", |
+ "1.00 Belarusian New Ruble (1994-1999) random", |
+ "1.00 Belarusian Ruble random", |
+ "1.00 Belarusian new ruble (1994-1999) random", |
+ "1.00 Belarusian new rubles (1994-1999) random", |
+ "1.00 Belarusian ruble random", |
+ "1.00 Belarusian rubles random", |
+ "1.00 Belgian Franc (convertible) random", |
+ "1.00 Belgian Franc (financial) random", |
+ "1.00 Belgian Franc random", |
+ "1.00 Belgian franc (convertible) random", |
+ "1.00 Belgian franc (financial) random", |
+ "1.00 Belgian franc random", |
+ "1.00 Belgian francs (convertible) random", |
+ "1.00 Belgian francs (financial) random", |
+ "1.00 Belgian francs random", |
+ "1.00 Belize Dollar random", |
+ "1.00 Belize dollar random", |
+ "1.00 Belize dollars random", |
+ "1.00 Bermudan Dollar random", |
+ "1.00 Bermudan dollar random", |
+ "1.00 Bermudan dollars random", |
+ "1.00 Bhutanese Ngultrum random", |
+ "1.00 Bhutanese ngultrum random", |
+ "1.00 Bhutanese ngultrums random", |
+ "1.00 Bolivian Mvdol random", |
+ "1.00 Bolivian Peso random", |
+ "1.00 Bolivian mvdol random", |
+ "1.00 Bolivian mvdols random", |
+ "1.00 Bolivian peso random", |
+ "1.00 Bolivian pesos random", |
+ "1.00 Bolivian Boliviano random", |
+ "1.00 Bolivian Boliviano random", |
+ "1.00 Bolivian Bolivianos random", |
+ "1.00 Bosnia-Herzegovina Convertible Mark random", |
+ "1.00 Bosnia-Herzegovina Dinar (1992-1994) random", |
+ "1.00 Bosnia-Herzegovina convertible mark random", |
+ "1.00 Bosnia-Herzegovina convertible marks random", |
+ "1.00 Bosnia-Herzegovina dinar (1992-1994) random", |
+ "1.00 Bosnia-Herzegovina dinars (1992-1994) random", |
+ "1.00 Botswanan Pula random", |
+ "1.00 Botswanan pula random", |
+ "1.00 Botswanan pulas random", |
+ "1.00 Brazilian New Cruzado (1989-1990) random", |
+ "1.00 Brazilian Cruzado (1986-1989) random", |
+ "1.00 Brazilian Cruzeiro (1990-1993) random", |
+ "1.00 Brazilian New Cruzeiro (1967-1986) random", |
+ "1.00 Brazilian Cruzeiro (1993-1994) random", |
+ "1.00 Brazilian Real random", |
+ "1.00 Brazilian new cruzado (1989-1990) random", |
+ "1.00 Brazilian new cruzados (1989-1990) random", |
+ "1.00 Brazilian cruzado (1986-1989) random", |
+ "1.00 Brazilian cruzados (1986-1989) random", |
+ "1.00 Brazilian cruzeiro (1990-1993) random", |
+ "1.00 Brazilian new cruzeiro (1967-1986) random", |
+ "1.00 Brazilian cruzeiro (1993-1994) random", |
+ "1.00 Brazilian cruzeiros (1990-1993) random", |
+ "1.00 Brazilian new cruzeiros (1967-1986) random", |
+ "1.00 Brazilian cruzeiros (1993-1994) random", |
+ "1.00 Brazilian real random", |
+ "1.00 Brazilian reals random", |
+ "1.00 British Pound Sterling random", |
+ "1.00 British pound sterling random", |
+ "1.00 British pounds sterling random", |
+ "1.00 Brunei Dollar random", |
+ "1.00 Brunei dollar random", |
+ "1.00 Brunei dollars random", |
+ "1.00 Bulgarian Hard Lev random", |
+ "1.00 Bulgarian Lev random", |
+ "1.00 Bulgarian Leva random", |
+ "1.00 Bulgarian hard lev random", |
+ "1.00 Bulgarian hard leva random", |
+ "1.00 Bulgarian lev random", |
+ "1.00 Burmese Kyat random", |
+ "1.00 Burmese kyat random", |
+ "1.00 Burmese kyats random", |
+ "1.00 Burundian Franc random", |
+ "1.00 Burundian franc random", |
+ "1.00 Burundian francs random", |
+ "1.00 Cambodian Riel random", |
+ "1.00 Cambodian riel random", |
+ "1.00 Cambodian riels random", |
+ "1.00 Canadian Dollar random", |
+ "1.00 Canadian dollar random", |
+ "1.00 Canadian dollars random", |
+ "1.00 Cape Verdean Escudo random", |
+ "1.00 Cape Verdean escudo random", |
+ "1.00 Cape Verdean escudos random", |
+ "1.00 Cayman Islands Dollar random", |
+ "1.00 Cayman Islands dollar random", |
+ "1.00 Cayman Islands dollars random", |
+ "1.00 Chilean Peso random", |
+ "1.00 Chilean Unit of Account (UF) random", |
+ "1.00 Chilean peso random", |
+ "1.00 Chilean pesos random", |
+ "1.00 Chilean unit of account (UF) random", |
+ "1.00 Chilean units of account (UF) random", |
+ "1.00 Chinese Yuan random", |
+ "1.00 Chinese yuan random", |
+ "1.00 Colombian Peso random", |
+ "1.00 Colombian peso random", |
+ "1.00 Colombian pesos random", |
+ "1.00 Comorian Franc random", |
+ "1.00 Comorian franc random", |
+ "1.00 Comorian francs random", |
+ "1.00 Congolese Franc Congolais random", |
+ "1.00 Congolese franc Congolais random", |
+ "1.00 Congolese francs Congolais random", |
+ "1.00 Costa Rican Col\\u00f3n random", |
+ "1.00 Costa Rican col\\u00f3n random", |
+ "1.00 Costa Rican col\\u00f3ns random", |
+ "1.00 Croatian Dinar random", |
+ "1.00 Croatian Kuna random", |
+ "1.00 Croatian dinar random", |
+ "1.00 Croatian dinars random", |
+ "1.00 Croatian kuna random", |
+ "1.00 Croatian kunas random", |
+ "1.00 Cuban Peso random", |
+ "1.00 Cuban peso random", |
+ "1.00 Cuban pesos random", |
+ "1.00 Cypriot Pound random", |
+ "1.00 Cypriot pound random", |
+ "1.00 Cypriot pounds random", |
+ "1.00 Czech Republic Koruna random", |
+ "1.00 Czech Republic koruna random", |
+ "1.00 Czech Republic korunas random", |
+ "1.00 Czechoslovak Hard Koruna random", |
+ "1.00 Czechoslovak hard koruna random", |
+ "1.00 Czechoslovak hard korunas random", |
+ "1.00 Danish Krone random", |
+ "1.00 Danish krone random", |
+ "1.00 Danish kroner random", |
+ "1.00 German Mark random", |
+ "1.00 German mark random", |
+ "1.00 German marks random", |
+ "1.00 Djiboutian Franc random", |
+ "1.00 Djiboutian franc random", |
+ "1.00 Djiboutian francs random", |
+ "1.00 Dominican Peso random", |
+ "1.00 Dominican peso random", |
+ "1.00 Dominican pesos random", |
+ "1.00 East Caribbean Dollar random", |
+ "1.00 East Caribbean dollar random", |
+ "1.00 East Caribbean dollars random", |
+ "1.00 East German Mark random", |
+ "1.00 East German mark random", |
+ "1.00 East German marks random", |
+ "1.00 Ecuadorian Sucre random", |
+ "1.00 Ecuadorian Unit of Constant Value random", |
+ "1.00 Ecuadorian sucre random", |
+ "1.00 Ecuadorian sucres random", |
+ "1.00 Ecuadorian unit of constant value random", |
+ "1.00 Ecuadorian units of constant value random", |
+ "1.00 Egyptian Pound random", |
+ "1.00 Egyptian pound random", |
+ "1.00 Egyptian pounds random", |
+ "1.00 Salvadoran Col\\u00f3n random", |
+ "1.00 Salvadoran col\\u00f3n random", |
+ "1.00 Salvadoran colones random", |
+ "1.00 Equatorial Guinean Ekwele random", |
+ "1.00 Equatorial Guinean ekwele random", |
+ "1.00 Eritrean Nakfa random", |
+ "1.00 Eritrean nakfa random", |
+ "1.00 Eritrean nakfas random", |
+ "1.00 Estonian Kroon random", |
+ "1.00 Estonian kroon random", |
+ "1.00 Estonian kroons random", |
+ "1.00 Ethiopian Birr random", |
+ "1.00 Ethiopian birr random", |
+ "1.00 Ethiopian birrs random", |
+ "1.00 European Composite Unit random", |
+ "1.00 European Currency Unit random", |
+ "1.00 European Monetary Unit random", |
+ "1.00 European Unit of Account (XBC) random", |
+ "1.00 European Unit of Account (XBD) random", |
+ "1.00 European composite unit random", |
+ "1.00 European composite units random", |
+ "1.00 European currency unit random", |
+ "1.00 European currency units random", |
+ "1.00 European monetary unit random", |
+ "1.00 European monetary units random", |
+ "1.00 European unit of account (XBC) random", |
+ "1.00 European unit of account (XBD) random", |
+ "1.00 European units of account (XBC) random", |
+ "1.00 European units of account (XBD) random", |
+ "1.00 Falkland Islands Pound random", |
+ "1.00 Falkland Islands pound random", |
+ "1.00 Falkland Islands pounds random", |
+ "1.00 Fijian Dollar random", |
+ "1.00 Fijian dollar random", |
+ "1.00 Fijian dollars random", |
+ "1.00 Finnish Markka random", |
+ "1.00 Finnish markka random", |
+ "1.00 Finnish markkas random", |
+ "1.00 French Franc random", |
+ "1.00 French Gold Franc random", |
+ "1.00 French UIC-Franc random", |
+ "1.00 French UIC-franc random", |
+ "1.00 French UIC-francs random", |
+ "1.00 French franc random", |
+ "1.00 French francs random", |
+ "1.00 French gold franc random", |
+ "1.00 French gold francs random", |
+ "1.00 Gambian Dalasi random", |
+ "1.00 Gambian dalasi random", |
+ "1.00 Gambian dalasis random", |
+ "1.00 Georgian Kupon Larit random", |
+ "1.00 Georgian Lari random", |
+ "1.00 Georgian kupon larit random", |
+ "1.00 Georgian kupon larits random", |
+ "1.00 Georgian lari random", |
+ "1.00 Georgian laris random", |
+ "1.00 Ghanaian Cedi (1979-2007) random", |
+ "1.00 Ghanaian Cedi random", |
+ "1.00 Ghanaian cedi (1979-2007) random", |
+ "1.00 Ghanaian cedi random", |
+ "1.00 Ghanaian cedis (1979-2007) random", |
+ "1.00 Ghanaian cedis random", |
+ "1.00 Gibraltar Pound random", |
+ "1.00 Gibraltar pound random", |
+ "1.00 Gibraltar pounds random", |
+ "1.00 Gold random", |
+ "1.00 Gold random", |
+ "1.00 Greek Drachma random", |
+ "1.00 Greek drachma random", |
+ "1.00 Greek drachmas random", |
+ "1.00 Guatemalan Quetzal random", |
+ "1.00 Guatemalan quetzal random", |
+ "1.00 Guatemalan quetzals random", |
+ "1.00 Guinean Franc random", |
+ "1.00 Guinean Syli random", |
+ "1.00 Guinean franc random", |
+ "1.00 Guinean francs random", |
+ "1.00 Guinean syli random", |
+ "1.00 Guinean sylis random", |
+ "1.00 Guinea-Bissau Peso random", |
+ "1.00 Guinea-Bissau peso random", |
+ "1.00 Guinea-Bissau pesos random", |
+ "1.00 Guyanaese Dollar random", |
+ "1.00 Guyanaese dollar random", |
+ "1.00 Guyanaese dollars random", |
+ "1.00 Haitian Gourde random", |
+ "1.00 Haitian gourde random", |
+ "1.00 Haitian gourdes random", |
+ "1.00 Honduran Lempira random", |
+ "1.00 Honduran lempira random", |
+ "1.00 Honduran lempiras random", |
+ "1.00 Hong Kong Dollar random", |
+ "1.00 Hong Kong dollar random", |
+ "1.00 Hong Kong dollars random", |
+ "1.00 Hungarian Forint random", |
+ "1.00 Hungarian forint random", |
+ "1.00 Hungarian forints random", |
+ "1.00 Icelandic Kr\\u00f3na random", |
+ "1.00 Icelandic kr\\u00f3na random", |
+ "1.00 Icelandic kr\\u00f3nur random", |
+ "1.00 Indian Rupee random", |
+ "1.00 Indian rupee random", |
+ "1.00 Indian rupees random", |
+ "1.00 Indonesian Rupiah random", |
+ "1.00 Indonesian rupiah random", |
+ "1.00 Indonesian rupiahs random", |
+ "1.00 Iranian Rial random", |
+ "1.00 Iranian rial random", |
+ "1.00 Iranian rials random", |
+ "1.00 Iraqi Dinar random", |
+ "1.00 Iraqi dinar random", |
+ "1.00 Iraqi dinars random", |
+ "1.00 Irish Pound random", |
+ "1.00 Irish pound random", |
+ "1.00 Irish pounds random", |
+ "1.00 Israeli Pound random", |
+ "1.00 Israeli new sheqel random", |
+ "1.00 Israeli pound random", |
+ "1.00 Israeli pounds random", |
+ "1.00 Italian Lira random", |
+ "1.00 Italian lira random", |
+ "1.00 Italian liras random", |
+ "1.00 Jamaican Dollar random", |
+ "1.00 Jamaican dollar random", |
+ "1.00 Jamaican dollars random", |
+ "1.00 Japanese Yen random", |
+ "1.00 Japanese yen random", |
+ "1.00 Jordanian Dinar random", |
+ "1.00 Jordanian dinar random", |
+ "1.00 Jordanian dinars random", |
+ "1.00 Kazakhstani Tenge random", |
+ "1.00 Kazakhstani tenge random", |
+ "1.00 Kazakhstani tenges random", |
+ "1.00 Kenyan Shilling random", |
+ "1.00 Kenyan shilling random", |
+ "1.00 Kenyan shillings random", |
+ "1.00 Kuwaiti Dinar random", |
+ "1.00 Kuwaiti dinar random", |
+ "1.00 Kuwaiti dinars random", |
+ "1.00 Kyrgystani Som random", |
+ "1.00 Kyrgystani som random", |
+ "1.00 Kyrgystani soms random", |
+ "1.00 Laotian Kip random", |
+ "1.00 Laotian kip random", |
+ "1.00 Laotian kips random", |
+ "1.00 Latvian Lats random", |
+ "1.00 Latvian Ruble random", |
+ "1.00 Latvian lats random", |
+ "1.00 Latvian lati random", |
+ "1.00 Latvian ruble random", |
+ "1.00 Latvian rubles random", |
+ "1.00 Lebanese Pound random", |
+ "1.00 Lebanese pound random", |
+ "1.00 Lebanese pounds random", |
+ "1.00 Lesotho Loti random", |
+ "1.00 Lesotho loti random", |
+ "1.00 Lesotho lotis random", |
+ "1.00 Liberian Dollar random", |
+ "1.00 Liberian dollar random", |
+ "1.00 Liberian dollars random", |
+ "1.00 Libyan Dinar random", |
+ "1.00 Libyan dinar random", |
+ "1.00 Libyan dinars random", |
+ "1.00 Lithuanian Litas random", |
+ "1.00 Lithuanian Talonas random", |
+ "1.00 Lithuanian litas random", |
+ "1.00 Lithuanian litai random", |
+ "1.00 Lithuanian talonas random", |
+ "1.00 Lithuanian talonases random", |
+ "1.00 Luxembourgian Convertible Franc random", |
+ "1.00 Luxembourg Financial Franc random", |
+ "1.00 Luxembourgian Franc random", |
+ "1.00 Luxembourgian convertible franc random", |
+ "1.00 Luxembourgian convertible francs random", |
+ "1.00 Luxembourg financial franc random", |
+ "1.00 Luxembourg financial francs random", |
+ "1.00 Luxembourgian franc random", |
+ "1.00 Luxembourgian francs random", |
+ "1.00 Macanese Pataca random", |
+ "1.00 Macanese pataca random", |
+ "1.00 Macanese patacas random", |
+ "1.00 Macedonian Denar random", |
+ "1.00 Macedonian denar random", |
+ "1.00 Macedonian denari random", |
+ "1.00 Malagasy Ariaries random", |
+ "1.00 Malagasy Ariary random", |
+ "1.00 Malagasy Ariary random", |
+ "1.00 Malagasy Franc random", |
+ "1.00 Malagasy franc random", |
+ "1.00 Malagasy francs random", |
+ "1.00 Malawian Kwacha random", |
+ "1.00 Malawian Kwacha random", |
+ "1.00 Malawian Kwachas random", |
+ "1.00 Malaysian Ringgit random", |
+ "1.00 Malaysian ringgit random", |
+ "1.00 Malaysian ringgits random", |
+ "1.00 Maldivian Rufiyaa random", |
+ "1.00 Maldivian rufiyaa random", |
+ "1.00 Maldivian rufiyaas random", |
+ "1.00 Malian Franc random", |
+ "1.00 Malian franc random", |
+ "1.00 Malian francs random", |
+ "1.00 Maltese Lira random", |
+ "1.00 Maltese Pound random", |
+ "1.00 Maltese lira random", |
+ "1.00 Maltese liras random", |
+ "1.00 Maltese pound random", |
+ "1.00 Maltese pounds random", |
+ "1.00 Mauritanian Ouguiya random", |
+ "1.00 Mauritanian ouguiya random", |
+ "1.00 Mauritanian ouguiyas random", |
+ "1.00 Mauritian Rupee random", |
+ "1.00 Mauritian rupee random", |
+ "1.00 Mauritian rupees random", |
+ "1.00 Mexican Peso random", |
+ "1.00 Mexican Silver Peso (1861-1992) random", |
+ "1.00 Mexican Investment Unit random", |
+ "1.00 Mexican peso random", |
+ "1.00 Mexican pesos random", |
+ "1.00 Mexican silver peso (1861-1992) random", |
+ "1.00 Mexican silver pesos (1861-1992) random", |
+ "1.00 Mexican investment unit random", |
+ "1.00 Mexican investment units random", |
+ "1.00 Moldovan Leu random", |
+ "1.00 Moldovan leu random", |
+ "1.00 Moldovan lei random", |
+ "1.00 Mongolian Tugrik random", |
+ "1.00 Mongolian tugrik random", |
+ "1.00 Mongolian tugriks random", |
+ "1.00 Moroccan Dirham random", |
+ "1.00 Moroccan Franc random", |
+ "1.00 Moroccan dirham random", |
+ "1.00 Moroccan dirhams random", |
+ "1.00 Moroccan franc random", |
+ "1.00 Moroccan francs random", |
+ "1.00 Mozambican Escudo random", |
+ "1.00 Mozambican Metical random", |
+ "1.00 Mozambican escudo random", |
+ "1.00 Mozambican escudos random", |
+ "1.00 Mozambican metical random", |
+ "1.00 Mozambican meticals random", |
+ "1.00 Myanma Kyat random", |
+ "1.00 Myanma kyat random", |
+ "1.00 Myanma kyats random", |
+ "1.00 Namibian Dollar random", |
+ "1.00 Namibian dollar random", |
+ "1.00 Namibian dollars random", |
+ "1.00 Nepalese Rupee random", |
+ "1.00 Nepalese rupee random", |
+ "1.00 Nepalese rupees random", |
+ "1.00 Netherlands Antillean Guilder random", |
+ "1.00 Netherlands Antillean guilder random", |
+ "1.00 Netherlands Antillean guilders random", |
+ "1.00 Dutch Guilder random", |
+ "1.00 Dutch guilder random", |
+ "1.00 Dutch guilders random", |
+ "1.00 Israeli New Sheqel random", |
+ "1.00 Israeli new sheqels random", |
+ "1.00 New Zealand Dollar random", |
+ "1.00 New Zealand dollar random", |
+ "1.00 New Zealand dollars random", |
+ "1.00 Nicaraguan C\\u00f3rdoba random", |
+ "1.00 Nicaraguan C\\u00f3rdoba (1988-1991) random", |
+ "1.00 Nicaraguan c\\u00f3rdoba random", |
+ "1.00 Nicaraguan c\\u00f3rdoba random", |
+ "1.00 Nicaraguan c\\u00f3rdoba (1988-1991) random", |
+ "1.00 Nicaraguan c\\u00f3rdobas (1988-1991) random", |
+ "1.00 Nigerian Naira random", |
+ "1.00 Nigerian naira random", |
+ "1.00 Nigerian nairas random", |
+ "1.00 North Korean Won random", |
+ "1.00 North Korean won random", |
+ "1.00 North Korean won random", |
+ "1.00 Norwegian Krone random", |
+ "1.00 Norwegian krone random", |
+ "1.00 Norwegian kroner random", |
+ "1.00 Mozambican Metical (1980-2006) random", |
+ "1.00 Mozambican metical (1980-2006) random", |
+ "1.00 Mozambican meticals (1980-2006) random", |
+ "1.00 Romanian Lei (1952-2006) random", |
+ "1.00 Romanian Leu (1952-2006) random", |
+ "1.00 Romanian leu (1952-2006) random", |
+ "1.00 Serbian Dinar (2002-2006) random", |
+ "1.00 Serbian dinar (2002-2006) random", |
+ "1.00 Serbian dinars (2002-2006) random", |
+ "1.00 Sudanese Dinar (1992-2007) random", |
+ "1.00 Sudanese Pound (1957-1998) random", |
+ "1.00 Sudanese dinar (1992-2007) random", |
+ "1.00 Sudanese dinars (1992-2007) random", |
+ "1.00 Sudanese pound (1957-1998) random", |
+ "1.00 Sudanese pounds (1957-1998) random", |
+ "1.00 Turkish Lira (1922-2005) random", |
+ "1.00 Turkish Lira (1922-2005) random", |
+ "1.00 Omani Rial random", |
+ "1.00 Omani rial random", |
+ "1.00 Omani rials random", |
+ "1.00 Pakistani Rupee random", |
+ "1.00 Pakistani rupee random", |
+ "1.00 Pakistani rupees random", |
+ "1.00 Palladium random", |
+ "1.00 Palladium random", |
+ "1.00 Panamanian Balboa random", |
+ "1.00 Panamanian balboa random", |
+ "1.00 Panamanian balboas random", |
+ "1.00 Papua New Guinean Kina random", |
+ "1.00 Papua New Guinean kina random", |
+ "1.00 Papua New Guinean kina random", |
+ "1.00 Paraguayan Guarani random", |
+ "1.00 Paraguayan guarani random", |
+ "1.00 Paraguayan guaranis random", |
+ "1.00 Peruvian Inti random", |
+ "1.00 Peruvian Nuevo Sol random", |
+ "1.00 Peruvian Sol (1863-1965) random", |
+ "1.00 Peruvian inti random", |
+ "1.00 Peruvian intis random", |
+ "1.00 Peruvian nuevo sol random", |
+ "1.00 Peruvian nuevos soles random", |
+ "1.00 Peruvian sol (1863-1965) random", |
+ "1.00 Peruvian soles (1863-1965) random", |
+ "1.00 Philippine Peso random", |
+ "1.00 Philippine peso random", |
+ "1.00 Philippine pesos random", |
+ "1.00 Platinum random", |
+ "1.00 Platinum random", |
+ "1.00 Polish Zloty (1950-1995) random", |
+ "1.00 Polish Zloty random", |
+ "1.00 Polish zlotys random", |
+ "1.00 Polish zloty (PLZ) random", |
+ "1.00 Polish zloty random", |
+ "1.00 Polish zlotys (PLZ) random", |
+ "1.00 Portuguese Escudo random", |
+ "1.00 Portuguese Guinea Escudo random", |
+ "1.00 Portuguese Guinea escudo random", |
+ "1.00 Portuguese Guinea escudos random", |
+ "1.00 Portuguese escudo random", |
+ "1.00 Portuguese escudos random", |
+ "1.00 Qatari Rial random", |
+ "1.00 Qatari rial random", |
+ "1.00 Qatari rials random", |
+ "1.00 RINET Funds random", |
+ "1.00 RINET Funds random", |
+ "1.00 Rhodesian Dollar random", |
+ "1.00 Rhodesian dollar random", |
+ "1.00 Rhodesian dollars random", |
+ "1.00 Romanian Leu random", |
+ "1.00 Romanian lei random", |
+ "1.00 Romanian leu random", |
+ "1.00 Russian Ruble (1991-1998) random", |
+ "1.00 Russian Ruble random", |
+ "1.00 Russian ruble (1991-1998) random", |
+ "1.00 Russian ruble random", |
+ "1.00 Russian rubles (1991-1998) random", |
+ "1.00 Russian rubles random", |
+ "1.00 Rwandan Franc random", |
+ "1.00 Rwandan franc random", |
+ "1.00 Rwandan francs random", |
+ "1.00 Saint Helena Pound random", |
+ "1.00 Saint Helena pound random", |
+ "1.00 Saint Helena pounds random", |
+ "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobra random", |
+ "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobra random", |
+ "1.00 S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe dobras random", |
+ "1.00 Saudi Riyal random", |
+ "1.00 Saudi riyal random", |
+ "1.00 Saudi riyals random", |
+ "1.00 Serbian Dinar random", |
+ "1.00 Serbian dinar random", |
+ "1.00 Serbian dinars random", |
+ "1.00 Seychellois Rupee random", |
+ "1.00 Seychellois rupee random", |
+ "1.00 Seychellois rupees random", |
+ "1.00 Sierra Leonean Leone random", |
+ "1.00 Sierra Leonean leone random", |
+ "1.00 Sierra Leonean leones random", |
+ "1.00 Singapore Dollar random", |
+ "1.00 Singapore dollar random", |
+ "1.00 Singapore dollars random", |
+ "1.00 Slovak Koruna random", |
+ "1.00 Slovak koruna random", |
+ "1.00 Slovak korunas random", |
+ "1.00 Slovenian Tolar random", |
+ "1.00 Slovenian tolar random", |
+ "1.00 Slovenian tolars random", |
+ "1.00 Solomon Islands Dollar random", |
+ "1.00 Solomon Islands dollar random", |
+ "1.00 Solomon Islands dollars random", |
+ "1.00 Somali Shilling random", |
+ "1.00 Somali shilling random", |
+ "1.00 Somali shillings random", |
+ "1.00 South African Rand (financial) random", |
+ "1.00 South African Rand random", |
+ "1.00 South African rand (financial) random", |
+ "1.00 South African rand random", |
+ "1.00 South African rands (financial) random", |
+ "1.00 South African rand random", |
+ "1.00 South Korean Won random", |
+ "1.00 South Korean won random", |
+ "1.00 South Korean won random", |
+ "1.00 Soviet Rouble random", |
+ "1.00 Soviet rouble random", |
+ "1.00 Soviet roubles random", |
+ "1.00 Spanish Peseta (A account) random", |
+ "1.00 Spanish Peseta (convertible account) random", |
+ "1.00 Spanish Peseta random", |
+ "1.00 Spanish peseta (A account) random", |
+ "1.00 Spanish peseta (convertible account) random", |
+ "1.00 Spanish peseta random", |
+ "1.00 Spanish pesetas (A account) random", |
+ "1.00 Spanish pesetas (convertible account) random", |
+ "1.00 Spanish pesetas random", |
+ "1.00 Special Drawing Rights random", |
+ "1.00 Sri Lankan Rupee random", |
+ "1.00 Sri Lankan rupee random", |
+ "1.00 Sri Lankan rupees random", |
+ "1.00 Sudanese Pound random", |
+ "1.00 Sudanese pound random", |
+ "1.00 Sudanese pounds random", |
+ "1.00 Surinamese Dollar random", |
+ "1.00 Surinamese dollar random", |
+ "1.00 Surinamese dollars random", |
+ "1.00 Surinamese Guilder random", |
+ "1.00 Surinamese guilder random", |
+ "1.00 Surinamese guilders random", |
+ "1.00 Swazi Lilangeni random", |
+ "1.00 Swazi lilangeni random", |
+ "1.00 Swazi emalangeni random", |
+ "1.00 Swedish Krona random", |
+ "1.00 Swedish krona random", |
+ "1.00 Swedish kronor random", |
+ "1.00 Swiss Franc random", |
+ "1.00 Swiss franc random", |
+ "1.00 Swiss francs random", |
+ "1.00 Syrian Pound random", |
+ "1.00 Syrian pound random", |
+ "1.00 Syrian pounds random", |
+ "1.00 New Taiwan Dollar random", |
+ "1.00 New Taiwan dollar random", |
+ "1.00 New Taiwan dollars random", |
+ "1.00 Tajikistani Ruble random", |
+ "1.00 Tajikistani Somoni random", |
+ "1.00 Tajikistani ruble random", |
+ "1.00 Tajikistani rubles random", |
+ "1.00 Tajikistani somoni random", |
+ "1.00 Tajikistani somonis random", |
+ "1.00 Tanzanian Shilling random", |
+ "1.00 Tanzanian shilling random", |
+ "1.00 Tanzanian shillings random", |
+ "1.00 Testing Currency Code random", |
+ "1.00 Testing Currency Code random", |
+ "1.00 Thai Baht random", |
+ "1.00 Thai baht random", |
+ "1.00 Thai baht random", |
+ "1.00 Timorese Escudo random", |
+ "1.00 Timorese escudo random", |
+ "1.00 Timorese escudos random", |
+ "1.00 Trinidad and Tobago Dollar random", |
+ "1.00 Trinidad and Tobago dollar random", |
+ "1.00 Trinidad and Tobago dollars random", |
+ "1.00 Tunisian Dinar random", |
+ "1.00 Tunisian dinar random", |
+ "1.00 Tunisian dinars random", |
+ "1.00 Turkish Lira random", |
+ "1.00 Turkish Lira random", |
+ "1.00 Turkish lira random", |
+ "1.00 Turkmenistani Manat random", |
+ "1.00 Turkmenistani manat random", |
+ "1.00 Turkmenistani manat random", |
+ "1.00 US Dollar (Next day) random", |
+ "1.00 US Dollar (Same day) random", |
+ "1.00 US Dollar random", |
+ "1.00 US dollar (next day) random", |
+ "1.00 US dollar (same day) random", |
+ "1.00 US dollar random", |
+ "1.00 US dollars (next day) random", |
+ "1.00 US dollars (same day) random", |
+ "1.00 US dollars random", |
+ "1.00 Ugandan Shilling (1966-1987) random", |
+ "1.00 Ugandan Shilling random", |
+ "1.00 Ugandan shilling (1966-1987) random", |
+ "1.00 Ugandan shilling random", |
+ "1.00 Ugandan shillings (1966-1987) random", |
+ "1.00 Ugandan shillings random", |
+ "1.00 Ukrainian Hryvnia random", |
+ "1.00 Ukrainian Karbovanets random", |
+ "1.00 Ukrainian hryvnia random", |
+ "1.00 Ukrainian hryvnias random", |
+ "1.00 Ukrainian karbovanets random", |
+ "1.00 Ukrainian karbovantsiv random", |
+ "1.00 Colombian Real Value Unit random", |
+ "1.00 United Arab Emirates Dirham random", |
+ "1.00 Unknown Currency random", |
+ "1.00 Uruguayan Peso (1975-1993) random", |
+ "1.00 Uruguayan Peso random", |
+ "1.00 Uruguayan Peso (Indexed Units) random", |
+ "1.00 Uruguayan peso (1975-1993) random", |
+ "1.00 Uruguayan peso (indexed units) random", |
+ "1.00 Uruguayan peso random", |
+ "1.00 Uruguayan pesos (1975-1993) random", |
+ "1.00 Uruguayan pesos (indexed units) random", |
+ "1.00 Uzbekistan Som random", |
+ "1.00 Uzbekistan som random", |
+ "1.00 Uzbekistan som random", |
+ "1.00 Vanuatu Vatu random", |
+ "1.00 Vanuatu vatu random", |
+ "1.00 Vanuatu vatus random", |
+ "1.00 Venezuelan Bol\\u00edvar random", |
+ "1.00 Venezuelan Bol\\u00edvar (1871-2008) random", |
+ "1.00 Venezuelan bol\\u00edvar random", |
+ "1.00 Venezuelan bol\\u00edvars random", |
+ "1.00 Venezuelan bol\\u00edvar (1871-2008) random", |
+ "1.00 Venezuelan bol\\u00edvars (1871-2008) random", |
+ "1.00 Vietnamese Dong random", |
+ "1.00 Vietnamese dong random", |
+ "1.00 Vietnamese dong random", |
+ "1.00 WIR Euro random", |
+ "1.00 WIR Franc random", |
+ "1.00 WIR euro random", |
+ "1.00 WIR euros random", |
+ "1.00 WIR franc random", |
+ "1.00 WIR francs random", |
+ "1.00 Samoan Tala random", |
+ "1.00 Samoan tala random", |
+ "1.00 Samoan tala random", |
+ "1.00 Yemeni Dinar random", |
+ "1.00 Yemeni Rial random", |
+ "1.00 Yemeni dinar random", |
+ "1.00 Yemeni dinars random", |
+ "1.00 Yemeni rial random", |
+ "1.00 Yemeni rials random", |
+ "1.00 Yugoslavian Convertible Dinar (1990-1992) random", |
+ "1.00 Yugoslavian Hard Dinar (1966-1990) random", |
+ "1.00 Yugoslavian New Dinar (1994-2002) random", |
+ "1.00 Yugoslavian convertible dinar (1990-1992) random", |
+ "1.00 Yugoslavian convertible dinars (1990-1992) random", |
+ "1.00 Yugoslavian hard dinar (1966-1990) random", |
+ "1.00 Yugoslavian hard dinars (1966-1990) random", |
+ "1.00 Yugoslavian new dinar (1994-2002) random", |
+ "1.00 Yugoslavian new dinars (1994-2002) random", |
+ "1.00 Zairean New Zaire (1993-1998) random", |
+ "1.00 Zairean Zaire (1971-1993) random", |
+ "1.00 Zairean new zaire (1993-1998) random", |
+ "1.00 Zairean new zaires (1993-1998) random", |
+ "1.00 Zairean zaire (1971-1993) random", |
+ "1.00 Zairean zaires (1971-1993) random", |
+ "1.00 Zambian Kwacha random", |
+ "1.00 Zambian kwacha random", |
+ "1.00 Zambian kwachas random", |
+ "1.00 Zimbabwean Dollar (1980-2008) random", |
+ "1.00 Zimbabwean dollar (1980-2008) random", |
+ "1.00 Zimbabwean dollars (1980-2008) random", |
+ "1.00 euro random", |
+ "1.00 euros random", |
+ "1.00 Turkish lira (1922-2005) random", |
+ "1.00 special drawing rights random", |
+ "1.00 Colombian real value unit random", |
+ "1.00 Colombian real value units random", |
+ "1.00 unknown/invalid currency random", |
+ }; |
+ |
+ const char* WRONG_DATA[] = { |
+ // Following are missing one last char in the currency name |
+ "usd1.00", // case sensitive |
+ "1.00 Nicaraguan Cordob", |
+ "1.00 Namibian Dolla", |
+ "1.00 Namibian dolla", |
+ "1.00 Nepalese Rupe", |
+ "1.00 Nepalese rupe", |
+ "1.00 Netherlands Antillean Guilde", |
+ "1.00 Netherlands Antillean guilde", |
+ "1.00 Dutch Guilde", |
+ "1.00 Dutch guilde", |
+ "1.00 Israeli New Sheqe", |
+ "1.00 New Zealand Dolla", |
+ "1.00 New Zealand dolla", |
+ "1.00 Nicaraguan cordob", |
+ "1.00 Nigerian Nair", |
+ "1.00 Nigerian nair", |
+ "1.00 North Korean Wo", |
+ "1.00 North Korean wo", |
+ "1.00 Norwegian Kron", |
+ "1.00 Norwegian kron", |
+ "1.00 US dolla", |
+ "1.00", |
+ "A1.00", |
+ "AD1.00", |
+ "AE1.00", |
+ "AF1.00", |
+ "AL1.00", |
+ "AM1.00", |
+ "AN1.00", |
+ "AO1.00", |
+ "AR1.00", |
+ "AT1.00", |
+ "AU1.00", |
+ "AW1.00", |
+ "AZ1.00", |
+ "Afghan Afghan1.00", |
+ "Afghan Afghani (1927-20021.00", |
+ "Afl1.00", |
+ "Albanian Le1.00", |
+ "Algerian Dina1.00", |
+ "Andorran Peset1.00", |
+ "Angolan Kwanz1.00", |
+ "Angolan Kwanza (1977-19901.00", |
+ "Angolan Readjusted Kwanza (1995-19991.00", |
+ "Angolan New Kwanza (1990-20001.00", |
+ "Argentine Austra1.00", |
+ "Argentine Pes1.00", |
+ "Argentine Peso (1983-19851.00", |
+ "Armenian Dra1.00", |
+ "Aruban Flori1.00", |
+ "Australian Dolla1.00", |
+ "Austrian Schillin1.00", |
+ "Azerbaijani Mana1.00", |
+ "Azerbaijani Manat (1993-20061.00", |
+ "B1.00", |
+ "BA1.00", |
+ "BB1.00", |
+ "BE1.00", |
+ "BG1.00", |
+ "BH1.00", |
+ "BI1.00", |
+ "BM1.00", |
+ "BN1.00", |
+ "BO1.00", |
+ "BR1.00", |
+ "BS1.00", |
+ "BT1.00", |
+ "BU1.00", |
+ "BW1.00", |
+ "BY1.00", |
+ "BZ1.00", |
+ "Bahamian Dolla1.00", |
+ "Bahraini Dina1.00", |
+ "Bangladeshi Tak1.00", |
+ "Barbadian Dolla1.00", |
+ "Bds1.00", |
+ "Belarusian New Ruble (1994-19991.00", |
+ "Belarusian Rubl1.00", |
+ "Belgian Fran1.00", |
+ "Belgian Franc (convertible1.00", |
+ "Belgian Franc (financial1.00", |
+ "Belize Dolla1.00", |
+ "Bermudan Dolla1.00", |
+ "Bhutanese Ngultru1.00", |
+ "Bolivian Mvdo1.00", |
+ "Bolivian Pes1.00", |
+ "Bolivian Bolivian1.00", |
+ "Bosnia-Herzegovina Convertible Mar1.00", |
+ "Bosnia-Herzegovina Dina1.00", |
+ "Botswanan Pul1.00", |
+ "Brazilian Cruzad1.00", |
+ "Brazilian Cruzado Nov1.00", |
+ "Brazilian Cruzeir1.00", |
+ "Brazilian Cruzeiro (1990-19931.00", |
+ "Brazilian New Cruzeiro (1967-19861.00", |
+ "Brazilian Rea1.00", |
+ "British Pound Sterlin1.00", |
+ "Brunei Dolla1.00", |
+ "Bulgarian Hard Le1.00", |
+ "Bulgarian Le1.00", |
+ "Burmese Kya1.00", |
+ "Burundian Fran1.00", |
+ "C1.00", |
+ "CA1.00", |
+ "CD1.00", |
+ "CFA Franc BCEA1.00", |
+ "CFA Franc BEA1.00", |
+ "CFP Fran1.00", |
+ "CFP1.00", |
+ "CH1.00", |
+ "CL1.00", |
+ "CN1.00", |
+ "CO1.00", |
+ "CS1.00", |
+ "CU1.00", |
+ "CV1.00", |
+ "CY1.00", |
+ "CZ1.00", |
+ "Cambodian Rie1.00", |
+ "Canadian Dolla1.00", |
+ "Cape Verdean Escud1.00", |
+ "Cayman Islands Dolla1.00", |
+ "Chilean Pes1.00", |
+ "Chilean Unit of Accoun1.00", |
+ "Chinese Yua1.00", |
+ "Colombian Pes1.00", |
+ "Comoro Fran1.00", |
+ "Congolese Fran1.00", |
+ "Costa Rican Col\\u00f31.00", |
+ "Croatian Dina1.00", |
+ "Croatian Kun1.00", |
+ "Cuban Pes1.00", |
+ "Cypriot Poun1.00", |
+ "Czech Republic Korun1.00", |
+ "Czechoslovak Hard Korun1.00", |
+ "D1.00", |
+ "DD1.00", |
+ "DE1.00", |
+ "DJ1.00", |
+ "DK1.00", |
+ "DO1.00", |
+ "DZ1.00", |
+ "Danish Kron1.00", |
+ "German Mar1.00", |
+ "Djiboutian Fran1.00", |
+ "Dk1.00", |
+ "Dominican Pes1.00", |
+ "EC1.00", |
+ "EE1.00", |
+ "EG1.00", |
+ "EQ1.00", |
+ "ER1.00", |
+ "ES1.00", |
+ "ET1.00", |
+ "EU1.00", |
+ "East Caribbean Dolla1.00", |
+ "East German Ostmar1.00", |
+ "Ecuadorian Sucr1.00", |
+ "Ecuadorian Unit of Constant Valu1.00", |
+ "Egyptian Poun1.00", |
+ "Ekwel1.00", |
+ "Salvadoran Col\\u00f31.00", |
+ "Equatorial Guinean Ekwel1.00", |
+ "Eritrean Nakf1.00", |
+ "Es1.00", |
+ "Estonian Kroo1.00", |
+ "Ethiopian Bir1.00", |
+ "Eur1.00", |
+ "European Composite Uni1.00", |
+ "European Currency Uni1.00", |
+ "European Monetary Uni1.00", |
+ "European Unit of Account (XBC1.00", |
+ "European Unit of Account (XBD1.00", |
+ "F1.00", |
+ "FB1.00", |
+ "FI1.00", |
+ "FJ1.00", |
+ "FK1.00", |
+ "FR1.00", |
+ "Falkland Islands Poun1.00", |
+ "Fd1.00", |
+ "Fijian Dolla1.00", |
+ "Finnish Markk1.00", |
+ "Fr1.00", |
+ "French Fran1.00", |
+ "French Gold Fran1.00", |
+ "French UIC-Fran1.00", |
+ "G1.00", |
+ "GB1.00", |
+ "GE1.00", |
+ "GH1.00", |
+ "GI1.00", |
+ "GM1.00", |
+ "GN1.00", |
+ "GQ1.00", |
+ "GR1.00", |
+ "GT1.00", |
+ "GW1.00", |
+ "GY1.00", |
+ "Gambian Dalas1.00", |
+ "Georgian Kupon Lari1.00", |
+ "Georgian Lar1.00", |
+ "Ghanaian Ced1.00", |
+ "Ghanaian Cedi (1979-20071.00", |
+ "Gibraltar Poun1.00", |
+ "Gol1.00", |
+ "Greek Drachm1.00", |
+ "Guatemalan Quetza1.00", |
+ "Guinean Fran1.00", |
+ "Guinean Syl1.00", |
+ "Guinea-Bissau Pes1.00", |
+ "Guyanaese Dolla1.00", |
+ "HK1.00", |
+ "HN1.00", |
+ "HR1.00", |
+ "HT1.00", |
+ "HU1.00", |
+ "Haitian Gourd1.00", |
+ "Honduran Lempir1.00", |
+ "Hong Kong Dolla1.00", |
+ "Hungarian Forin1.00", |
+ "I1.00", |
+ "IE1.00", |
+ "IL1.00", |
+ "IN1.00", |
+ "IQ1.00", |
+ "IR1.00", |
+ "IS1.00", |
+ "IT1.00", |
+ "Icelandic Kron1.00", |
+ "Indian Rupe1.00", |
+ "Indonesian Rupia1.00", |
+ "Iranian Ria1.00", |
+ "Iraqi Dina1.00", |
+ "Irish Poun1.00", |
+ "Israeli Poun1.00", |
+ "Italian Lir1.00", |
+ "J1.00", |
+ "JM1.00", |
+ "JO1.00", |
+ "JP1.00", |
+ "Jamaican Dolla1.00", |
+ "Japanese Ye1.00", |
+ "Jordanian Dina1.00", |
+ "K S1.00", |
+ "K1.00", |
+ "KE1.00", |
+ "KG1.00", |
+ "KH1.00", |
+ "KP1.00", |
+ "KR1.00", |
+ "KW1.00", |
+ "KY1.00", |
+ "KZ1.00", |
+ "Kazakhstani Teng1.00", |
+ "Kenyan Shillin1.00", |
+ "Kuwaiti Dina1.00", |
+ "Kyrgystani So1.00", |
+ "LA1.00", |
+ "LB1.00", |
+ "LK1.00", |
+ "LR1.00", |
+ "LT1.00", |
+ "LU1.00", |
+ "LV1.00", |
+ "LY1.00", |
+ "Laotian Ki1.00", |
+ "Latvian Lat1.00", |
+ "Latvian Rubl1.00", |
+ "Lebanese Poun1.00", |
+ "Lesotho Lot1.00", |
+ "Liberian Dolla1.00", |
+ "Libyan Dina1.00", |
+ "Lithuanian Lit1.00", |
+ "Lithuanian Talona1.00", |
+ "Luxembourgian Convertible Fran1.00", |
+ "Luxembourg Financial Fran1.00", |
+ "Luxembourgian Fran1.00", |
+ "MA1.00", |
+ "MD1.00", |
+ "MDe1.00", |
+ "MEX1.00", |
+ "MG1.00", |
+ "ML1.00", |
+ "MM1.00", |
+ "MN1.00", |
+ "MO1.00", |
+ "MR1.00", |
+ "MT1.00", |
+ "MU1.00", |
+ "MV1.00", |
+ "MW1.00", |
+ "MX1.00", |
+ "MY1.00", |
+ "MZ1.00", |
+ "Macanese Patac1.00", |
+ "Macedonian Dena1.00", |
+ "Malagasy Ariar1.00", |
+ "Malagasy Fran1.00", |
+ "Malawian Kwach1.00", |
+ "Malaysian Ringgi1.00", |
+ "Maldivian Rufiya1.00", |
+ "Malian Fran1.00", |
+ "Malot1.00", |
+ "Maltese Lir1.00", |
+ "Maltese Poun1.00", |
+ "Mauritanian Ouguiy1.00", |
+ "Mauritian Rupe1.00", |
+ "Mexican Pes1.00", |
+ "Mexican Silver Peso (1861-19921.00", |
+ "Mexican Investment Uni1.00", |
+ "Moldovan Le1.00", |
+ "Mongolian Tugri1.00", |
+ "Moroccan Dirha1.00", |
+ "Moroccan Fran1.00", |
+ "Mozambican Escud1.00", |
+ "Mozambican Metica1.00", |
+ "Myanma Kya1.00", |
+ "N1.00", |
+ "NA1.00", |
+ "NAf1.00", |
+ "NG1.00", |
+ "NI1.00", |
+ "NK1.00", |
+ "NL1.00", |
+ "NO1.00", |
+ "NP1.00", |
+ "NT1.00", |
+ "Namibian Dolla1.00", |
+ "Nepalese Rupe1.00", |
+ "Netherlands Antillean Guilde1.00", |
+ "Dutch Guilde1.00", |
+ "Israeli New Sheqe1.00", |
+ "New Zealand Dolla1.00", |
+ "Nicaraguan C\\u00f3rdoba (1988-19911.00", |
+ "Nicaraguan C\\u00f3rdob1.00", |
+ "Nigerian Nair1.00", |
+ "North Korean Wo1.00", |
+ "Norwegian Kron1.00", |
+ "Nr1.00", |
+ "OM1.00", |
+ "Old Mozambican Metica1.00", |
+ "Romanian Leu (1952-20061.00", |
+ "Serbian Dinar (2002-20061.00", |
+ "Sudanese Dinar (1992-20071.00", |
+ "Sudanese Pound (1957-19981.00", |
+ "Turkish Lira (1922-20051.00", |
+ "Omani Ria1.00", |
+ "PA1.00", |
+ "PE1.00", |
+ "PG1.00", |
+ "PH1.00", |
+ "PK1.00", |
+ "PL1.00", |
+ "PT1.00", |
+ "PY1.00", |
+ "Pakistani Rupe1.00", |
+ "Palladiu1.00", |
+ "Panamanian Balbo1.00", |
+ "Papua New Guinean Kin1.00", |
+ "Paraguayan Guaran1.00", |
+ "Peruvian Int1.00", |
+ "Peruvian Sol (1863-19651.00", |
+ "Peruvian Sol Nuev1.00", |
+ "Philippine Pes1.00", |
+ "Platinu1.00", |
+ "Polish Zlot1.00", |
+ "Polish Zloty (1950-19951.00", |
+ "Portuguese Escud1.00", |
+ "Portuguese Guinea Escud1.00", |
+ "Pr1.00", |
+ "QA1.00", |
+ "Qatari Ria1.00", |
+ "RD1.00", |
+ "RH1.00", |
+ "RINET Fund1.00", |
+ "RS1.00", |
+ "RU1.00", |
+ "RW1.00", |
+ "Rb1.00", |
+ "Rhodesian Dolla1.00", |
+ "Romanian Le1.00", |
+ "Russian Rubl1.00", |
+ "Russian Ruble (1991-19981.00", |
+ "Rwandan Fran1.00", |
+ "S1.00", |
+ "SA1.00", |
+ "SB1.00", |
+ "SC1.00", |
+ "SD1.00", |
+ "SE1.00", |
+ "SG1.00", |
+ "SH1.00", |
+ "SI1.00", |
+ "SK1.00", |
+ "SL R1.00", |
+ "SL1.00", |
+ "SO1.00", |
+ "ST1.00", |
+ "SU1.00", |
+ "SV1.00", |
+ "SY1.00", |
+ "SZ1.00", |
+ "Saint Helena Poun1.00", |
+ "S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe Dobr1.00", |
+ "Saudi Riya1.00", |
+ "Serbian Dina1.00", |
+ "Seychellois Rupe1.00", |
+ "Sh1.00", |
+ "Sierra Leonean Leon1.00", |
+ "Silve1.00", |
+ "Singapore Dolla1.00", |
+ "Slovak Korun1.00", |
+ "Slovenian Tola1.00", |
+ "Solomon Islands Dolla1.00", |
+ "Somali Shillin1.00", |
+ "South African Ran1.00", |
+ "South African Rand (financial1.00", |
+ "South Korean Wo1.00", |
+ "Soviet Roubl1.00", |
+ "Spanish Peset1.00", |
+ "Spanish Peseta (A account1.00", |
+ "Spanish Peseta (convertible account1.00", |
+ "Special Drawing Right1.00", |
+ "Sri Lankan Rupe1.00", |
+ "Sudanese Poun1.00", |
+ "Surinamese Dolla1.00", |
+ "Surinamese Guilde1.00", |
+ "Swazi Lilangen1.00", |
+ "Swedish Kron1.00", |
+ "Swiss Fran1.00", |
+ "Syrian Poun1.00", |
+ "T S1.00", |
+ "TH1.00", |
+ "TJ1.00", |
+ "TM1.00", |
+ "TN1.00", |
+ "TO1.00", |
+ "TP1.00", |
+ "TR1.00", |
+ "TT1.00", |
+ "TW1.00", |
+ "TZ1.00", |
+ "New Taiwan Dolla1.00", |
+ "Tajikistani Rubl1.00", |
+ "Tajikistani Somon1.00", |
+ "Tanzanian Shillin1.00", |
+ "Testing Currency Cod1.00", |
+ "Thai Bah1.00", |
+ "Timorese Escud1.00", |
+ "Tongan Pa\\u20bbang1.00", |
+ "Trinidad and Tobago Dolla1.00", |
+ "Tunisian Dina1.00", |
+ "Turkish Lir1.00", |
+ "Turkmenistani Mana1.00", |
+ "U S1.00", |
+ "U1.00", |
+ "UA1.00", |
+ "UG1.00", |
+ "US Dolla1.00", |
+ "US Dollar (Next day1.00", |
+ "US Dollar (Same day1.00", |
+ "US1.00", |
+ "UY1.00", |
+ "UZ1.00", |
+ "Ugandan Shillin1.00", |
+ "Ugandan Shilling (1966-19871.00", |
+ "Ukrainian Hryvni1.00", |
+ "Ukrainian Karbovanet1.00", |
+ "Colombian Real Value Uni1.00", |
+ "United Arab Emirates Dirha1.00", |
+ "Unknown Currenc1.00", |
+ "Ur1.00", |
+ "Uruguay Peso (1975-19931.00", |
+ "Uruguay Peso Uruguay1.00", |
+ "Uruguay Peso (Indexed Units1.00", |
+ "Uzbekistan So1.00", |
+ "V1.00", |
+ "VE1.00", |
+ "VN1.00", |
+ "VU1.00", |
+ "Vanuatu Vat1.00", |
+ "Venezuelan Bol\\u00edva1.00", |
+ "Venezuelan Bol\\u00edvar Fuert1.00", |
+ "Vietnamese Don1.00", |
+ "WIR Eur1.00", |
+ "WIR Fran1.00", |
+ "WS1.00", |
+ "Samoa Tal1.00", |
+ "XA1.00", |
+ "XB1.00", |
+ "XC1.00", |
+ "XD1.00", |
+ "XE1.00", |
+ "XF1.00", |
+ "XO1.00", |
+ "XP1.00", |
+ "XR1.00", |
+ "XT1.00", |
+ "XX1.00", |
+ "YD1.00", |
+ "YE1.00", |
+ "YU1.00", |
+ "Yemeni Dina1.00", |
+ "Yemeni Ria1.00", |
+ "Yugoslavian Convertible Dina1.00", |
+ "Yugoslavian Hard Dinar (1966-19901.00", |
+ "Yugoslavian New Dina1.00", |
+ "Z1.00", |
+ "ZA1.00", |
+ "ZM1.00", |
+ "ZR1.00", |
+ "ZW1.00", |
+ "Zairean New Zaire (1993-19981.00", |
+ "Zairean Zair1.00", |
+ "Zambian Kwach1.00", |
+ "Zimbabwean Dollar (1980-20081.00", |
+ "dra1.00", |
+ "lar1.00", |
+ "le1.00", |
+ "man1.00", |
+ "so1.00", |
+ }; |
+ |
+ Locale locale("en_US"); |
+ for (uint32_t i=0; i<sizeof(DATA)/sizeof(DATA[0]); ++i) { |
+ UnicodeString formatted = ctou(DATA[i]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* numFmt = NumberFormat::createInstance(locale, NumberFormat::kCurrencyStyle, status); |
+ Formattable parseResult; |
+ if (numFmt != NULL && U_SUCCESS(status)) { |
+ numFmt->parse(formatted, parseResult, status); |
+ if (U_FAILURE(status) || |
+ (parseResult.getType() == Formattable::kDouble && |
+ parseResult.getDouble() != 1.0)) { |
+ errln("wrong parsing, " + formatted); |
+ errln("data: " + formatted); |
+ } |
+ } else { |
+ dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); |
+ delete numFmt; |
+ break; |
+ } |
+ delete numFmt; |
+ } |
+ |
+ for (uint32_t i=0; i<sizeof(WRONG_DATA)/sizeof(WRONG_DATA[0]); ++i) { |
+ UnicodeString formatted = ctou(WRONG_DATA[i]); |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat* numFmt = NumberFormat::createInstance(locale, NumberFormat::kCurrencyStyle, status); |
+ Formattable parseResult; |
+ if (numFmt != NULL && U_SUCCESS(status)) { |
+ numFmt->parse(formatted, parseResult, status); |
+ if (!U_FAILURE(status) || |
+ (parseResult.getType() == Formattable::kDouble && |
+ parseResult.getDouble() == 1.0)) { |
+ errln("parsed but should not be: " + formatted); |
+ errln("data: " + formatted); |
+ } |
+ } else { |
+ dataerrln("Unable to create NumberFormat. - %s", u_errorName(status)); |
+ delete numFmt; |
+ break; |
+ } |
+ delete numFmt; |
+ } |
+} |
+ |
+const char* attrString(int32_t); |
+ |
+// UnicodeString s; |
+// std::string ss; |
+// std::cout << s.toUTF8String(ss) |
+void NumberFormatTest::expectPositions(FieldPositionIterator& iter, int32_t *values, int32_t tupleCount, |
+ const UnicodeString& str) { |
+ UBool found[10]; |
+ FieldPosition fp; |
+ |
+ if (tupleCount > 10) { |
+ assertTrue("internal error, tupleCount too large", FALSE); |
+ } else { |
+ for (int i = 0; i < tupleCount; ++i) { |
+ found[i] = FALSE; |
+ } |
+ } |
+ |
+ logln(str); |
+ while (iter.next(fp)) { |
+ UBool ok = FALSE; |
+ int32_t id = fp.getField(); |
+ int32_t start = fp.getBeginIndex(); |
+ int32_t limit = fp.getEndIndex(); |
+ |
+ // is there a logln using printf? |
+ char buf[128]; |
+ sprintf(buf, "%24s %3d %3d %3d", attrString(id), id, start, limit); |
+ logln(buf); |
+ |
+ for (int i = 0; i < tupleCount; ++i) { |
+ if (found[i]) { |
+ continue; |
+ } |
+ if (values[i*3] == id && |
+ values[i*3+1] == start && |
+ values[i*3+2] == limit) { |
+ found[i] = ok = TRUE; |
+ break; |
+ } |
+ } |
+ |
+ assertTrue((UnicodeString)"found [" + id + "," + start + "," + limit + "]", ok); |
+ } |
+ |
+ // check that all were found |
+ UBool ok = TRUE; |
+ for (int i = 0; i < tupleCount; ++i) { |
+ if (!found[i]) { |
+ ok = FALSE; |
+ assertTrue((UnicodeString) "missing [" + values[i*3] + "," + values[i*3+1] + "," + values[i*3+2] + "]", found[i]); |
+ } |
+ } |
+ assertTrue("no expected values were missing", ok); |
+} |
+ |
+void NumberFormatTest::expectPosition(FieldPosition& pos, int32_t id, int32_t start, int32_t limit, |
+ const UnicodeString& str) { |
+ logln(str); |
+ assertTrue((UnicodeString)"id " + id + " == " + pos.getField(), id == pos.getField()); |
+ assertTrue((UnicodeString)"begin " + start + " == " + pos.getBeginIndex(), start == pos.getBeginIndex()); |
+ assertTrue((UnicodeString)"end " + limit + " == " + pos.getEndIndex(), limit == pos.getEndIndex()); |
+} |
+ |
+void NumberFormatTest::TestFieldPositionIterator() { |
+ // bug 7372 |
+ UErrorCode status = U_ZERO_ERROR; |
+ FieldPositionIterator iter1; |
+ FieldPositionIterator iter2; |
+ FieldPosition pos; |
+ |
+ DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(status); |
+ if (failure(status, "NumberFormat::createInstance", TRUE)) return; |
+ |
+ double num = 1234.56; |
+ UnicodeString str1; |
+ UnicodeString str2; |
+ |
+ assertTrue((UnicodeString)"self==", iter1 == iter1); |
+ assertTrue((UnicodeString)"iter1==iter2", iter1 == iter2); |
+ |
+ decFmt->format(num, str1, &iter1, status); |
+ assertTrue((UnicodeString)"iter1 != iter2", iter1 != iter2); |
+ decFmt->format(num, str2, &iter2, status); |
+ assertTrue((UnicodeString)"iter1 == iter2 (2)", iter1 == iter2); |
+ iter1.next(pos); |
+ assertTrue((UnicodeString)"iter1 != iter2 (2)", iter1 != iter2); |
+ iter2.next(pos); |
+ assertTrue((UnicodeString)"iter1 == iter2 (3)", iter1 == iter2); |
+ |
+ // should format ok with no iterator |
+ str2.remove(); |
+ decFmt->format(num, str2, NULL, status); |
+ assertEquals("null fpiter", str1, str2); |
+ |
+ delete decFmt; |
+} |
+ |
+void NumberFormatTest::TestFormatAttributes() { |
+ Locale locale("en_US"); |
+ UErrorCode status = U_ZERO_ERROR; |
+ DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, NumberFormat::kCurrencyStyle, status); |
+ if (failure(status, "NumberFormat::createInstance", TRUE)) return; |
+ double val = 12345.67; |
+ |
+ { |
+ int32_t expected[] = { |
+ NumberFormat::kCurrencyField, 0, 1, |
+ NumberFormat::kGroupingSeparatorField, 3, 4, |
+ NumberFormat::kIntegerField, 1, 7, |
+ NumberFormat::kDecimalSeparatorField, 7, 8, |
+ NumberFormat::kFractionField, 8, 10, |
+ }; |
+ int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); |
+ |
+ FieldPositionIterator posIter; |
+ UnicodeString result; |
+ decFmt->format(val, result, &posIter, status); |
+ expectPositions(posIter, expected, tupleCount, result); |
+ } |
+ { |
+ FieldPosition fp(NumberFormat::kIntegerField); |
+ UnicodeString result; |
+ decFmt->format(val, result, fp); |
+ expectPosition(fp, NumberFormat::kIntegerField, 1, 7, result); |
+ } |
+ { |
+ FieldPosition fp(NumberFormat::kFractionField); |
+ UnicodeString result; |
+ decFmt->format(val, result, fp); |
+ expectPosition(fp, NumberFormat::kFractionField, 8, 10, result); |
+ } |
+ delete decFmt; |
+ |
+ decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, NumberFormat::kScientificStyle, status); |
+ val = -0.0000123; |
+ { |
+ int32_t expected[] = { |
+ NumberFormat::kSignField, 0, 1, |
+ NumberFormat::kIntegerField, 1, 2, |
+ NumberFormat::kDecimalSeparatorField, 2, 3, |
+ NumberFormat::kFractionField, 3, 5, |
+ NumberFormat::kExponentSymbolField, 5, 6, |
+ NumberFormat::kExponentSignField, 6, 7, |
+ NumberFormat::kExponentField, 7, 8 |
+ }; |
+ int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected)); |
+ |
+ FieldPositionIterator posIter; |
+ UnicodeString result; |
+ decFmt->format(val, result, &posIter, status); |
+ expectPositions(posIter, expected, tupleCount, result); |
+ } |
+ { |
+ FieldPosition fp(NumberFormat::kIntegerField); |
+ UnicodeString result; |
+ decFmt->format(val, result, fp); |
+ expectPosition(fp, NumberFormat::kIntegerField, 1, 2, result); |
+ } |
+ { |
+ FieldPosition fp(NumberFormat::kFractionField); |
+ UnicodeString result; |
+ decFmt->format(val, result, fp); |
+ expectPosition(fp, NumberFormat::kFractionField, 3, 5, result); |
+ } |
+ delete decFmt; |
+ |
+ fflush(stderr); |
+} |
+ |
+const char* attrString(int32_t attrId) { |
+ switch (attrId) { |
+ case NumberFormat::kIntegerField: return "integer"; |
+ case NumberFormat::kFractionField: return "fraction"; |
+ case NumberFormat::kDecimalSeparatorField: return "decimal separator"; |
+ case NumberFormat::kExponentSymbolField: return "exponent symbol"; |
+ case NumberFormat::kExponentSignField: return "exponent sign"; |
+ case NumberFormat::kExponentField: return "exponent"; |
+ case NumberFormat::kGroupingSeparatorField: return "grouping separator"; |
+ case NumberFormat::kCurrencyField: return "currency"; |
+ case NumberFormat::kPercentField: return "percent"; |
+ case NumberFormat::kPermillField: return "permille"; |
+ case NumberFormat::kSignField: return "sign"; |
+ default: return ""; |
+ } |
+} |
+ |
+// |
+// Test formatting & parsing of big decimals. |
+// API test, not a comprehensive test. |
+// See DecimalFormatTest/DataDrivenTests |
+// |
+#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) errln("file %s, line %d: status: %s", \ |
+ __FILE__, __LINE__, u_errorName(status));} |
+#define ASSERT_EQUALS(expected, actual) {if ((expected) != (actual)) \ |
+ errln("file %s, line %d: %s != %s", __FILE__, __LINE__, #expected, #actual);} |
+ |
+static UBool operator != (const char *s1, UnicodeString &s2) { |
+ // This function lets ASSERT_EQUALS("literal", UnicodeString) work. |
+ UnicodeString us1(s1); |
+ return us1 != s2; |
+} |
+ |
+void NumberFormatTest::TestDecimal() { |
+ { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable f("12.345678999987654321E666", status); |
+ ASSERT_SUCCESS(status); |
+ StringPiece s = f.getDecimalNumber(status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("1.2345678999987654321E+667", s); |
+ //printf("%s\n", s.data()); |
+ } |
+ |
+ { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable f1("this is not a number", status); |
+ ASSERT_EQUALS(U_DECIMAL_NUMBER_SYNTAX_ERROR, status); |
+ } |
+ |
+ { |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable f; |
+ f.setDecimalNumber("123.45", status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS( Formattable::kDouble, f.getType()); |
+ ASSERT_EQUALS(123.45, f.getDouble()); |
+ ASSERT_EQUALS(123.45, f.getDouble(status)); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("123.45", f.getDecimalNumber(status)); |
+ ASSERT_SUCCESS(status); |
+ |
+ f.setDecimalNumber("4.5678E7", status); |
+ int32_t n; |
+ n = f.getLong(); |
+ ASSERT_EQUALS(45678000, n); |
+ |
+ status = U_ZERO_ERROR; |
+ f.setDecimalNumber("-123", status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS( Formattable::kLong, f.getType()); |
+ ASSERT_EQUALS(-123, f.getLong()); |
+ ASSERT_EQUALS(-123, f.getLong(status)); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("-123", f.getDecimalNumber(status)); |
+ ASSERT_SUCCESS(status); |
+ |
+ status = U_ZERO_ERROR; |
+ f.setDecimalNumber("1234567890123", status); // Number too big for 32 bits |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS( Formattable::kInt64, f.getType()); |
+ ASSERT_EQUALS(1234567890123LL, f.getInt64()); |
+ ASSERT_EQUALS(1234567890123LL, f.getInt64(status)); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("1234567890123", f.getDecimalNumber(status)); |
+ ASSERT_SUCCESS(status); |
+ } |
+ |
+ { |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *fmtr = NumberFormat::createInstance( |
+ Locale::getUS(), NumberFormat::kNumberStyle, status); |
+ if (U_FAILURE(status) || fmtr == NULL) { |
+ dataerrln("Unable to create NumberFormat"); |
+ } else { |
+ UnicodeString formattedResult; |
+ StringPiece num("244444444444444444444444444444444444446.4"); |
+ fmtr->format(num, formattedResult, NULL, status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); |
+ //std::string ss; std::cout << formattedResult.toUTF8String(ss); |
+ delete fmtr; |
+ } |
+ } |
+ |
+ { |
+ // Check formatting a DigitList. DigitList is internal, but this is |
+ // a critical interface that must work. |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *fmtr = NumberFormat::createInstance( |
+ Locale::getUS(), NumberFormat::kNumberStyle, status); |
+ if (U_FAILURE(status) || fmtr == NULL) { |
+ dataerrln("Unable to create NumberFormat"); |
+ } else { |
+ UnicodeString formattedResult; |
+ DigitList dl; |
+ StringPiece num("123.4566666666666666666666666666666666621E+40"); |
+ dl.set(num, status); |
+ ASSERT_SUCCESS(status); |
+ fmtr->format(dl, formattedResult, NULL, status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); |
+ |
+ status = U_ZERO_ERROR; |
+ num.set("666.666"); |
+ dl.set(num, status); |
+ FieldPosition pos(NumberFormat::FRACTION_FIELD); |
+ ASSERT_SUCCESS(status); |
+ formattedResult.remove(); |
+ fmtr->format(dl, formattedResult, pos, status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS("666.666", formattedResult); |
+ ASSERT_EQUALS(4, pos.getBeginIndex()); |
+ ASSERT_EQUALS(7, pos.getEndIndex()); |
+ delete fmtr; |
+ } |
+ } |
+ |
+ { |
+ // Check a parse with a formatter with a multiplier. |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *fmtr = NumberFormat::createInstance( |
+ Locale::getUS(), NumberFormat::kPercentStyle, status); |
+ if (U_FAILURE(status) || fmtr == NULL) { |
+ dataerrln("Unable to create NumberFormat"); |
+ } else { |
+ UnicodeString input = "1.84%"; |
+ Formattable result; |
+ fmtr->parse(input, result, status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS(0, strcmp("0.0184", result.getDecimalNumber(status).data())); |
+ //std::cout << result.getDecimalNumber(status).data(); |
+ delete fmtr; |
+ } |
+ } |
+ |
+ { |
+ // Check that a parse returns a decimal number with full accuracy |
+ UErrorCode status = U_ZERO_ERROR; |
+ NumberFormat *fmtr = NumberFormat::createInstance( |
+ Locale::getUS(), NumberFormat::kNumberStyle, status); |
+ if (U_FAILURE(status) || fmtr == NULL) { |
+ dataerrln("Unable to create NumberFormat"); |
+ } else { |
+ UnicodeString input = "1.002200044400088880000070000"; |
+ Formattable result; |
+ fmtr->parse(input, result, status); |
+ ASSERT_SUCCESS(status); |
+ ASSERT_EQUALS(0, strcmp("1.00220004440008888000007", result.getDecimalNumber(status).data())); |
+ ASSERT_EQUALS(1.00220004440008888, result.getDouble()); |
+ //std::cout << result.getDecimalNumber(status).data(); |
+ delete fmtr; |
+ } |
+ } |
+ |
+} |
+ |
+void NumberFormatTest::TestCurrencyFractionDigits() { |
+ UErrorCode status = U_ZERO_ERROR; |
+ UnicodeString text1, text2; |
+ double value = 99.12345; |
+ |
+ // Create currenct instance |
+ NumberFormat* fmt = NumberFormat::createCurrencyInstance("ja_JP", status); |
+ if (U_FAILURE(status) || fmt == NULL) { |
+ dataerrln("Unable to create NumberFormat"); |
+ } else { |
+ fmt->format(value, text1); |
+ |
+ // Reset the same currency and format the test value again |
+ fmt->setCurrency(fmt->getCurrency(), status); |
+ ASSERT_SUCCESS(status); |
+ fmt->format(value, text2); |
+ |
+ if (text1 != text2) { |
+ errln((UnicodeString)"NumberFormat::format() should return the same result - text1=" |
+ + text1 + " text2=" + text2); |
+ } |
+ delete fmt; |
+ } |
+} |
+ |
+void NumberFormatTest::TestExponentParse() { |
+ |
+ UErrorCode status = U_ZERO_ERROR; |
+ Formattable result; |
+ ParsePosition parsePos(0); |
+ |
+ // set the exponent symbol |
+ status = U_ZERO_ERROR; |
+ DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(), status); |
+ if(U_FAILURE(status)) { |
+ dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Default)"); |
+ return; |
+ } |
+ symbols->setSymbol(DecimalFormatSymbols::kExponentialSymbol,"e"); |
+ |
+ // create format instance |
+ status = U_ZERO_ERROR; |
+ DecimalFormat fmt("#####", symbols, status); |
+ if(U_FAILURE(status)) { |
+ errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, symbols*)"); |
+ } |
+ |
+ // parse the text |
+ fmt.parse("123E4", result, parsePos); |
+ if(result.getType() != Formattable::kDouble && |
+ result.getDouble() != (double)123 && |
+ parsePos.getIndex() != 3 |
+ ) |
+ { |
+ errln("ERROR: parse failed - expected 123.0, 3 - returned %d, %i", |
+ result.getDouble(), parsePos.getIndex()); |
+ } |
+} |
+ |
+#endif /* #if !UCONFIG_NO_FORMATTING */ |
Property changes on: icu46/source/test/intltest/numfmtst.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |