scuffed-code/icu4c/source/test/intltest/numfmtst.cpp

5756 lines
196 KiB
C++
Raw Normal View History

/********************************************************************
* COPYRIGHT:
* Copyright (c) 1997-2009, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
/* Modification History:
1999-08-16 21:50:52 +00:00
* Date Name Description
* 07/15/99 helena Ported to HPUX 10/11 CC.
*/
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
1999-08-16 21:50:52 +00:00
#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"
//#define NUMFMTST_CACHE_DEBUG 1
#ifdef NUMFMTST_CACHE_DEBUG
#include "stdio.h"
#endif
//#define NUMFMTST_DEBUG 1
#ifdef NUMFMTST_DEBUG
#include "stdio.h"
#endif
static const UChar EUR[] = {69,85,82,0}; // "EUR"
static const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD"
1999-08-16 21:50:52 +00:00
// *****************************************************************************
// class NumberFormatTest
// *****************************************************************************
#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
1999-08-16 21:50:52 +00:00
#define CHECK(status,str) if (U_FAILURE(status)) { errln(UnicodeString("FAIL: ") + str); return; }
1999-08-16 21:50:52 +00:00
void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
1999-08-16 21:50:52 +00:00
{
// 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);
1999-08-16 21:50:52 +00:00
// 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);
1999-08-16 21:50:52 +00:00
CASE(14,TestCurrencyObject);
CASE(15,TestCurrencyPatterns);
//CASE(16,TestDigitList);
CASE(16,TestWhiteSpaceParsing);
CASE(17,TestComplexCurrency);
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);
1999-08-16 21:50:52 +00:00
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)) {
errln("unable to create format object");
}
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");
}
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, ,)");
};
}
1999-08-16 21:50:52 +00:00
// Test various patterns
void
NumberFormatTest::TestPatterns(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
DecimalFormatSymbols sym(Locale::getUS(), status);
if (U_FAILURE(status)) { errln("FAIL: Could not construct DecimalFormatSymbols"); return; }
1999-08-16 21:50:52 +00:00
const char* pat[] = { "#.#", "#.", ".#", "#" };
int32_t pat_length = (int32_t)(sizeof(pat) / sizeof(pat[0]));
1999-08-16 21:50:52 +00:00
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;
1999-08-16 21:50:52 +00:00
DecimalFormat fmt(pat[i], sym, status);
if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: DecimalFormat constructor failed for " + pat[i]); continue; }
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
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 ");
}
}
*/
1999-08-16 21:50:52 +00:00
// -------------------------------------
// Test exponential pattern
void
NumberFormatTest::TestExponential(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
DecimalFormatSymbols sym(Locale::getUS(), status);
if (U_FAILURE(status)) { errln("FAIL: Bad status returned by DecimalFormatSymbols ct"); 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
1999-08-16 21:50:52 +00:00
double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 };
int32_t val_length = (int32_t)(sizeof(val) / sizeof(val[0]));
const char* valFormat[] =
1999-08-16 21:50:52 +00:00
{
// 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[] =
1999-08-16 21:50:52 +00:00
{
// 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; }
1999-08-16 21:50:52 +00:00
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())
1999-08-16 21:50:52 +00:00
{
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]);
}
1999-08-16 21:50:52 +00:00
}
else {
1999-08-16 21:50:52 +00:00
errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a);
errln((UnicodeString)" should be (" + s.length() + " chars) -> " + valParse[v+ival]);
}
1999-08-16 21:50:52 +00:00
}
for (v=0; v<lval_length; ++v)
{
UnicodeString s;
(*(NumberFormat*)&fmt).format(lval[v], s);
1999-08-16 21:50:52 +00:00
logln((UnicodeString)" " + lval[v] + "L -format-> " + s);
if (s != lvalFormat[v+ilval])
errln((UnicodeString)"ERROR: Expected " + lvalFormat[v+ilval] + " Got: " + s);
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
}
else
errln((UnicodeString)"FAIL: Non-long Formattable returned for " + s
+ " Double: " + af.getDouble()
+ ", Long: " + af.getLong());
1999-08-16 21:50:52 +00:00
}
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");
}
}*/
}
1999-08-16 21:50:52 +00:00
// -------------------------------------
// Test the handling of quotes
void
NumberFormatTest::TestQuotes(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
1999-08-16 21:50:52 +00:00
UnicodeString *pat;
DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), status);
1999-08-16 21:50:52 +00:00
pat = new UnicodeString("a'fo''o'b#");
DecimalFormat *fmt = new DecimalFormat(*pat, *sym, status);
UnicodeString s;
((NumberFormat*)fmt)->format((int32_t)123, s);
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
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)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale::getUS(), status);
1999-08-16 21:50:52 +00:00
UnicodeString pat;
UChar currency = 0x00A4;
// "\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);
1999-08-16 21:50:52 +00:00
logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\"");
logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s));
if (s != "$1,234.56") errln((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") errln((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);
1999-08-16 21:50:52 +00:00
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") errln((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") errln((UnicodeString)"FAIL: Expected USD -1,234.56");
delete fmt;
delete sym;
if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)status);
1999-08-16 21:50:52 +00:00
}
// -------------------------------------
static UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); }
1999-08-16 21:50:52 +00:00
UnicodeString&
NumberFormatTest::escape(UnicodeString& s)
{
UnicodeString buf;
for (int32_t i=0; i<s.length(); ++i)
1999-08-16 21:50:52 +00:00
{
UChar c = s[(int32_t)i];
1999-08-16 21:50:52 +00:00
if (c <= (UChar)0x7F) buf += c;
else {
buf += (UChar)0x5c; buf += (UChar)0x55;
1999-08-16 21:50:52 +00:00
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", "\\u20A4\\u00A01.150" },
{"pt_PT_PREEURO", "1,150$50\\u00A0Esc."},
{"en_US@currency=JPY", "\\u00A51,150"}
};
1999-08-16 21:50:52 +00:00
/**
* Test localized currency patterns.
*/
void
NumberFormatTest::TestCurrency(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status);
if (U_FAILURE(status)) {
dataerrln("Error calling NumberFormat::createCurrencyInstance()");
return;
}
1999-08-16 21:50:52 +00:00
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>$");
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
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");
1999-08-16 21:50:52 +00:00
delete currencyFmt;
s.truncate(0);
len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status);
1999-08-16 21:50:52 +00:00
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");
1999-08-16 21:50:52 +00:00
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;
}
1999-08-16 21:50:52 +00:00
}
// -------------------------------------
/**
* 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)) {
errln("FAIL: getCurrencyInstance(US)");
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, "Fr.1,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 sFr."); // 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;
}
// -------------------------------------
1999-08-16 21:50:52 +00:00
/**
* Do rudimentary testing of parsing.
*/
void
NumberFormatTest::TestParse(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
1999-08-16 21:50:52 +00:00
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)) errln((UnicodeString)"FAIL: Status " + (int32_t)status);
1999-08-16 21:50:52 +00:00
//}
//catch(Exception e) {
// errln((UnicodeString)"Exception caught: " + e);
//}
}
// -------------------------------------
/**
* Test proper rounding by the format method.
*/
void
NumberFormatTest::TestRounding487(void)
1999-08-16 21:50:52 +00:00
{
UErrorCode status = U_ZERO_ERROR;
1999-08-16 21:50:52 +00:00
NumberFormat *nf = NumberFormat::createInstance(status);
if (U_FAILURE(status)) {
dataerrln("Error calling NumberFormat::createInstance()");
return;
}
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
}
/**
* 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(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)) {
errln("FAIL: Constructor");
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;
}
1999-08-16 21:50:52 +00:00
// -------------------------------------
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);
1999-08-16 21:50:52 +00:00
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");
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
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]));
1999-08-16 21:50:52 +00:00
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),
1999-08-16 21:50:52 +00:00
12345.0,
"1.2345E4", status);
expect(new DecimalFormat("0E0", US, status),
12345.0,
"1E4", status);
expect2(NumberFormat::createScientificInstance(Locale::getUS(), status),
1999-08-16 21:50:52 +00:00
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),
1999-08-16 21:50:52 +00:00
(int32_t) 12345,
"12.345E3", status);
expect2(NumberFormat::createScientificInstance(Locale::getFrance(), status),
1999-08-16 21:50:52 +00:00
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),
1999-08-16 21:50:52 +00:00
780.e-9,
"780E-9", status);
expect(new DecimalFormat(".###E0", US, status),
45678.0,
".457E5", status);
expect2(new DecimalFormat(".###E0", US, status),
1999-08-16 21:50:52 +00:00
(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),
1999-08-16 21:50:52 +00:00
(int32_t) 45678000, "4.5678E7", status);
expect2(new DecimalFormat("##E0", US, status),
1999-08-16 21:50:52 +00:00
(int32_t) 45678000, "45.678E6", status);
expect2(new DecimalFormat("####E0", US, status),
1999-08-16 21:50:52 +00:00
(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),
1999-08-16 21:50:52 +00:00
0.0000123, "12.3E-6", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
0.000123, "123E-6", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
0.00123, "1.23E-3", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
0.0123, "12.3E-3", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
0.123, "123E-3", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
1.23, "1.23E0", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
12.3, "12.3E0", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
123.0, "123E0", status);
expect2(new DecimalFormat("###E0", US, status),
1999-08-16 21:50:52 +00:00
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),
1999-08-16 21:50:52 +00:00
0.00012, "1.2E-04", status);
expect2(new DecimalFormat("0.#E+00", US, status),
1999-08-16 21:50:52 +00:00
(int32_t) 12000, "1.2E+04", status);
}
/**
* Upgrade to alphaWorks
*/
void NumberFormatTest::TestPad(void) {
UErrorCode status = U_ZERO_ERROR;
DecimalFormatSymbols US(Locale::getUS(), status);
1999-08-16 21:50:52 +00:00
CHECK(status, "DecimalFormatSymbols constructor");
expect2(new DecimalFormat("*^##.##", US, status),
1999-08-16 21:50:52 +00:00
int32_t(0), "^^^^0", status);
expect2(new DecimalFormat("*^##.##", US, status),
1999-08-16 21:50:52 +00:00
-1.3, "^-1.3", status);
expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
1999-08-16 21:50:52 +00:00
int32_t(0), "0.0E0______ g-m/s^2", status);
expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
1999-08-16 21:50:52 +00:00
1.0/3, "333.333E-3_ g-m/s^2", status);
expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
1999-08-16 21:50:52 +00:00
int32_t(0), "0.0______ g-m/s^2", status);
expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
1999-08-16 21:50:52 +00:00
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);
*/
1999-08-16 21:50:52 +00:00
}
/**
* Upgrade to alphaWorks
*/
void NumberFormatTest::TestPatterns2(void) {
UErrorCode status = U_ZERO_ERROR;
DecimalFormatSymbols US(Locale::getUS(), status);
1999-08-16 21:50:52 +00:00
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);
1999-08-16 21:50:52 +00:00
expectPad(fmt, "$*^$#", ILLEGAL);
expectPad(fmt, "#$*^$", ILLEGAL);
expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat::kPadBeforeSuffix,
12, (UChar)0x0078 /*x*/);
1999-08-16 21:50:52 +00:00
expectPad(fmt, "''#0*x", DecimalFormat::kPadBeforeSuffix,
3, (UChar)0x0078 /*x*/);
1999-08-16 21:50:52 +00:00
expectPad(fmt, "'I''ll'*a###.##", DecimalFormat::kPadAfterPrefix,
10, (UChar)0x0061 /*a*/);
1999-08-16 21:50:52 +00:00
fmt.applyPattern("AA#,##0.00ZZ", status);
CHECK(status, "applyPattern");
fmt.setPadCharacter(hat);
1999-08-16 21:50:52 +00:00
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", "");
1999-08-16 21:50:52 +00:00
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);
custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero);
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
if (nf->getDynamicClassID() == DecimalFormat::getStaticClassID()) {
DecimalFormat* df = (DecimalFormat*) nf;
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)) {
errln("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;
// 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)));
assertEquals("USD.getName(LONG_NAME)",
UnicodeString("US Dollar"),
UnicodeString(ucurr_getName(USD, "en",
UCURR_LONG_NAME,
&isChoiceFormat, &len, &ec)));
assertEquals("CAD.getName(SYMBOL_NAME)",
UnicodeString("CA$"),
UnicodeString(ucurr_getName(CAD, "en",
UCURR_SYMBOL_NAME,
&isChoiceFormat, &len, &ec)));
assertEquals("CAD.getName(SYMBOL_NAME)",
UnicodeString("$"),
UnicodeString(ucurr_getName(CAD, "en_CA",
UCURR_SYMBOL_NAME,
&isChoiceFormat, &len, &ec)));
assertEquals("USD.getName(SYMBOL_NAME)",
UnicodeString("US$"),
UnicodeString(ucurr_getName(USD, "en_AU",
UCURR_SYMBOL_NAME,
&isChoiceFormat, &len, &ec)));
assertEquals("CAD.getName(SYMBOL_NAME)",
UnicodeString("CA$"),
UnicodeString(ucurr_getName(CAD, "en_AU",
UCURR_SYMBOL_NAME,
&isChoiceFormat, &len, &ec)));
assertEquals("USX.getName(LONG_NAME)",
UnicodeString("USX"),
UnicodeString(ucurr_getName(USX, "en_US",
UCURR_LONG_NAME,
&isChoiceFormat, &len, &ec)));
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 (fallback)",
U_USING_FALLBACK_WARNING == ec, TRUE);
ucurr_getName(CAD, "zh_TW", UCURR_LONG_NAME, &isChoiceFormat,
&len, &ec);
assertTrue("ucurr_getName (fallback)",
U_USING_FALLBACK_WARNING == ec, TRUE);
ucurr_getName(CAD, "en_US", UCURR_LONG_NAME, &isChoiceFormat,
&len, &ec);
assertTrue("ucurr_getName (default)",
U_USING_DEFAULT_WARNING == ec, TRUE);
ucurr_getName(CAD, "vi", UCURR_LONG_NAME, &isChoiceFormat,
&len, &ec);
assertTrue("ucurr_getName (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 (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)) {
errln("Fail: DecimalFormatSymbols constructor");
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 {
errln("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 {
errln("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 {
errln("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 {
errln("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("[DATA] 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(tok));
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(mloc)), 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 {
errln("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 (U_FAILURE(status)) {
errln("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)) {
errln(UnicodeString("FAIL: Parse failed for \"") + str + "\"");
return;
}
UnicodeString pat;
((DecimalFormat*) &fmt)->toPattern(pat);
if (equalValue(num, n)) {
logln(UnicodeString("Ok \"") + str + "\" x " +
pat + " = " +
toString(num));
} else {
errln(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 + "\"");
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) + " x " +
escape(pat) + " = \"" +
escape(saw) + "\", expected \"" + exp + "\"");
}
}
void NumberFormatTest::expect(NumberFormat* fmt, const Formattable& n,
const UnicodeString& exp,
UErrorCode status) {
if (U_FAILURE(status)) {
errln("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)){
errln("Could not create currency formatter for locale %s", localeID);
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)) {
errln("FAIL: Can't create number instance for host");
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;
}
}
}
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)) {
errln("FAIL: Can't create Relative date instance");
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)){
errln("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)) {
errln("Unable to create decimal formatter.");
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);
// TODO: change all the following int64_t tests once BigInteger is ported
// (right now the big numbers get turned into doubles and lose tons of accuracy)
static const char* posOutOfRange = "9223372036854780000";
static const char* negOutOfRange = "-9223372036854780000";
expect(df, U_INT64_MIN, posOutOfRange);
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, negOutOfRange);
df.setMultiplier(-7);
expect(df, -(U_INT64_MAX/7)-1, posOutOfRange);
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=hebrew");
Locale loc3("en", "US", "", "numbers=persian");
Locale loc4("en", "US", "", "numbers=foobar");
NumberFormat* fmt1= NumberFormat::createInstance(loc1, ec);
if (U_FAILURE(ec)) {
errln("FAIL: getInstance(en_US@numbers=thai)");
}
NumberFormat* fmt2= NumberFormat::createInstance(loc2, ec);
if (U_FAILURE(ec)) {
errln("FAIL: getInstance(en_US@numbers=hebrew)");
}
NumberFormat* fmt3= NumberFormat::createInstance(loc3, ec);
if (U_FAILURE(ec)) {
errln("FAIL: getInstance(en_US@numbers=persian)");
}
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"));
// 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");
}
delete fmt1;
delete fmt2;
delete fmt3;
}
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"
};
for (uint32_t i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) {
UnicodeString stringToBeParsed = ctou(formats[i]);
Formattable result;
UErrorCode status = U_ZERO_ERROR;
curFmt->parseObject(stringToBeParsed, result, status);
if (U_FAILURE(status)) {
errln("FAIL: measure format parsing");
}
if (result.getType() != Formattable::kObject ||
result.getObject()->getDynamicClassID() != CurrencyAmount::getStaticClassID() ||
((CurrencyAmount*)result.getObject())->getNumber().getDouble() != 1234.56 ||
UnicodeString(((CurrencyAmount*)result.getObject())->getISOCurrency()).compare(ISO_CURRENCY_USD)) {
errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number ");
if (((CurrencyAmount*)result.getObject())->getNumber().getDouble() != 1234.56) {
errln((UnicodeString)"wong number, expect: 1234.56" + ", got: " + ((CurrencyAmount*)result.getObject())->getNumber().getDouble());
}
if (((CurrencyAmount*)result.getObject())->getISOCurrency() != ISO_CURRENCY_USD) {
errln((UnicodeString)"wong currency, expect: USD" + ", got: " + ((CurrencyAmount*)result.getObject())->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
{"ti_ET", "-1.23", "USD", "-US$1.23", "-USD1.23", "-1.23 USD"},
// test choice format
{"es_AR", "1", "INR", "Re.\\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;
errln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k);
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");
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_PK", "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\\u00a0US$", "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", "US$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;
errln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k);
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",
"A$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",
"Afghani (1927-2002)1.00",
"Afghani (AFA)1.00",
"Afghani1.00",
"Afghani1.00",
"Afghanis (AFA)1.00",
"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-1990)1.00",
"Angolan Kwanza Reajustado (1995-1999)1.00",
"Angolan Kwanza1.00",
"Angolan New Kwanza (1990-2000)1.00",
"Angolan kwanza (AOK)1.00",
"Angolan kwanza reajustado (AOR)1.00",
"Angolan kwanza1.00",
"Angolan kwanzas (AOK)1.00",
"Angolan kwanzas reajustado (AOR)1.00",
"Angolan kwanzas1.00",
"Angolan new kwanza (AON)1.00",
"Angolan new kwanzas (AON)1.00",
"Argentine Austral1.00",
"Argentine Peso (1983-1985)1.00",
"Argentine Peso1.00",
"Argentine austral1.00",
"Argentine australs1.00",
"Argentine peso (ARP)1.00",
"Argentine peso1.00",
"Argentine pesos (ARP)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",
"Azerbaijanian Manat (1993-2006)1.00",
"Azerbaijanian Manat1.00",
"Azerbaijanian manat (AZM)1.00",
"Azerbaijanian manat1.00",
"Azerbaijanian manats (AZM)1.00",
"Azerbaijanian manats1.00",
"B$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",
"Barbados Dollar1.00",
"Barbados dollar1.00",
"Barbados dollars1.00",
"Bds$1.00",
"Be1.00",
"Belarussian New Ruble (1994-1999)1.00",
"Belarussian Ruble1.00",
"Belarussian new ruble (BYB)1.00",
"Belarussian new rubles (BYB)1.00",
"Belarussian ruble1.00",
"Belarussian 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",
"Bhutan Ngultrum1.00",
"Bhutan ngultrum1.00",
"Bhutan ngultrums1.00",
"Bolivian Mvdol1.00",
"Bolivian Peso1.00",
"Bolivian mvdol1.00",
"Bolivian mvdols1.00",
"Bolivian peso1.00",
"Bolivian pesos1.00",
"Boliviano1.00",
"Boliviano1.00",
"Bolivianos1.00",
"Bosnia-Herzegovina Convertible Mark1.00",
"Bosnia-Herzegovina Dinar1.00",
"Bosnia-Herzegovina convertible mark1.00",
"Bosnia-Herzegovina convertible marks1.00",
"Bosnia-Herzegovina dinar1.00",
"Bosnia-Herzegovina dinars1.00",
"Botswanan Pula1.00",
"Botswanan pula1.00",
"Botswanan pulas1.00",
"Br1.00",
"Brazilian Cruzado Novo1.00",
"Brazilian Cruzado1.00",
"Brazilian Cruzeiro (1990-1993)1.00",
"Brazilian Cruzeiro Novo (1967-1986)1.00",
"Brazilian Cruzeiro1.00",
"Brazilian Real1.00",
"Brazilian cruzado novo1.00",
"Brazilian cruzado novos1.00",
"Brazilian cruzado1.00",
"Brazilian cruzados1.00",
"Brazilian cruzeiro (BRE)1.00",
"Brazilian cruzeiro novo (BRB)1.00",
"Brazilian cruzeiro1.00",
"Brazilian cruzeiros (BRE)1.00",
"Brazilian cruzeiros novo (BRB)1.00",
"Brazilian cruzeiros1.00",
"Brazilian real1.00",
"Brazilian reals1.00",
"British Pound Sterling1.00",
"British pound sterling1.00",
"British pound sterlings1.00",
"Brunei Dollar1.00",
"Brunei dollar1.00",
"Brunei dollars1.00",
"Bs1.00",
"BsF1.00",
"Bulgarian Hard Lev1.00",
"Bulgarian Lev1.00",
"Bulgarian Levs1.00",
"Bulgarian hard lev1.00",
"Bulgarian hard levs1.00",
"Bulgarian lev1.00",
"Burmese Kyat1.00",
"Burmese kyat1.00",
"Burmese kyats1.00",
"Burundi Franc1.00",
"Burundi franc1.00",
"Burundi 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 Verde Escudo1.00",
"Cape Verde escudo1.00",
"Cape Verde escudos1.00",
"Cayman Islands Dollar1.00",
"Cayman Islands dollar1.00",
"Cayman Islands dollars1.00",
"Chilean Peso1.00",
"Chilean Unidades de Fomento1.00",
"Chilean peso1.00",
"Chilean pesos1.00",
"Chilean unidades de fomento1.00",
"Chilean unidades de fomentos1.00",
"Chinese Yuan Renminbi1.00",
"Chinese yuan1.00",
"Colombian Peso1.00",
"Colombian peso1.00",
"Colombian pesos1.00",
"Comoro Franc1.00",
"Comoro franc1.00",
"Comoro francs1.00",
"Congolese Franc Congolais1.00",
"Congolese franc Congolais1.00",
"Congolese francs Congolais1.00",
"Costa Rican Colon1.00",
"Costa Rican colon1.00",
"Costa Rican colons1.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",
"Cyprus Pound1.00",
"Cyprus pound1.00",
"Cyprus 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",
"Deutsche Mark1.00",
"Deutsche mark1.00",
"Deutsche marks1.00",
"Djibouti Franc1.00",
"Djibouti franc1.00",
"Djibouti francs1.00",
"Dkr1.00",
"Dominican Peso1.00",
"Dominican peso1.00",
"Dominican pesos1.00",
"E1.00",
"EC$1.00",
"ECS1.00",
"ECS1.00",
"ECV1.00",
"ECV1.00",
"EEK1.00",
"EEK1.00",
"EGP1.00",
"EGP1.00",
"EQE1.00",
"EQE1.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 Ostmark1.00",
"East German ostmark1.00",
"East German ostmarks1.00",
"Ecuador Sucre1.00",
"Ecuador Unidad de Valor Constante (UVC)1.00",
"Ecuador sucre1.00",
"Ecuador sucres1.00",
"Ecuador unidad de valor Constante (UVC)1.00",
"Ecuador unidads de valor Constante (UVC)1.00",
"Egyptian Pound1.00",
"Egyptian pound1.00",
"Egyptian pounds1.00",
"Ekwele1.00",
"El Salvador Colon1.00",
"El Salvador colon1.00",
"El Salvador colons1.00",
"Equatorial Guinea Ekwele Guineana1.00",
"Equatorial Guinea 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",
"F$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",
"Fiji Dollar1.00",
"Fiji dollar1.00",
"Fiji dollars1.00",
"Finnish Markka1.00",
"Finnish markka1.00",
"Finnish markkas1.00",
"Fr.1.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",
"G$1.00",
"GBP1.00",
"GEK1.00",
"GEK1.00",
"GEL1.00",
"GF1.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",
"Gambia Dalasi1.00",
"Gambia dalasi1.00",
"Gambia dalasis1.00",
"Georgian Kupon Larit1.00",
"Georgian Lari1.00",
"Georgian kupon larit1.00",
"Georgian kupon larits1.00",
"Georgian lari1.00",
"Georgian laris1.00",
"Ghana Cedi (1979-2007)1.00",
"Ghana Cedi1.00",
"Ghana cedi (GHC)1.00",
"Ghana cedi1.00",
"Ghana cedis (GHC)1.00",
"Ghana cedis1.00",
"Gibraltar Pound1.00",
"Gibraltar pound1.00",
"Gibraltar pounds1.00",
"Gold1.00",
"Gold1.00",
"Greek Drachma1.00",
"Greek drachma1.00",
"Greek drachmas1.00",
"Guatemala Quetzal1.00",
"Guatemala quetzal1.00",
"Guatemala quetzals1.00",
"Guinea Franc1.00",
"Guinea Syli1.00",
"Guinea franc1.00",
"Guinea francs1.00",
"Guinea syli1.00",
"Guinea sylis1.00",
"Guinea-Bissau Peso1.00",
"Guinea-Bissau peso1.00",
"Guinea-Bissau pesos1.00",
"Guyana Dollar1.00",
"Guyana dollar1.00",
"Guyana 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",
"Honduras Lempira1.00",
"Honduras lempira1.00",
"Honduras 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 Krona1.00",
"Icelandic krona1.00",
"Icelandic kronas1.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",
"K Sh1.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",
"Kazakhstan Tenge1.00",
"Kazakhstan tenge1.00",
"Kazakhstan tenges1.00",
"Kenyan Shilling1.00",
"Kenyan shilling1.00",
"Kenyan shillings1.00",
"Kuwaiti Dinar1.00",
"Kuwaiti dinar1.00",
"Kuwaiti dinars1.00",
"Kyrgystan Som1.00",
"Kyrgystan som1.00",
"Kyrgystan soms1.00",
"Kz1.00",
"K\\u010d1.00",
"L1.00",
"LAK1.00",
"LAK1.00",
"LBP1.00",
"LD1.00",
"LKR1.00",
"LL1.00",
"LRD1.00",
"LRD1.00",
"LSL1.00",
"LSM1.00",
"LSM1.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 latses1.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 Lita1.00",
"Lithuanian Talonas1.00",
"Lithuanian lita1.00",
"Lithuanian litas1.00",
"Lithuanian talonas1.00",
"Lithuanian talonases1.00",
"Lm1.00",
"Luxembourg Convertible Franc1.00",
"Luxembourg Financial Franc1.00",
"Luxembourg Franc1.00",
"Luxembourg convertible franc1.00",
"Luxembourg convertible francs1.00",
"Luxembourg financial franc1.00",
"Luxembourg financial francs1.00",
"Luxembourg franc1.00",
"Luxembourg francs1.00",
"M1.00",
"MAD1.00",
"MAD1.00",
"MAF1.00",
"MAF1.00",
"MDL1.00",
"MDL1.00",
"MDen1.00",
"MEX$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",
"Macao Pataca1.00",
"Macao pataca1.00",
"Macao patacas1.00",
"Macedonian Denar1.00",
"Macedonian denar1.00",
"Macedonian denars1.00",
"Madagascar Ariaries1.00",
"Madagascar Ariary1.00",
"Madagascar Ariary1.00",
"Madagascar Franc1.00",
"Madagascar franc1.00",
"Madagascar francs1.00",
"Malawi Kwacha1.00",
"Malawi Kwacha1.00",
"Malawi Kwachas1.00",
"Malaysian Ringgit1.00",
"Malaysian ringgit1.00",
"Malaysian ringgits1.00",
"Maldive Islands Rufiyaa1.00",
"Maldive Islands rufiyaa1.00",
"Maldive Islands rufiyaas1.00",
"Mali Franc1.00",
"Mali franc1.00",
"Mali francs1.00",
"Maloti1.00",
"Maltese Lira1.00",
"Maltese Pound1.00",
"Maltese lira1.00",
"Maltese liras1.00",
"Maltese pound1.00",
"Maltese pounds1.00",
"Mauritania Ouguiya1.00",
"Mauritania ouguiya1.00",
"Mauritania ouguiyas1.00",
"Mauritius Rupee1.00",
"Mauritius rupee1.00",
"Mauritius rupees1.00",
"Mexican Peso1.00",
"Mexican Silver Peso (1861-1992)1.00",
"Mexican Unidad de Inversion (UDI)1.00",
"Mexican peso1.00",
"Mexican pesos1.00",
"Mexican silver peso (MXP)1.00",
"Mexican silver pesos (MXP)1.00",
"Mexican unidad de inversion (UDI)1.00",
"Mexican unidads de inversion (UDI)1.00",
"Moldovan Leu1.00",
"Moldovan leu1.00",
"Moldovan leus1.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",
"Mozambique Escudo1.00",
"Mozambique Metical1.00",
"Mozambique escudo1.00",
"Mozambique escudos1.00",
"Mozambique metical1.00",
"Mozambique meticals1.00",
"Mt1.00",
"Myanmar Kyat1.00",
"Myanmar kyat1.00",
"Myanmar 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",
"Namibia Dollar1.00",
"Namibia dollar1.00",
"Namibia dollars1.00",
"Nepalese Rupee1.00",
"Nepalese rupee1.00",
"Nepalese rupees1.00",
"Netherlands Antillan Guilder1.00",
"Netherlands Antillan guilder1.00",
"Netherlands Antillan guilders1.00",
"Netherlands Guilder1.00",
"Netherlands guilder1.00",
"Netherlands guilders1.00",
"New Israeli Sheqel1.00",
"New Israeli Sheqels1.00",
"New Zealand Dollar1.00",
"New Zealand dollar1.00",
"New Zealand dollars1.00",
"Nicaraguan Cordoba Oro1.00",
"Nicaraguan Cordoba1.00",
"Nicaraguan cordoba oro1.00",
"Nicaraguan cordoba oros1.00",
"Nicaraguan cordoba1.00",
"Nicaraguan cordobas1.00",
"Nigerian Naira1.00",
"Nigerian naira1.00",
"Nigerian nairas1.00",
"North Korean Won1.00",
"North Korean won1.00",
"North Korean wons1.00",
"Norwegian Krone1.00",
"Norwegian krone1.00",
"Norwegian krones1.00",
"Nrs1.00",
"Nu1.00",
"OMR1.00",
"Old Mozambique Metical1.00",
"Old Mozambique metical1.00",
"Old Mozambique meticals1.00",
"Old Romanian Lei1.00",
"Old Romanian Leu1.00",
"Old Romanian leu1.00",
"Old Serbian Dinar1.00",
"Old Serbian dinar1.00",
"Old Serbian dinars1.00",
"Old Sudanese Dinar1.00",
"Old Sudanese Pound1.00",
"Old Sudanese dinar1.00",
"Old Sudanese dinars1.00",
"Old Sudanese pound1.00",
"Old Sudanese pounds1.00",
"Old Turkish Lira1.00",
"Old Turkish Lira1.00",
"Oman Rial1.00",
"Oman rial1.00",
"Oman rials1.00",
"P1.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",
"Pakistan Rupee1.00",
"Pakistan rupee1.00",
"Pakistan rupees1.00",
"Palladium1.00",
"Palladium1.00",
"Panamanian Balboa1.00",
"Panamanian balboa1.00",
"Panamanian balboas1.00",
"Papua New Guinea Kina1.00",
"Papua New Guinea kina1.00",
"Papua New Guinea kinas1.00",
"Paraguay Guarani1.00",
"Paraguay guarani1.00",
"Paraguay guaranis1.00",
"Peruvian Inti1.00",
"Peruvian Sol Nuevo1.00",
"Peruvian Sol1.00",
"Peruvian inti1.00",
"Peruvian intis1.00",
"Peruvian sol nuevo1.00",
"Peruvian sol nuevos1.00",
"Peruvian sol1.00",
"Peruvian sols1.00",
"Philippine Peso1.00",
"Philippine peso1.00",
"Philippine pesos1.00",
"Platinum1.00",
"Platinum1.00",
"Polish Zloty (1950-1995)1.00",
"Polish Zloty1.00",
"Polish zloties1.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",
"Pra1.00",
"Q1.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",
"RI1.00",
"RINET Funds1.00",
"RINET Funds1.00",
"RM1.00",
"RMB1.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",
"Rbl1.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 (RUR)1.00",
"Russian ruble1.00",
"Russian rubles (RUR)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",
"SL Re1.00",
"SLL1.00",
"SLL1.00",
"SOS1.00",
"SRD1.00",
"SRD1.00",
"SRG1.00",
"SRl1.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",
"Sao Tome and Principe Dobra1.00",
"Sao Tome and Principe dobra1.00",
"Sao Tome and Principe dobras1.00",
"Saudi Riyal1.00",
"Saudi riyal1.00",
"Saudi riyals1.00",
"Serbian Dinar1.00",
"Serbian dinar1.00",
"Serbian dinars1.00",
"Seychelles Rupee1.00",
"Seychelles rupee1.00",
"Seychelles rupees1.00",
"Sf1.00",
"Sh.1.00",
"Sierra Leone Leone1.00",
"Sierra Leone leone1.00",
"Sierra Leone 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",
"Slovenia Tolar1.00",
"Slovenia tolar1.00",
"Slovenia 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 rands1.00",
"South Korean Won1.00",
"South Korean won1.00",
"South Korean wons1.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 Lanka Rupee1.00",
"Sri Lanka rupee1.00",
"Sri Lanka rupees1.00",
"Sudanese Pound1.00",
"Sudanese pound1.00",
"Sudanese pounds1.00",
"Surinam Dollar1.00",
"Surinam dollar1.00",
"Surinam dollars1.00",
"Suriname Guilder1.00",
"Suriname guilder1.00",
"Suriname guilders1.00",
"Swaziland Lilangeni1.00",
"Swaziland lilangeni1.00",
"Swaziland lilangenis1.00",
"Swedish Krona1.00",
"Swedish krona1.00",
"Swedish kronas1.00",
"Swiss Franc1.00",
"Swiss franc1.00",
"Swiss francs1.00",
"Syrian Pound1.00",
"Syrian pound1.00",
"Syrian pounds1.00",
"T Sh1.00",
"T1.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",
"Taiwan New Dollar1.00",
"Taiwan dollar1.00",
"Taiwan dollars1.00",
"Tajikistan Ruble1.00",
"Tajikistan Somoni1.00",
"Tajikistan ruble1.00",
"Tajikistan rubles1.00",
"Tajikistan somoni1.00",
"Tajikistan 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 bahts1.00",
"Timor Escudo1.00",
"Timor escudo1.00",
"Timor escudos1.00",
"Tk1.00",
"Tonga Pa\\u02bbanga1.00",
"Tonga pa\\u02bbanga1.00",
"Tonga pa\\u02bbangas1.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",
"Turkmenistan Manat1.00",
"Turkmenistan manat1.00",
"Turkmenistan manats1.00",
"U Sh1.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 (UGS)1.00",
"Ugandan shilling1.00",
"Ugandan shillings (UGS)1.00",
"Ugandan shillings1.00",
"Ukrainian Hryvnia1.00",
"Ukrainian Karbovanetz1.00",
"Ukrainian hryvnia1.00",
"Ukrainian hryvnias1.00",
"Ukrainian karbovanetz1.00",
"Ukrainian karbovanetzs1.00",
"Unidad de Valor Real1.00",
"United Arab Emirates Dirham1.00",
"Unknown or Invalid Currency1.00",
"Ur$1.00",
"Uruguay Peso (1975-1993)1.00",
"Uruguay Peso Uruguayo1.00",
"Uruguay Peso en Unidades Indexadas1.00",
"Uruguay peso (UYP)1.00",
"Uruguay peso en unidades indexadas1.00",
"Uruguay peso1.00",
"Uruguay pesos (UYP)1.00",
"Uruguay pesos en unidades indexadas1.00",
"Uzbekistan Sum1.00",
"Uzbekistan sum1.00",
"Uzbekistan sums1.00",
"VEB1.00",
"VEF1.00",
"VND1.00",
"VT1.00",
"VUV1.00",
"Vanuatu Vatu1.00",
"Vanuatu vatu1.00",
"Vanuatu vatus1.00",
"Venezuelan Bolivar Fuerte1.00",
"Venezuelan Bolivar1.00",
"Venezuelan bolivar fuerte1.00",
"Venezuelan bolivar fuertes1.00",
"Venezuelan bolivar1.00",
"Venezuelan bolivars1.00",
"Vietnamese Dong1.00",
"Vietnamese dong1.00",
"Vietnamese dongs1.00",
"WIR Euro1.00",
"WIR Franc1.00",
"WIR euro1.00",
"WIR euros1.00",
"WIR franc1.00",
"WIR francs1.00",
"WST1.00",
"WST1.00",
"Western Samoa Tala1.00",
"Western Samoa tala1.00",
"Western Samoa talas1.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",
"YRl1.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 Dinar1.00",
"Yugoslavian Hard Dinar1.00",
"Yugoslavian Noviy Dinar1.00",
"Yugoslavian Noviy dinars1.00",
"Yugoslavian convertible dinar1.00",
"Yugoslavian convertible dinars1.00",
"Yugoslavian hard dinar1.00",
"Yugoslavian hard dinars1.00",
"Yugoslavian noviy dinar1.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 Zaire1.00",
"Zairean Zaire1.00",
"Zairean new zaire1.00",
"Zairean new zaires1.00",
"Zairean zaire1.00",
"Zairean zaires1.00",
"Zambian Kwacha1.00",
"Zambian kwacha1.00",
"Zambian kwachas1.00",
"Zimbabwe Dollar1.00",
"Zimbabwe dollar1.00",
"Zimbabwe dollars1.00",
"dram1.00",
"ekwele1.00",
"ekweles1.00",
"euro1.00",
"euros1.00",
"lari1.00",
"lek1.00",
"lev1.00",
"maloti1.00",
"malotis1.00",
"man.1.00",
"old Turkish lira1.00",
"som1.00",
"special drawing rights1.00",
"unidad de valor real1.00",
"unidad de valor reals1.00",
"unknown/invalid currency1.00",
"z\\u01421.00",
"\\u00a31.00",
"\\u00a3C1.00",
"\\u00a51.00",
"\\u0e3f1.00",
"\\u20ab1.00",
"\\u20a11.00",
"\\u20a71.00",
"\\u20aa1.00",
"\\u20ac1.00",
"\\u20a81.00",
"\\u20a61.00",
"\\u20ae1.00",
"\\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 Afghani random",
"1.00 Afghani random",
"1.00 Afghanis (AFA) random",
"1.00 Afghanis random",
"1.00 Albanian Lek random",
"1.00 Albanian lek random",
"1.00 Albanian lekë 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 Kwanza Reajustado (1995-1999) random",
"1.00 Angolan Kwanza random",
"1.00 Angolan New Kwanza (1990-2000) random",
"1.00 Angolan kwanza (AOK) random",
"1.00 Angolan kwanza reajustado (AOR) random",
"1.00 Angolan kwanza random",
"1.00 Angolan kwanzas (AOK) random",
"1.00 Angolan kwanzas reajustado (AOR) random",
"1.00 Angolan kwanzas random",
"1.00 Angolan new kwanza (AON) random",
"1.00 Angolan new kwanzas (AON) 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 (ARP) random",
"1.00 Argentine peso random",
"1.00 Argentine pesos (ARP) 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 Azerbaijanian Manat (1993-2006) random",
"1.00 Azerbaijanian Manat random",
"1.00 Azerbaijanian manat (AZM) random",
"1.00 Azerbaijanian manat random",
"1.00 Azerbaijanian manats (AZM) random",
"1.00 Azerbaijanian 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 Barbados Dollar random",
"1.00 Barbados dollar random",
"1.00 Barbados dollars random",
"1.00 Belarussian New Ruble (1994-1999) random",
"1.00 Belarussian Ruble random",
"1.00 Belarussian new ruble (BYB) random",
"1.00 Belarussian new rubles (BYB) random",
"1.00 Belarussian ruble random",
"1.00 Belarussian 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 Bhutan Ngultrum random",
"1.00 Bhutan ngultrum random",
"1.00 Bhutan 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 Boliviano random",
"1.00 Boliviano random",
"1.00 Bolivianos random",
"1.00 Bosnia-Herzegovina Convertible Mark random",
"1.00 Bosnia-Herzegovina Dinar random",
"1.00 Bosnia-Herzegovina convertible mark random",
"1.00 Bosnia-Herzegovina convertible marks random",
"1.00 Bosnia-Herzegovina dinar random",
"1.00 Bosnia-Herzegovina dinars random",
"1.00 Botswanan Pula random",
"1.00 Botswanan pula random",
"1.00 Botswanan pulas random",
"1.00 Brazilian Cruzado Novo random",
"1.00 Brazilian Cruzado random",
"1.00 Brazilian Cruzeiro (1990-1993) random",
"1.00 Brazilian Cruzeiro Novo (1967-1986) random",
"1.00 Brazilian Cruzeiro random",
"1.00 Brazilian Real random",
"1.00 Brazilian cruzado novo random",
"1.00 Brazilian cruzado novos random",
"1.00 Brazilian cruzado random",
"1.00 Brazilian cruzados random",
"1.00 Brazilian cruzeiro (BRE) random",
"1.00 Brazilian cruzeiro novo (BRB) random",
"1.00 Brazilian cruzeiro random",
"1.00 Brazilian cruzeiros (BRE) random",
"1.00 Brazilian cruzeiros novo (BRB) random",
"1.00 Brazilian cruzeiros 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 pound sterlings 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 Levs random",
"1.00 Bulgarian hard lev random",
"1.00 Bulgarian hard levs random",
"1.00 Bulgarian lev random",
"1.00 Burmese Kyat random",
"1.00 Burmese kyat random",
"1.00 Burmese kyats random",
"1.00 Burundi Franc random",
"1.00 Burundi franc random",
"1.00 Burundi 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 Verde Escudo random",
"1.00 Cape Verde escudo random",
"1.00 Cape Verde 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 Unidades de Fomento random",
"1.00 Chilean peso random",
"1.00 Chilean pesos random",
"1.00 Chilean unidades de fomento random",
"1.00 Chilean unidades de fomentos random",
"1.00 Chinese Yuan Renminbi random",
"1.00 Chinese yuan random",
"1.00 Colombian Peso random",
"1.00 Colombian peso random",
"1.00 Colombian pesos random",
"1.00 Comoro Franc random",
"1.00 Comoro franc random",
"1.00 Comoro francs random",
"1.00 Congolese Franc Congolais random",
"1.00 Congolese franc Congolais random",
"1.00 Congolese francs Congolais random",
"1.00 Costa Rican Colon random",
"1.00 Costa Rican colon random",
"1.00 Costa Rican colons 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 Cyprus Pound random",
"1.00 Cyprus pound random",
"1.00 Cyprus 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 Deutsche Mark random",
"1.00 Deutsche mark random",
"1.00 Deutsche marks random",
"1.00 Djibouti Franc random",
"1.00 Djibouti franc random",
"1.00 Djibouti 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 Ostmark random",
"1.00 East German ostmark random",
"1.00 East German ostmarks random",
"1.00 Ecuador Sucre random",
"1.00 Ecuador Unidad de Valor Constante (UVC) random",
"1.00 Ecuador sucre random",
"1.00 Ecuador sucres random",
"1.00 Ecuador unidad de valor Constante (UVC) random",
"1.00 Ecuador unidads de valor Constante (UVC) random",
"1.00 Egyptian Pound random",
"1.00 Egyptian pound random",
"1.00 Egyptian pounds random",
"1.00 Ekwele random",
"1.00 El Salvador Colon random",
"1.00 El Salvador colon random",
"1.00 El Salvador colons random",
"1.00 Equatorial Guinea Ekwele Guineana random",
"1.00 Equatorial Guinea 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 Fiji Dollar random",
"1.00 Fiji dollar random",
"1.00 Fiji 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 Gambia Dalasi random",
"1.00 Gambia dalasi random",
"1.00 Gambia 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 Ghana Cedi (1979-2007) random",
"1.00 Ghana Cedi random",
"1.00 Ghana cedi (GHC) random",
"1.00 Ghana cedi random",
"1.00 Ghana cedis (GHC) random",
"1.00 Ghana 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 Guatemala Quetzal random",
"1.00 Guatemala quetzal random",
"1.00 Guatemala quetzals random",
"1.00 Guinea Franc random",
"1.00 Guinea Syli random",
"1.00 Guinea franc random",
"1.00 Guinea francs random",
"1.00 Guinea syli random",
"1.00 Guinea sylis random",
"1.00 Guinea-Bissau Peso random",
"1.00 Guinea-Bissau peso random",
"1.00 Guinea-Bissau pesos random",
"1.00 Guyana Dollar random",
"1.00 Guyana dollar random",
"1.00 Guyana dollars random",
"1.00 Haitian Gourde random",
"1.00 Haitian gourde random",
"1.00 Haitian gourdes random",
"1.00 Honduras Lempira random",
"1.00 Honduras lempira random",
"1.00 Honduras 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 Krona random",
"1.00 Icelandic krona random",
"1.00 Icelandic kronas 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 Kazakhstan Tenge random",
"1.00 Kazakhstan tenge random",
"1.00 Kazakhstan 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 Kyrgystan Som random",
"1.00 Kyrgystan som random",
"1.00 Kyrgystan 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 latses 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 Lita random",
"1.00 Lithuanian Talonas random",
"1.00 Lithuanian lita random",
"1.00 Lithuanian litas random",
"1.00 Lithuanian talonas random",
"1.00 Lithuanian talonases random",
"1.00 Luxembourg Convertible Franc random",
"1.00 Luxembourg Financial Franc random",
"1.00 Luxembourg Franc random",
"1.00 Luxembourg convertible franc random",
"1.00 Luxembourg convertible francs random",
"1.00 Luxembourg financial franc random",
"1.00 Luxembourg financial francs random",
"1.00 Luxembourg franc random",
"1.00 Luxembourg francs random",
"1.00 Macao Pataca random",
"1.00 Macao pataca random",
"1.00 Macao patacas random",
"1.00 Macedonian Denar random",
"1.00 Macedonian denar random",
"1.00 Macedonian denars random",
"1.00 Madagascar Ariaries random",
"1.00 Madagascar Ariary random",
"1.00 Madagascar Ariary random",
"1.00 Madagascar Franc random",
"1.00 Madagascar franc random",
"1.00 Madagascar francs random",
"1.00 Malawi Kwacha random",
"1.00 Malawi Kwacha random",
"1.00 Malawi Kwachas random",
"1.00 Malaysian Ringgit random",
"1.00 Malaysian ringgit random",
"1.00 Malaysian ringgits random",
"1.00 Maldive Islands Rufiyaa random",
"1.00 Maldive Islands rufiyaa random",
"1.00 Maldive Islands rufiyaas random",
"1.00 Mali Franc random",
"1.00 Mali franc random",
"1.00 Mali francs random",
"1.00 Maloti 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 Mauritania Ouguiya random",
"1.00 Mauritania ouguiya random",
"1.00 Mauritania ouguiyas random",
"1.00 Mauritius Rupee random",
"1.00 Mauritius rupee random",
"1.00 Mauritius rupees random",
"1.00 Mexican Peso random",
"1.00 Mexican Silver Peso (1861-1992) random",
"1.00 Mexican Unidad de Inversion (UDI) random",
"1.00 Mexican peso random",
"1.00 Mexican pesos random",
"1.00 Mexican silver peso (MXP) random",
"1.00 Mexican silver pesos (MXP) random",
"1.00 Mexican unidad de inversion (UDI) random",
"1.00 Mexican unidads de inversion (UDI) random",
"1.00 Moldovan Leu random",
"1.00 Moldovan leu random",
"1.00 Moldovan leus 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 Mozambique Escudo random",
"1.00 Mozambique Metical random",
"1.00 Mozambique escudo random",
"1.00 Mozambique escudos random",
"1.00 Mozambique metical random",
"1.00 Mozambique meticals random",
"1.00 Myanmar Kyat random",
"1.00 Myanmar kyat random",
"1.00 Myanmar kyats random",
"1.00 Namibia Dollar random",
"1.00 Namibia dollar random",
"1.00 Namibia dollars random",
"1.00 Nepalese Rupee random",
"1.00 Nepalese rupee random",
"1.00 Nepalese rupees random",
"1.00 Netherlands Antillan Guilder random",
"1.00 Netherlands Antillan guilder random",
"1.00 Netherlands Antillan guilders random",
"1.00 Netherlands Guilder random",
"1.00 Netherlands guilder random",
"1.00 Netherlands guilders random",
"1.00 New Israeli Sheqel random",
"1.00 New Israeli Sheqels random",
"1.00 New Zealand Dollar random",
"1.00 New Zealand dollar random",
"1.00 New Zealand dollars random",
"1.00 Nicaraguan Cordoba Oro random",
"1.00 Nicaraguan Cordoba random",
"1.00 Nicaraguan cordoba oro random",
"1.00 Nicaraguan cordoba oros random",
"1.00 Nicaraguan cordoba random",
"1.00 Nicaraguan cordobas 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 wons random",
"1.00 Norwegian Krone random",
"1.00 Norwegian krone random",
"1.00 Norwegian krones random",
"1.00 Old Mozambique Metical random",
"1.00 Old Mozambique metical random",
"1.00 Old Mozambique meticals random",
"1.00 Old Romanian Lei random",
"1.00 Old Romanian Leu random",
"1.00 Old Romanian leu random",
"1.00 Old Serbian Dinar random",
"1.00 Old Serbian dinar random",
"1.00 Old Serbian dinars random",
"1.00 Old Sudanese Dinar random",
"1.00 Old Sudanese Pound random",
"1.00 Old Sudanese dinar random",
"1.00 Old Sudanese dinars random",
"1.00 Old Sudanese pound random",
"1.00 Old Sudanese pounds random",
"1.00 Old Turkish Lira random",
"1.00 Old Turkish Lira random",
"1.00 Oman Rial random",
"1.00 Oman rial random",
"1.00 Oman rials random",
"1.00 Pakistan Rupee random",
"1.00 Pakistan rupee random",
"1.00 Pakistan 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 Guinea Kina random",
"1.00 Papua New Guinea kina random",
"1.00 Papua New Guinea kinas random",
"1.00 Paraguay Guarani random",
"1.00 Paraguay guarani random",
"1.00 Paraguay guaranis random",
"1.00 Peruvian Inti random",
"1.00 Peruvian Sol Nuevo random",
"1.00 Peruvian Sol random",
"1.00 Peruvian inti random",
"1.00 Peruvian intis random",
"1.00 Peruvian sol nuevo random",
"1.00 Peruvian sol nuevos random",
"1.00 Peruvian sol random",
"1.00 Peruvian sols 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 zloties 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 (RUR) random",
"1.00 Russian ruble random",
"1.00 Russian rubles (RUR) 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 Sao Tome and Principe Dobra random",
"1.00 Sao Tome and Principe dobra random",
"1.00 Sao Tome and Principe 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 Seychelles Rupee random",
"1.00 Seychelles rupee random",
"1.00 Seychelles rupees random",
"1.00 Sierra Leone Leone random",
"1.00 Sierra Leone leone random",
"1.00 Sierra Leone 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 Slovenia Tolar random",
"1.00 Slovenia tolar random",
"1.00 Slovenia 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 rands random",
"1.00 South Korean Won random",
"1.00 South Korean won random",
"1.00 South Korean wons 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 Lanka Rupee random",
"1.00 Sri Lanka rupee random",
"1.00 Sri Lanka rupees random",
"1.00 Sudanese Pound random",
"1.00 Sudanese pound random",
"1.00 Sudanese pounds random",
"1.00 Surinam Dollar random",
"1.00 Surinam dollar random",
"1.00 Surinam dollars random",
"1.00 Suriname Guilder random",
"1.00 Suriname guilder random",
"1.00 Suriname guilders random",
"1.00 Swaziland Lilangeni random",
"1.00 Swaziland lilangeni random",
"1.00 Swaziland lilangenis random",
"1.00 Swedish Krona random",
"1.00 Swedish krona random",
"1.00 Swedish kronas 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 Taiwan New Dollar random",
"1.00 Taiwan dollar random",
"1.00 Taiwan dollars random",
"1.00 Tajikistan Ruble random",
"1.00 Tajikistan Somoni random",
"1.00 Tajikistan ruble random",
"1.00 Tajikistan rubles random",
"1.00 Tajikistan somoni random",
"1.00 Tajikistan 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 bahts random",
"1.00 Timor Escudo random",
"1.00 Timor escudo random",
"1.00 Timor 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 Turkmenistan Manat random",
"1.00 Turkmenistan manat random",
"1.00 Turkmenistan manats 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 (UGS) random",
"1.00 Ugandan shilling random",
"1.00 Ugandan shillings (UGS) random",
"1.00 Ugandan shillings random",
"1.00 Ukrainian Hryvnia random",
"1.00 Ukrainian Karbovanetz random",
"1.00 Ukrainian hryvnia random",
"1.00 Ukrainian hryvnias random",
"1.00 Ukrainian karbovanetz random",
"1.00 Ukrainian karbovanetzs random",
"1.00 Unidad de Valor Real random",
"1.00 United Arab Emirates Dirham random",
"1.00 Unknown or Invalid Currency random",
"1.00 Uruguay Peso (1975-1993) random",
"1.00 Uruguay Peso Uruguayo random",
"1.00 Uruguay Peso en Unidades Indexadas random",
"1.00 Uruguay peso (UYP) random",
"1.00 Uruguay peso en unidades indexadas random",
"1.00 Uruguay peso random",
"1.00 Uruguay pesos (UYP) random",
"1.00 Uruguay pesos en unidades indexadas random",
"1.00 Uzbekistan Sum random",
"1.00 Uzbekistan sum random",
"1.00 Uzbekistan sums random",
"1.00 Vanuatu Vatu random",
"1.00 Vanuatu vatu random",
"1.00 Vanuatu vatus random",
"1.00 Venezuelan Bolivar Fuerte random",
"1.00 Venezuelan Bolivar random",
"1.00 Venezuelan bolivar fuerte random",
"1.00 Venezuelan bolivar fuertes random",
"1.00 Venezuelan bolivar random",
"1.00 Venezuelan bolivars random",
"1.00 Vietnamese Dong random",
"1.00 Vietnamese dong random",
"1.00 Vietnamese dongs 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 Western Samoa Tala random",
"1.00 Western Samoa tala random",
"1.00 Western Samoa talas 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 random",
"1.00 Yugoslavian Hard Dinar random",
"1.00 Yugoslavian Noviy Dinar random",
"1.00 Yugoslavian Noviy dinars random",
"1.00 Yugoslavian convertible dinar random",
"1.00 Yugoslavian convertible dinars random",
"1.00 Yugoslavian hard dinar random",
"1.00 Yugoslavian hard dinars random",
"1.00 Yugoslavian noviy dinar random",
"1.00 Zairean New Zaire random",
"1.00 Zairean Zaire random",
"1.00 Zairean new zaire random",
"1.00 Zairean new zaires random",
"1.00 Zairean zaire random",
"1.00 Zairean zaires random",
"1.00 Zambian Kwacha random",
"1.00 Zambian kwacha random",
"1.00 Zambian kwachas random",
"1.00 Zimbabwe Dollar random",
"1.00 Zimbabwe dollar random",
"1.00 Zimbabwe dollars random",
"1.00 ekwele random",
"1.00 ekweles random",
"1.00 euro random",
"1.00 euros random",
"1.00 maloti random",
"1.00 malotis random",
"1.00 old Turkish lira random",
"1.00 special drawing rights random",
"1.00 unidad de valor real random",
"1.00 unidad de valor reals 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 Namibia Dolla",
"1.00 Namibia dolla",
"1.00 Nepalese Rupe",
"1.00 Nepalese rupe",
"1.00 Netherlands Antillan Guilde",
"1.00 Netherlands Antillan guilde",
"1.00 Netherlands Guilde",
"1.00 Netherlands guilde",
"1.00 New Israeli 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",
"Afghan1.00",
"Afghani (1927-20021.00",
"Afl1.00",
"Albanian Le1.00",
"Algerian Dina1.00",
"Andorran Peset1.00",
"Angolan Kwanz1.00",
"Angolan Kwanza (1977-19901.00",
"Angolan Kwanza Reajustado (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",
"Azerbaijanian Mana1.00",
"Azerbaijanian 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",
"Barbados Dolla1.00",
"Bds1.00",
"Belarussian New Ruble (1994-19991.00",
"Belarussian Rubl1.00",
"Belgian Fran1.00",
"Belgian Franc (convertible1.00",
"Belgian Franc (financial1.00",
"Belize Dolla1.00",
"Bermudan Dolla1.00",
"Bhutan Ngultru1.00",
"Bolivian Mvdo1.00",
"Bolivian Pes1.00",
"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 Cruzeiro Novo (1967-19861.00",
"Brazilian Rea1.00",
"British Pound Sterlin1.00",
"Brunei Dolla1.00",
"Bulgarian Hard Le1.00",
"Bulgarian Le1.00",
"Burmese Kya1.00",
"Burundi 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 Verde Escud1.00",
"Cayman Islands Dolla1.00",
"Chilean Pes1.00",
"Chilean Unidades de Foment1.00",
"Chinese Yuan Renminb1.00",
"Colombian Pes1.00",
"Comoro Fran1.00",
"Congolese Franc Congolai1.00",
"Costa Rican Colo1.00",
"Croatian Dina1.00",
"Croatian Kun1.00",
"Cuban Pes1.00",
"Cyprus 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",
"Deutsche Mar1.00",
"Djibouti 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",
"Ecuador Sucr1.00",
"Ecuador Unidad de Valor Constante (UVC1.00",
"Egyptian Poun1.00",
"Ekwel1.00",
"El Salvador Colo1.00",
"Equatorial Guinea Ekwele Guinean1.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",
"Fiji 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",
"Gambia Dalas1.00",
"Georgian Kupon Lari1.00",
"Georgian Lar1.00",
"Ghana Ced1.00",
"Ghana Cedi (1979-20071.00",
"Gibraltar Poun1.00",
"Gol1.00",
"Greek Drachm1.00",
"Guatemala Quetza1.00",
"Guinea Fran1.00",
"Guinea Syl1.00",
"Guinea-Bissau Pes1.00",
"Guyana Dolla1.00",
"HK1.00",
"HN1.00",
"HR1.00",
"HT1.00",
"HU1.00",
"Haitian Gourd1.00",
"Honduras 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",
"Kazakhstan Teng1.00",
"Kenyan Shillin1.00",
"Kuwaiti Dina1.00",
"Kyrgystan 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",
"Luxembourg Convertible Fran1.00",
"Luxembourg Financial Fran1.00",
"Luxembourg 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",
"Macao Patac1.00",
"Macedonian Dena1.00",
"Madagascar Ariar1.00",
"Madagascar Fran1.00",
"Malawi Kwach1.00",
"Malaysian Ringgi1.00",
"Maldive Islands Rufiya1.00",
"Mali Fran1.00",
"Malot1.00",
"Maltese Lir1.00",
"Maltese Poun1.00",
"Mauritania Ouguiy1.00",
"Mauritius Rupe1.00",
"Mexican Pes1.00",
"Mexican Silver Peso (1861-19921.00",
"Mexican Unidad de Inversion (UDI1.00",
"Moldovan Le1.00",
"Mongolian Tugri1.00",
"Moroccan Dirha1.00",
"Moroccan Fran1.00",
"Mozambique Escud1.00",
"Mozambique Metica1.00",
"Myanmar Kya1.00",
"N1.00",
"NA1.00",
"NAf1.00",
"NG1.00",
"NI1.00",
"NK1.00",
"NL1.00",
"NO1.00",
"NP1.00",
"NT1.00",
"NZ1.00",
"Namibia Dolla1.00",
"Nepalese Rupe1.00",
"Netherlands Antillan Guilde1.00",
"Netherlands Guilde1.00",
"New Israeli Sheqe1.00",
"New Zealand Dolla1.00",
"Nicaraguan Cordob1.00",
"Nicaraguan Cordoba Or1.00",
"Nigerian Nair1.00",
"North Korean Wo1.00",
"Norwegian Kron1.00",
"Nr1.00",
"OM1.00",
"Old Mozambique Metica1.00",
"Old Romanian Le1.00",
"Old Serbian Dina1.00",
"Old Sudanese Dina1.00",
"Old Sudanese Poun1.00",
"Old Turkish Lir1.00",
"Oman Ria1.00",
"PA1.00",
"PE1.00",
"PG1.00",
"PH1.00",
"PK1.00",
"PL1.00",
"PT1.00",
"PY1.00",
"Pakistan Rupe1.00",
"Palladiu1.00",
"Panamanian Balbo1.00",
"Papua New Guinea Kin1.00",
"Paraguay Guaran1.00",
"Peruvian Int1.00",
"Peruvian So1.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",
"Sao Tome and Principe Dobr1.00",
"Saudi Riya1.00",
"Serbian Dina1.00",
"Seychelles Rupe1.00",
"Sh1.00",
"Sierra Leone Leon1.00",
"Silve1.00",
"Singapore Dolla1.00",
"Slovak Korun1.00",
"Slovenia 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 Lanka Rupe1.00",
"Sudanese Poun1.00",
"Surinam Dolla1.00",
"Suriname Guilde1.00",
"Swaziland 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",
"Taiwan New Dolla1.00",
"Tajikistan Rubl1.00",
"Tajikistan Somon1.00",
"Tanzanian Shillin1.00",
"Testing Currency Cod1.00",
"Thai Bah1.00",
"Timor Escud1.00",
"Tonga Paʻang1.00",
"Trinidad and Tobago Dolla1.00",
"Tunisian Dina1.00",
"Turkish Lir1.00",
"Turkmenistan 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",
"Unidad de Valor Rea1.00",
"United Arab Emirates Dirha1.00",
"Unknown or Invalid Currenc1.00",
"Ur1.00",
"Uruguay Peso (1975-19931.00",
"Uruguay Peso Uruguay1.00",
"Uruguay Peso en Unidades Indexada1.00",
"Uzbekistan Su1.00",
"V1.00",
"VE1.00",
"VN1.00",
"VU1.00",
"Vanuatu Vat1.00",
"Venezuelan Boliva1.00",
"Venezuelan Bolivar Fuert1.00",
"Vietnamese Don1.00",
"WIR Eur1.00",
"WIR Fran1.00",
"WS1.00",
"Western 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",
"YR1.00",
"YU1.00",
"Yemeni Dina1.00",
"Yemeni Ria1.00",
"Yugoslavian Convertible Dina1.00",
"Yugoslavian Hard Dina1.00",
"Yugoslavian Noviy Dina1.00",
"Z1.00",
"ZA1.00",
"ZM1.00",
"ZR1.00",
"ZW1.00",
"Zairean New Zair1.00",
"Zairean Zair1.00",
"Zambian Kwach1.00",
"Zimbabwe Dolla1.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;
numFmt->parse(formatted, parseResult, status);
if (U_FAILURE(status) ||
(parseResult.getType() == Formattable::kDouble &&
parseResult.getDouble() != 1.0)) {
errln("wrong parsing, " + formatted);
errln("data: " + formatted);
}
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;
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);
}
delete numFmt;
}
}
#endif /* #if !UCONFIG_NO_FORMATTING */