164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * COPYRIGHT:
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Modification History:
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   07/15/99    helena      Ported to HPUX 10/11 CC.
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "numfmtst.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dcfmtsym.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/localpointer.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucurr.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/measfmt.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "digitlst.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "textfile.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tokiter.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "charstr.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "winnmtst.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <float.h>
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <stdlib.h>
348de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h"
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h"
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/numsys.h"
3754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "fmtableimp.h"
38c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "numberformattesttuple.h"
39c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "datadrivennumberformattestsuite.h"
40c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/msgfmt.h"
41c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass NumberFormatTestDataDriven : public DataDrivenNumberFormatTestSuite {
43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprotected:
44c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool isFormatPass(
45c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status);
48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool isToPatternPass(
49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status);
52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool isParsePass(
53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status);
56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool isParseCurrencyPass(
57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status);
60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic DigitList &strToDigitList(
63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UnicodeString &str,
64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DigitList &digitList,
65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return digitList;
68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (str == "NaN") {
70c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        digitList.set(uprv_getNaN());
71c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return digitList;
72c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
73c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (str == "-Inf") {
74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        digitList.set(-1*uprv_getInfinity());
75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return digitList;
76c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
77c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (str == "Inf") {
78c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        digitList.set(uprv_getInfinity());
79c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return digitList;
80c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
81c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    CharString formatValue;
82c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    formatValue.appendInvariantChars(str, status);
83c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    digitList.set(StringPiece(formatValue.data()), status, 0);
84c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return digitList;
85c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
86c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
87c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic UnicodeString &format(
88c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DecimalFormat &fmt,
89c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DigitList &digitList,
90c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendTo,
91c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
92c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
93c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return appendTo;
94c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
95c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
96c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return fmt.format(digitList, appendTo, fpos, status);
97c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
98c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
99c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Rouberttemplate<class T>
100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic UnicodeString &format(
101c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DecimalFormat &fmt,
102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        T value,
103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendTo,
104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return appendTo;
107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return fmt.format(value, appendTo, fpos, status);
110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void adjustDecimalFormat(
113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat &fmt,
115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage) {
116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.minIntegerDigitsFlag) {
117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.maxIntegerDigitsFlag) {
120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.minFractionDigitsFlag) {
123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMinimumFractionDigits(tuple.minFractionDigits);
124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.maxFractionDigitsFlag) {
126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.currencyFlag) {
129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString currency(tuple.currency);
131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UChar *terminatedCurrency = currency.getTerminatedBuffer();
132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setCurrency(terminatedCurrency, status);
133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Error setting currency.");
135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.minGroupingDigitsFlag) {
138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMinimumGroupingDigits(tuple.minGroupingDigits);
139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.useSigDigitsFlag) {
141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setSignificantDigitsUsed(tuple.useSigDigits != 0);
142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.minSigDigitsFlag) {
144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMinimumSignificantDigits(tuple.minSigDigits);
145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.maxSigDigitsFlag) {
147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMaximumSignificantDigits(tuple.maxSigDigits);
148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.useGroupingFlag) {
150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setGroupingUsed(tuple.useGrouping != 0);
151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.multiplierFlag) {
153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMultiplier(tuple.multiplier);
154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.roundingIncrementFlag) {
156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setRoundingIncrement(tuple.roundingIncrement);
157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.formatWidthFlag) {
159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setFormatWidth(tuple.formatWidth);
160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.padCharacterFlag) {
162c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setPadCharacter(tuple.padCharacter);
163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
164c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.useScientificFlag) {
165c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setScientificNotation(tuple.useScientific != 0);
166c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
167c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.groupingFlag) {
168c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setGroupingSize(tuple.grouping);
169c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.grouping2Flag) {
171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setSecondaryGroupingSize(tuple.grouping2);
172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.roundingModeFlag) {
174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setRoundingMode(tuple.roundingMode);
175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.currencyUsageFlag) {
177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setCurrencyUsage(tuple.currencyUsage, &status);
179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("CurrencyUsage: error setting.");
181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.minimumExponentDigitsFlag) {
184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setMinimumExponentDigits(tuple.minimumExponentDigits);
185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.exponentSignAlwaysShownFlag) {
187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setExponentSignAlwaysShown(tuple.exponentSignAlwaysShown != 0);
188c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.decimalSeparatorAlwaysShownFlag) {
190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setDecimalSeparatorAlwaysShown(
191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                tuple.decimalSeparatorAlwaysShown != 0);
192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.padPositionFlag) {
194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setPadPosition(tuple.padPosition);
195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.positivePrefixFlag) {
197c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setPositivePrefix(tuple.positivePrefix);
198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.positiveSuffixFlag) {
200c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setPositiveSuffix(tuple.positiveSuffix);
201c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.negativePrefixFlag) {
203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setNegativePrefix(tuple.negativePrefix);
204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.negativeSuffixFlag) {
206c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setNegativeSuffix(tuple.negativeSuffix);
207c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
208c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.localizedPatternFlag) {
209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
210c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.applyLocalizedPattern(tuple.localizedPattern, status);
211c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
212c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Error setting localized pattern.");
213c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
214c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setLenient(NFTT_GET_FIELD(tuple, lenient, 1) != 0);
216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.parseIntegerOnlyFlag) {
217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.decimalPatternMatchRequiredFlag) {
220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setDecimalPatternMatchRequired(
221c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                tuple.decimalPatternMatchRequired != 0);
222c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
223c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.parseNoExponentFlag) {
224c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
225c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.setAttribute(
226c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                UNUM_PARSE_NO_EXPONENT,
227c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                tuple.parseNoExponent,
228c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                status);
229c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
230c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Error setting parse no exponent flag.");
231c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
232c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
233c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
234c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
235c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic DecimalFormat *newDecimalFormat(
236c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const Locale &locale,
237c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UnicodeString &pattern,
238c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
240c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return NULL;
241c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
242c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormatSymbols> symbols(
243c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            new DecimalFormatSymbols(locale, status), status);
244c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
245c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return NULL;
246c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
247c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UParseError perror;
248c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormat> result(new DecimalFormat(
249c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            pattern, symbols.getAlias(), perror, status), status);
250c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!result.isNull()) {
251c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        symbols.orphan();
252c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
253c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
254c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return NULL;
255c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
256c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return result.orphan();
257c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
258c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
259c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic DecimalFormat *newDecimalFormat(
260c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
261c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
262c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
263c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return NULL;
264c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
265c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale en("en");
266c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return newDecimalFormat(
267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NFTT_GET_FIELD(tuple, locale, en),
268c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NFTT_GET_FIELD(tuple, pattern, "0"),
269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
270c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
271c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
272c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool NumberFormatTestDataDriven::isFormatPass(
273c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
274c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
275c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
276c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
277c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
278c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
279c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
280c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
281c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error creating DecimalFormat.");
282c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
283c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
284c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
285c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (appendErrorMessage.length() > 0) {
286c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
287c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
288c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList digitList;
289c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    strToDigitList(tuple.format, digitList, status);
290c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
291c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString appendTo;
292c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        format(*fmtPtr, digitList, appendTo, status);
293c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
294c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Error formatting.");
295c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
296c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
297c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (appendTo != tuple.output) {
298c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append(
299c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("Expected: ") + tuple.output + ", got: " + appendTo);
300c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
301c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
302c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
303c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    double doubleVal = digitList.getDouble();
304c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
305c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString appendTo;
306c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        format(*fmtPtr, doubleVal, appendTo, status);
307c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
308c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Error formatting.");
309c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
310c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
311c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (appendTo != tuple.output) {
312c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append(
313c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("double Expected: ") + tuple.output + ", got: " + appendTo);
314c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
315c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
316c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
317c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!uprv_isNaN(doubleVal) && !uprv_isInfinite(doubleVal) && doubleVal == uprv_floor(doubleVal)) {
318c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        int64_t intVal = digitList.getInt64();
319c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {
320c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString appendTo;
321c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            format(*fmtPtr, intVal, appendTo, status);
322c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if (U_FAILURE(status)) {
323c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                appendErrorMessage.append("Error formatting.");
324c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                return FALSE;
325c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
326c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if (appendTo != tuple.output) {
327c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                appendErrorMessage.append(
328c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                        UnicodeString("int64 Expected: ") + tuple.output + ", got: " + appendTo);
329c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                return FALSE;
330c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
331c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
332c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
333c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return TRUE;
334c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
335c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
336c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool NumberFormatTestDataDriven::isToPatternPass(
337c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
338c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
339c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
340c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
341c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
342c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
343c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
344c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
345c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error creating DecimalFormat.");
346c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
347c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
348c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
349c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (appendErrorMessage.length() > 0) {
350c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
351c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
352c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.toPatternFlag) {
353c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString actual;
354c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtPtr->toPattern(actual);
355c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (actual != tuple.toPattern) {
356c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append(
357c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("Expected: ") + tuple.toPattern + ", got: " + actual + ". ");
358c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
359c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
360c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.toLocalizedPatternFlag) {
361c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString actual;
362c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtPtr->toLocalizedPattern(actual);
363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (actual != tuple.toLocalizedPattern) {
364c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append(
365c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("Expected: ") + tuple.toLocalizedPattern + ", got: " + actual + ". ");
366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return appendErrorMessage.length() == 0;
369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
371c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool NumberFormatTestDataDriven::isParsePass(
372c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
373c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
374c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
375c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
376c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
377c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
378c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
379c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
380c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error creating DecimalFormat.");
381c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
382c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
383c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
384c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (appendErrorMessage.length() > 0) {
385c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
386c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
387c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Formattable result;
388c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ParsePosition ppos;
389c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmtPtr->parse(tuple.parse, result, ppos);
390c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (ppos.getIndex() == 0) {
391c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (tuple.output != "fail") {
392c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Parse failed but was expected to succeed.");
393c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
394c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
395c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return TRUE;
396c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
397c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString resultStr(UnicodeString::fromUTF8(result.getDecimalNumber(status)));
398c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.output == "fail") {
399c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append(UnicodeString("Parse succeeded: ") + resultStr + ", but was expected to fail.");
400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
401c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList expected;
403c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    strToDigitList(tuple.output, expected, status);
404c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
405c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error parsing.");
406c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
407c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
408c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (expected != *result.getDigitList()) {
409c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append(
410c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("Expected: ") + tuple.output + ", got: " + resultStr + ". ");
411c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
412c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
413c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return TRUE;
414c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
415c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
416c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool NumberFormatTestDataDriven::isParseCurrencyPass(
417c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const NumberFormatTestTuple &tuple,
418c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendErrorMessage,
419c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
420c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
421c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
422c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
423c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
424c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
425c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error creating DecimalFormat.");
426c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
427c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
428c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
429c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (appendErrorMessage.length() > 0) {
430c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
431c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
432c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ParsePosition ppos;
433c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<CurrencyAmount> currAmt(
434c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            fmtPtr->parseCurrency(tuple.parse, ppos));
435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (ppos.getIndex() == 0) {
436c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (tuple.output != "fail") {
437c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            appendErrorMessage.append("Parse failed but was expected to succeed.");
438c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return FALSE;
439c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
440c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return TRUE;
441c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
442c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString currStr(currAmt->getISOCurrency());
443c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Formattable resultFormattable(currAmt->getNumber());
444c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString resultStr(UnicodeString::fromUTF8(resultFormattable.getDecimalNumber(status)));
445c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (tuple.output == "fail") {
446c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append(UnicodeString("Parse succeeded: ") + resultStr + ", but was expected to fail.");
447c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
448c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
449c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList expected;
450c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    strToDigitList(tuple.output, expected, status);
451c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
452c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append("Error parsing.");
453c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
454c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
455c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (expected != *currAmt->getNumber().getDigitList()) {
456c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append(
457c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    UnicodeString("Expected: ") + tuple.output + ", got: " + resultStr + ". ");
458c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
459c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
460c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (currStr != tuple.outputCurrency) {
461c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendErrorMessage.append(UnicodeString(
462c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "Expected currency: ") + tuple.outputCurrency + ", got: " + currStr + ". ");
463c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
464c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
465c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return TRUE;
466c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//#define NUMFMTST_CACHE_DEBUG 1
46950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "stdio.h" /* for sprintf */
47050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// #include "iostream"   // for cout
471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//#define NUMFMTST_DEBUG 1
473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar EUR[] = {69,85,82,0}; // "EUR"
475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD"
47650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
47759d709d503bab6e2b61931737e662dd293b40578ccornelius
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class NumberFormatTest
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#define CHECK(status,str) if (U_FAILURE(status)) { errcheckln(status, UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; }
48327f654740f2a26ad62a5c155af9199af9e69b889claireho#define CHECK_DATA(status,str) if (U_FAILURE(status)) { dataerrln(UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; }
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO_BEGIN;
4888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencySign);
4898393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrency);
4908393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestParse);
4918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestRounding487);
4928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestQuotes);
4938393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestExponential);
4948393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestPatterns);
4958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
4968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  // Upgrade to alphaWorks - liu 5/99
4978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestExponent);
4988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestScientific);
4998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestPad);
5008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestPatterns2);
5018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestSecondaryGrouping);
5028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestSurrogateSupport);
5038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestAPI);
5048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
5058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyObject);
5068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyPatterns);
5078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  //TESTCASE_AUTO(TestDigitList);
5088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestWhiteSpaceParsing);
5098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestComplexCurrency);  // This test removed because CLDR no longer uses choice formats in currency symbols.
5108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestRegCurrency);
5118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestSymbolsWithBadLocale);
5128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestAdoptDecimalFormatSymbols);
5138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
5148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestScientific2);
5158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestScientificGrouping);
5168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestInt64);
5178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
5188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestPerMill);
5198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestIllegalPatterns);
5208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCases);
5218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
5228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyNames);
5238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyAmount);
5248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyUnit);
5258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCoverage);
5268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestJB3832);
5278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestHost);
5288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestHostClone);
5298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyFormat);
5308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestRounding);
5318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestNonpositiveMultiplier);
5328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestNumberingSystems);
5338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestSpaceParsing);
5348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestMultiCurrencySign);
5358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyFormatForMixParsing);
5368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestDecimalFormatCurrencyParse);
5378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyIsoPluralFormat);
5388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyParsing);
5398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestParseCurrencyInUCurr);
5408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestFormatAttributes);
5418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestFieldPositionIterator);
5428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestDecimal);
5438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestCurrencyFractionDigits);
5448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestExponentParse);
5458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestExplicitParents);
5468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestLenientParse);
5478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestAvailableNumberingSystems);
5488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestRoundingPattern);
5498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(Test9087);
5508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestFormatFastpaths);
5518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO(TestFormattableSize);
55259d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestUFormattable);
55359d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestSignificantDigits);
55459d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestShowZero);
55559d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestCompatibleCurrencies);
55659d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestBug9936);
55759d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestParseNegativeWithFaLocale);
55859d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestParseNegativeWithAlternateMinusSign);
55959d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestCustomCurrencySignAndSeparator);
56059d709d503bab6e2b61931737e662dd293b40578ccornelius  TESTCASE_AUTO(TestParseSignsAndMarks);
561fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(Test10419RoundingWith0FractionDigits);
562fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(Test10468ApplyPattern);
563fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(TestRoundingScientific10542);
564fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(TestZeroScientific10547);
565fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(TestAccountingCurrency);
566fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  TESTCASE_AUTO(TestEquality);
567f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius  TESTCASE_AUTO(TestCurrencyUsage);
568c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestNumberFormatTestTuple);
569c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestDataDriven);
5701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  TESTCASE_AUTO(TestDoubleLimit11439);
57195bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep  TESTCASE_AUTO(TestFastPathConsistent11524);
572c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestGetAffixes);
573c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestToPatternScientific11648);
574c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestBenchmark);
575c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestCtorApplyPatternDifference);
576c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestFractionalDigitsForCurrency);
577c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(TestFormatCurrencyPlural);
578c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test11868);
579c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test10727_RoundingZero);
580c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test11376_getAndSetPositivePrefix);
581c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test11475_signRecognition);
582c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test11640_getAffixes);
583c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  TESTCASE_AUTO(Test11649_toPatternWithMultiCurrency);
5848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  TESTCASE_AUTO_END;
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
58650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test API (increase code coverage)
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestAPI(void)
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("Test API");
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  NumberFormat *test = NumberFormat::createInstance("root", status);
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) {
5976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    dataerrln("unable to create format object - %s", u_errorName(status));
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(test != NULL) {
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->setMinimumIntegerDigits(10);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->setMaximumIntegerDigits(2);
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->setMinimumFractionDigits(10);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->setMaximumFractionDigits(2);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString result;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable bla("Paja Patak"); // Donald Duck for non Serbian speakers
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->format(bla, result, pos, status);
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Yuck... Formatted a duck... As a number!");
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_ZERO_ERROR;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result.remove();
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t ll = 12;
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test->format(ll, result);
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result != "12.00"){
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("format int64_t error");
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ParsePosition ppos;
624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    LocalPointer<CurrencyAmount> currAmt(test->parseCurrency("",ppos));
625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    // old test for (U_FAILURE(status)) was bogus here, method does not set status!
626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (ppos.getIndex()) {
627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Parsed empty string as currency");
62850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
62950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete test;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63459d709d503bab6e2b61931737e662dd293b40578ccorneliusclass StubNumberFormat :public NumberFormat{
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
63659d709d503bab6e2b61931737e662dd293b40578ccornelius    StubNumberFormat(){};
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UnicodeString& format(double ,UnicodeString& appendTo,FieldPosition& ) const {
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return appendTo;
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UnicodeString& format(int32_t ,UnicodeString& appendTo,FieldPosition& ) const {
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return appendTo.append((UChar)0x0033);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UnicodeString& format(int64_t number,UnicodeString& appendTo,FieldPosition& pos) const {
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NumberFormat::format(number, appendTo, pos);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UnicodeString& format(const Formattable& , UnicodeString& appendTo, FieldPosition& , UErrorCode& ) const {
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return appendTo;
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual void parse(const UnicodeString& ,
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Formattable& ,
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ParsePosition& ) const {}
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual void parse( const UnicodeString& ,
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        Formattable& ,
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UErrorCode& ) const {}
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UClassID getDynamicClassID(void) const {
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char classID = 0;
65750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return (UClassID)&classID;
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual Format* clone() const {return NULL;}
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestCoverage(void){
66459d709d503bab6e2b61931737e662dd293b40578ccornelius    StubNumberFormat stub;
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString agent("agent");
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t num = 4;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (stub.format(num, agent, pos) != UnicodeString("agent3")){
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("NumberFormat::format(int64, UnicodString&, FieldPosition&) should delegate to (int32, ,)");
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test various patterns
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestPatterns(void)
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
6796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) { errcheckln(status, "FAIL: Could not construct DecimalFormatSymbols - %s", u_errorName(status)); return; }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* pat[]    = { "#.#", "#.", ".#", "#" };
6828de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t pat_length = UPRV_LENGTHOF(pat);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* newpat[] = { "#0.#", "#0.", "#.0", "#" };
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* num[]    = { "0",   "0.", ".0", "0" };
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<pat_length; ++i)
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat fmt(pat[i], sym, status);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: DecimalFormat constructor failed for " + pat[i]); continue; }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString newp; fmt.toPattern(newp);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!(newp == newpat[i]))
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] +
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  "; " + newp + " seen instead");
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString s; (*(NumberFormat*)&fmt).format((int32_t)0, s);
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!(s == num[i]))
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"FAIL: Pattern " + pat[i] + " should format zero as " + num[i] +
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  "; " + s + " seen instead");
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"Min integer digits = " + fmt.getMinimumIntegerDigits());
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
70650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoicu_2_4::DigitList::operator== 0 0 2 icuuc24d.dll digitlst.cpp Doug
70750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoicu_2_4::DigitList::append 0 0 4 icuin24d.dll digitlst.h Doug
70850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoicu_2_4::DigitList::operator!= 0 0 1 icuuc24d.dll digitlst.h Doug
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
71150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestDigitList(void)
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // API coverage for DigitList
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DigitList list1;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  list1.append('1');
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  list1.fDecimalAt = 1;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DigitList list2;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  list2.set((int32_t)1);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (list1 != list2) {
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("digitlist append, operator!= or set failed ");
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (!(list1 == list2)) {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("digitlist append, operator== or set failed ");
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test exponential pattern
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestExponential(void)
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
7376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) { errcheckln(status, "FAIL: Bad status returned by DecimalFormatSymbols ct - %s", u_errorName(status)); return; }
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]"  };
7398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t pat_length = UPRV_LENGTHOF(pat);
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// The following #if statements allow this test to be built and run on
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// platforms that do not have standard IEEE numerics.  For example,
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// S/390 doubles have an exponent range of -78 to +75.  For the
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// following #if statements to work, float.h must define
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// DBL_MAX_10_EXP to be a compile-time constant.
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This section may be expanded as needed.
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if DBL_MAX_10_EXP > 300
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 };
7518de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t val_length = UPRV_LENGTHOF(val);
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* valFormat[] =
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.####E0
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271",
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 00.000E00
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272",
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ##0.######E000
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273",
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.###E0;[0.###E0]
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]"
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double valParse[] =
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123460000, 1.23E300, -3.1416E-271,
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123460000, 1.23E300, -3.1416E-271,
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123456800, 1.23E300, -3.141593E-271,
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123500000, 1.23E300, -3.142E-271,
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif DBL_MAX_10_EXP > 70
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double val[] = { 0.01234, 123456789, 1.23e70, -3.141592653e-71 };
7728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t val_length = UPRV_LENGTHOF(val);
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* valFormat[] =
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.####E0
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.234E-2", "1.2346E8", "1.23E70", "-3.1416E-71",
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 00.000E00
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "12.340E-03", "12.346E07", "12.300E69", "-31.416E-72",
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ##0.######E000
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "12.34E-003", "123.4568E006", "12.3E069", "-31.41593E-072",
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.###E0;[0.###E0]
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.234E-2", "1.235E8", "1.23E70", "[3.142E-71]"
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double valParse[] =
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123460000, 1.23E70, -3.1416E-71,
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123460000, 1.23E70, -3.1416E-71,
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123456800, 1.23E70, -3.141593E-71,
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.01234, 123500000, 1.23E70, -3.142E-71,
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Don't test double conversion
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double* val = 0;
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t val_length = 0;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char** valFormat = 0;
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double* valParse = 0;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Warning: Skipping double conversion tests");
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t lval[] = { 0, -1, 1, 123456789 };
8018de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t lval_length = UPRV_LENGTHOF(lval);
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* lvalFormat[] =
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.####E0
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0E0", "-1E0", "1E0", "1.2346E8",
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 00.000E00
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07",
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ##0.######E000
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0E000", "-1E000", "1E000", "123.4568E006",
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // 0.###E0;[0.###E0]
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0E0", "[1E0]", "1E0", "1.235E8"
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t lvalParse[] =
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, -1, 1, 123460000,
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, -1, 1, 123460000,
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, -1, 1, 123456800,
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, -1, 1, 123500000,
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ival = 0, ilval = 0;
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t p=0; p<pat_length; ++p)
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat fmt(pat[p], sym, status);
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("FAIL: Bad status returned by DecimalFormat ct"); continue; }
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Pattern \"" + pat[p] + "\" -toPattern-> \"" +
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fmt.toPattern(pattern) + "\"");
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t v;
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (v=0; v<val_length; ++v)
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString s; (*(NumberFormat*)&fmt).format(val[v], s);
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)" " + val[v] + " -format-> " + s);
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (s != valFormat[v+ival])
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: Expected " + valFormat[v+ival]);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pos(0);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable af;
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.parse(s, af, pos);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            double a;
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBool useEpsilon = FALSE;
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (af.getType() == Formattable::kLong)
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                a = af.getLong();
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (af.getType() == Formattable::kDouble) {
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                a = af.getDouble();
845103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // S/390 will show a failure like this:
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                //| -3.141592652999999e-271 -format-> -3.1416E-271
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                //|                          -parse-> -3.1416e-271
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                //| FAIL: Expected -3.141599999999999e-271
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // To compensate, we use an epsilon-based equality
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // test on S/390 only.  We don't want to do this in
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // general because it's less exacting.
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                useEpsilon = TRUE;
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: Non-numeric Formattable returned");
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pos.getIndex() == s.length())
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln((UnicodeString)"  -parse-> " + a);
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // Use epsilon comparison as necessary
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if ((useEpsilon &&
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (uprv_fabs(a - valParse[v+ival]) / a > (2*DBL_EPSILON))) ||
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (!useEpsilon && a != valParse[v+ival]))
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                {
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln((UnicodeString)"FAIL: Expected " + valParse[v+ival]);
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"  should be (" + s.length() + " chars) -> " + valParse[v+ival]);
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (v=0; v<lval_length; ++v)
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString s;
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (*(NumberFormat*)&fmt).format(lval[v], s);
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)" " + lval[v] + "L -format-> " + s);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (s != lvalFormat[v+ilval])
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"ERROR: Expected " + lvalFormat[v+ilval] + " Got: " + s);
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pos(0);
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable af;
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.parse(s, af, pos);
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (af.getType() == Formattable::kLong ||
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                af.getType() == Formattable::kInt64) {
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UErrorCode status = U_ZERO_ERROR;
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t a = af.getLong(status);
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (pos.getIndex() == s.length())
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                {
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln((UnicodeString)"  -parse-> " + a);
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (a != lvalParse[v+ilval])
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln((UnicodeString)"FAIL: Expected " + lvalParse[v+ilval]);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln((UnicodeString)"FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a);
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: Non-long Formattable returned for " + s
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    + " Double: " + af.getDouble()
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    + ", Long: " + af.getLong());
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ival += val_length;
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ilval += lval_length;
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestScientific2() {
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // jb 2552
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat* fmt = (DecimalFormat*)NumberFormat::createCurrencyInstance("en_US", status);
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double num = 12.34;
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(*fmt, num, "$12.34");
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->setScientificNotation(TRUE);
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(*fmt, num, "$1.23E1");
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->setScientificNotation(FALSE);
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(*fmt, num, "$12.34");
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestScientificGrouping() {
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // jb 2552
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("##0.00E0",status);
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, .01234, "12.3E-3");
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, .1234, "123E-3");
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, 1.234, "1.23E0");
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, 12.34, "12.3E0");
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, 123.4, "123E0");
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, 1234., "1.23E3");
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*static void setFromString(DigitList& dl, const char* str) {
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool decimalSet = FALSE;
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dl.clear();
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((c = *str++)) {
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c == '-') {
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dl.fIsPositive = FALSE;
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (c == '+') {
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dl.fIsPositive = TRUE;
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (c == '.') {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dl.fDecimalAt = dl.fCount;
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            decimalSet = TRUE;
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dl.append(c);
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!decimalSet) {
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dl.fDecimalAt = dl.fCount;
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}*/
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestInt64() {
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("#.#E0",status);
966c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
967c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
968c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
969c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setMaximumFractionDigits(20);
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)0, "0E0");
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)-1, "-1E0");
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)1, "1E0");
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)2147483647, "2.147483647E9");
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)((int64_t)-2147483647-1), "-2.147483648E9");
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)U_INT64_MAX, "9.223372036854775807E18");
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect(fmt, (Formattable)(int64_t)U_INT64_MIN, "-9.223372036854775808E18");
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // also test digitlist
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    int64_t int64max = U_INT64_MAX;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t int64min = U_INT64_MIN;
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* int64maxstr = "9223372036854775807";
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* int64minstr = "-9223372036854775808";
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString fail("fail: ");
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test max int64 value
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DigitList dl;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setFromString(dl, int64maxstr);
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!dl.fitsIntoInt64(FALSE)) {
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + int64maxstr + " didn't fit");
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64_t int64Value = dl.getInt64();
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != int64max) {
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + int64maxstr);
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dl.set(int64Value);
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64Value = dl.getInt64();
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != int64max) {
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + int64maxstr);
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test negative of max int64 value (1 shy of min int64 value)
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dl.fIsPositive = FALSE;
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!dl.fitsIntoInt64(FALSE)) {
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + "-" + int64maxstr + " didn't fit");
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64_t int64Value = dl.getInt64();
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != -int64max) {
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + "-" + int64maxstr);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dl.set(int64Value);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64Value = dl.getInt64();
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != -int64max) {
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + "-" + int64maxstr);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test min int64 value
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setFromString(dl, int64minstr);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!dl.fitsIntoInt64(FALSE)) {
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + "-" + int64minstr + " didn't fit");
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64_t int64Value = dl.getInt64();
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != int64min) {
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + int64minstr);
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dl.set(int64Value);
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64Value = dl.getInt64();
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (int64Value != int64min) {
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + int64minstr);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test negative of min int 64 value (1 more than max int64 value)
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dl.fIsPositive = TRUE; // won't fit
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dl.fitsIntoInt64(FALSE)) {
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(fail + "-(" + int64minstr + ") didn't fit");
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test the handling of quotes
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestQuotes(void)
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString *pat;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), status);
10556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
10566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status));
10576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete sym;
10586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
10596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat = new UnicodeString("a'fo''o'b#");
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *fmt = new DecimalFormat(*pat, *sym, status);
106250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString s;
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((NumberFormat*)fmt)->format((int32_t)123, s);
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Pattern \"" + *pat + "\"");
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format 123 -> " + escape(s));
106650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (!(s=="afo'ob123"))
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected afo'ob123");
106850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pat;
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat = new UnicodeString("a''b#");
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = new DecimalFormat(*pat, *sym, status);
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((NumberFormat*)fmt)->format((int32_t)123, s);
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Pattern \"" + *pat + "\"");
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format 123 -> " + escape(s));
107850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (!(s=="a'b123"))
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected a'b123");
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pat;
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sym;
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the handling of the currency symbol in patterns.
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestCurrencySign(void)
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale::getUS(), status);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar currency = 0x00A4;
10956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
10966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail to create DecimalFormatSymbols - %s", u_errorName(status));
10976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete sym;
10986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
10996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // "\xA4#,##0.00;-\xA4#,##0.00"
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat.append(currency).append("#,##0.00;-").
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        append(currency).append("#,##0.00");
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *fmt = new DecimalFormat(pat, *sym, status);
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s; ((NumberFormat*)fmt)->format(1234.56, s);
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat.truncate(0);
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\"");
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s));
110827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (s != "$1,234.56") dataerrln((UnicodeString)"FAIL: Expected $1,234.56");
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((NumberFormat*)fmt)->format(- 1234.56, s);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s));
111227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (s != "-$1,234.56") dataerrln((UnicodeString)"FAIL: Expected -$1,234.56");
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat.truncate(0);
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00"
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat.append(currency).append(currency).
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        append(" #,##0.00;").
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        append(currency).append(currency).
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        append(" -#,##0.00");
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = new DecimalFormat(pat, *sym, status);
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((NumberFormat*)fmt)->format(1234.56, s);
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Pattern \"" + fmt->toPattern(pat) + "\"");
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format " + 1234.56 + " -> " + escape(s));
112527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (s != "USD 1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD 1,234.56");
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((NumberFormat*)fmt)->format(-1234.56, s);
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)" Format " + (-1234.56) + " -> " + escape(s));
112927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (s != "USD -1,234.56") dataerrln((UnicodeString)"FAIL: Expected USD -1,234.56");
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sym;
11326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + u_errorName(status));
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
113450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); }
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::escape(UnicodeString& s)
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<s.length(); ++i)
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = s[(int32_t)i];
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c <= (UChar)0x7F) buf += c;
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf += (UChar)0x5c; buf += (UChar)0x55;
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf += toHexString((c & 0xF000) >> 12);
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf += toHexString((c & 0x0F00) >> 8);
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf += toHexString((c & 0x00F0) >> 4);
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf += toHexString(c & 0x000F);
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (s = buf);
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* testCases[][2]= {
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     /* locale ID */  /* expected */
116254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"ca_ES_PREEURO", "\\u20A7\\u00A01.150" },
1163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {"de_LU_PREEURO", "1,150\\u00A0F" },
1164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {"el_GR_PREEURO", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" },
1165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en_BE_PREEURO", "1.150,50\\u00A0BEF" },
1166fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"es_ES_PREEURO", "1.150\\u00A0\\u20A7" },
116754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"eu_ES_PREEURO", "\\u20A7\\u00A01.150" },
1168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {"gl_ES_PREEURO", "1.150\\u00A0\\u20A7" },
1169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"it_IT_PREEURO", "ITL\\u00A01.150" },
1170f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    {"pt_PT_PREEURO", "1,150$50\\u00A0\\u200B"}, // per cldrbug 7670
117127f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en_US@currency=JPY", "\\u00A51,150"},
117227f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en_US@currency=jpy", "\\u00A51,150"},
117327f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en-US-u-cu-jpy", "\\u00A51,150"}
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test localized currency patterns.
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestCurrency(void)
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status);
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("Error calling NumberFormat::createCurrencyInstance()");
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s; currencyFmt->format(1.50, s);
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Un pauvre ici a..........." + s);
1190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (!(s==CharsToUnicodeString("1,50\\u00A0$")))
1191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected 1,50<nbsp>$");
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete currencyFmt;
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256]={0};
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
119659d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)len;  // Suppress unused variable warning.
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status);
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currencyFmt->format(1.50, s);
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Un pauvre en Allemagne a.." + s);
1200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (!(s==CharsToUnicodeString("1,50\\u00A0DM")))
1201f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln((UnicodeString)"FAIL: Expected 1,50<nbsp>DM");
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete currencyFmt;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.truncate(0);
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status);
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currencyFmt->format(1.50, s);
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Un pauvre en France a....." + s);
1208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (!(s==CharsToUnicodeString("1,50\\u00A0F")))
1209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected 1,50<nbsp>F");
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete currencyFmt;
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status))
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Status " + (int32_t)status);
121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12148de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(int i=0; i < UPRV_LENGTHOF(testCases); i++){
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID = testCases[i][0];
1217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString expected(testCases[i][1], -1, US_INV);
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected = expected.unescape();
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.truncate(0);
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char loc[256]={0};
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_canonicalize(localeID, loc, 256, &status);
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Could not create currency formatter for locale %s",localeID);
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        currencyFmt->format(1150.50, s);
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(s!=expected){
122950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln(UnicodeString("FAIL: Expected: ")+expected
123050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    + UnicodeString(" Got: ") + s
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    + UnicodeString( " for locale: ")+ UnicodeString(localeID) );
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)){
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"FAIL: Status " + (int32_t)status);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete currencyFmt;
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
123950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the Currency object handling, new as of ICU 2.2.
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyObject() {
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
124750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    NumberFormat* fmt =
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat::createCurrencyInstance(Locale::getUS(), ec);
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
12516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: getCurrencyInstance(US) - %s", u_errorName(ec));
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale null("", "", "");
125750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, null, 1234.56, "$1,234.56");
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getFrance(),
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   1234.56, CharsToUnicodeString("\\u20AC1,234.56")); // Euro
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getJapan(),
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   1234.56, CharsToUnicodeString("\\u00A51,235")); // Yen
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale("fr", "CH", ""),
12678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                   1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getUS(),
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   1234.56, "$1,234.56");
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = NumberFormat::createCurrencyInstance(Locale::getFrance(), ec);
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getCurrencyInstance(FRANCE)");
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
128050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, null, 1234.56, CharsToUnicodeString("1 234,56 \\u20AC"));
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getJapan(),
1284f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                   1234.56, CharsToUnicodeString("1 235 JPY")); // Yen
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale("fr", "CH", ""),
12878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                   1234.56, "1 234,56 CHF"); // no more 0.05 rounding here, see cldrbug 5548
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getUS(),
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   1234.56, "1 234,56 $US");
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectCurrency(*fmt, Locale::getFrance(),
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   1234.56, CharsToUnicodeString("1 234,56 \\u20AC")); // Euro
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
129750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Do rudimentary testing of parsing.
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestParse(void)
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString arg("0");
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat* format = new DecimalFormat("00", status);
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Formattable n; format->parse(arg, n, status);
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"parse(" + arg + ") = " + n.getLong());
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (n.getType() != Formattable::kLong ||
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            n.getLong() != 0) errln((UnicodeString)"FAIL: Expected 0");
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
13156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) errcheckln(status, (UnicodeString)"FAIL: Status " + u_errorName(status));
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //catch(Exception e) {
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln((UnicodeString)"Exception caught: " + e);
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
132150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientAffixTestCases[] = {
1325103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "(1)",
1326103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "( 1)",
1327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "(1 )",
1328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "( 1 )"
1329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientMinusTestCases[] = {
1332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "-5",
1333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "\\u22125",
1334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "\\u20105"
1335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientCurrencyTestCases[] = {
1338103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$1,000",
1339103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$ 1,000",
1340103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$1000",
1341103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$ 1000",
1342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$1 000.00",
1343103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$ 1 000.00",
1344103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "$ 1\\u00A0000.00",
1345103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1000.00"
1346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
134859d709d503bab6e2b61931737e662dd293b40578ccornelius// changed from () to - per cldrbug 5674
1349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientNegativeCurrencyTestCases[] = {
135059d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$1,000",
135159d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$ 1,000",
135259d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$1000",
135359d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$ 1000",
135459d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$1 000.00",
135559d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$ 1 000.00",
135659d709d503bab6e2b61931737e662dd293b40578ccornelius        "- $ 1,000.00 ",
135759d709d503bab6e2b61931737e662dd293b40578ccornelius        "-$ 1\\u00A0000.00",
135859d709d503bab6e2b61931737e662dd293b40578ccornelius        "-1000.00"
1359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientPercentTestCases[] = {
1362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "25%",
1363103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        " 25%",
1364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        " 25 %",
1365103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    	"25 %",
1366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"25\\u00A0%",
1367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"25"
1368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *lenientNegativePercentTestCases[] = {
1371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"-25%",
1372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		" -25%",
1373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		" - 25%",
1374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"- 25 %",
1375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		" - 25 %",
1376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"-25 %",
1377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"-25\\u00A0%",
1378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"-25",
1379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"- 25"
1380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *strictFailureTestCases[] = {
1383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		" 1000",
1384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"10,00",
1385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		"1,000,.0"
1386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
1389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Test lenient parsing.
1390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
1391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid
1392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoNumberFormatTest::TestLenientParse(void)
1393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
1394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
1395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    DecimalFormat *format = new DecimalFormat("(#,##0)", status);
1396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Formattable n;
1397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (format == NULL || U_FAILURE(status)) {
1399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create DecimalFormat (#,##0) - %s", u_errorName(status));
1400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        format->setLenient(TRUE);
14028de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF (lenientAffixTestCases); t += 1) {
1403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	UnicodeString testCase = ctou(lenientAffixTestCases[t]);
1404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            format->parse(testCase, n, status);
1406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) || n.getType() != Formattable::kLong ||
1409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	n.getLong() != 1) {
1410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientAffixTestCases[t] + (UnicodeString) "\"");
1411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	status = U_ZERO_ERROR;
1412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       }
1414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       delete format;
1415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Locale en_US("en_US");
1418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Locale sv_SE("sv_SE");
1419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat *mFormat = NumberFormat::createInstance(sv_SE, UNUM_DECIMAL, status);
1421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (mFormat == NULL || U_FAILURE(status)) {
1423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create NumberFormat (sv_SE, UNUM_DECIMAL) - %s", u_errorName(status));
1424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        mFormat->setLenient(TRUE);
14268de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF(lenientMinusTestCases); t += 1) {
1427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString testCase = ctou(lenientMinusTestCases[t]);
1428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            mFormat->parse(testCase, n, status);
1430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) {
1433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\"");
1434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1437b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete mFormat;
1438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    mFormat = NumberFormat::createInstance(en_US, UNUM_DECIMAL, status);
1441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (mFormat == NULL || U_FAILURE(status)) {
1443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create NumberFormat (en_US, UNUM_DECIMAL) - %s", u_errorName(status));
1444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        mFormat->setLenient(TRUE);
14468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF(lenientMinusTestCases); t += 1) {
1447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString testCase = ctou(lenientMinusTestCases[t]);
1448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            mFormat->parse(testCase, n, status);
1450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) {
1453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\"");
1454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete mFormat;
1458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat *cFormat = NumberFormat::createInstance(en_US, UNUM_CURRENCY, status);
1461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (cFormat == NULL || U_FAILURE(status)) {
1463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create NumberFormat (en_US, UNUM_CURRENCY) - %s", u_errorName(status));
1464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        cFormat->setLenient(TRUE);
14668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF (lenientCurrencyTestCases); t += 1) {
1467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	UnicodeString testCase = ctou(lenientCurrencyTestCases[t]);
1468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            cFormat->parse(testCase, n, status);
1470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) ||n.getType() != Formattable::kLong ||
1473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	n.getLong() != 1000) {
1474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientCurrencyTestCases[t] + (UnicodeString) "\"");
1475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	status = U_ZERO_ERROR;
1476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
14798de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF (lenientNegativeCurrencyTestCases); t += 1) {
1480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	UnicodeString testCase = ctou(lenientNegativeCurrencyTestCases[t]);
1481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            cFormat->parse(testCase, n, status);
1483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) ||n.getType() != Formattable::kLong ||
1486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	n.getLong() != -1000) {
1487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientNegativeCurrencyTestCases[t] + (UnicodeString) "\"");
1488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	status = U_ZERO_ERROR;
1489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete cFormat;
1493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat *pFormat = NumberFormat::createPercentInstance(en_US, status);
1496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (pFormat == NULL || U_FAILURE(status)) {
1498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create NumberFormat::createPercentInstance (en_US) - %s", u_errorName(status));
1499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pFormat->setLenient(TRUE);
15018de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF (lenientPercentTestCases); t += 1) {
1502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	UnicodeString testCase = ctou(lenientPercentTestCases[t]);
1503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	pFormat->parse(testCase, n, status);
1505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getDouble());
1506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) ||n.getType() != Formattable::kDouble ||
1508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	n.getDouble() != 0.25) {
1509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientPercentTestCases[t] + (UnicodeString) "\"");
1510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	status = U_ZERO_ERROR;
1511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
15148de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        for (int32_t t = 0; t < UPRV_LENGTHOF (lenientNegativePercentTestCases); t += 1) {
1515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	UnicodeString testCase = ctou(lenientNegativePercentTestCases[t]);
1516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        	pFormat->parse(testCase, n, status);
1518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln((UnicodeString)"parse(" + testCase + ") = " + n.getDouble());
1519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status) ||n.getType() != Formattable::kDouble ||
1521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	n.getDouble() != -0.25) {
1522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientNegativePercentTestCases[t] + (UnicodeString) "\"");
1523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            	status = U_ZERO_ERROR;
1524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete pFormat;
1528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   // Test cases that should fail with a strict parse and pass with a
1531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   // lenient parse.
1532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   NumberFormat *nFormat = NumberFormat::createInstance(en_US, status);
1533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if (nFormat == NULL || U_FAILURE(status)) {
1535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       dataerrln("Unable to create NumberFormat (en_US) - %s", u_errorName(status));
1536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   } else {
1537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       // first, make sure that they fail with a strict parse
15388de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert       for (int32_t t = 0; t < UPRV_LENGTHOF(strictFailureTestCases); t += 1) {
1539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       UnicodeString testCase = ctou(strictFailureTestCases[t]);
1540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       nFormat->parse(testCase, n, status);
1542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       if (! U_FAILURE(status)) {
1545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		       errln((UnicodeString)"Strict Parse succeeded for \"" + (UnicodeString) strictFailureTestCases[t] + (UnicodeString) "\"");
1546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       }
1547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       status = U_ZERO_ERROR;
1549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       }
1550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       // then, make sure that they pass with a lenient parse
1552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       nFormat->setLenient(TRUE);
15538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert       for (int32_t t = 0; t < UPRV_LENGTHOF(strictFailureTestCases); t += 1) {
1554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       UnicodeString testCase = ctou(strictFailureTestCases[t]);
1555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       nFormat->parse(testCase, n, status);
1557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
1558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       if (U_FAILURE(status) ||n.getType() != Formattable::kLong ||
1560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	            	n.getLong() != 1000) {
1561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		       errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) strictFailureTestCases[t] + (UnicodeString) "\"");
1562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		       status = U_ZERO_ERROR;
1563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho	       }
1564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       }
1565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       delete nFormat;
1567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
1568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// -------------------------------------
1571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test proper rounding by the format method.
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::TestRounding487(void)
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(status);
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("Error calling NumberFormat::createInstance()");
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    roundingTest(*nf, 0.00159999, 4, "0.0016");
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    roundingTest(*nf, 0.00995, 4, "0.01");
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    roundingTest(*nf, 12.3995, 3, "12.4");
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    roundingTest(*nf, 12.4999, 0, "12");
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    roundingTest(*nf, - 19.5, 0, "-20");
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)status);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the functioning of the secondary grouping value.
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestSecondaryGrouping(void) {
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols ct");
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat f("#,##,###", US, status);
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormat ct");
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(f, (int32_t)123456789L, "12,34,56,789");
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(f, "#,##,###");
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f.applyPattern("#,###", status);
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "applyPattern");
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f.setSecondaryGroupingSize(4);
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(f, (int32_t)123456789L, "12,3456,789");
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(f, "#,####,###");
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *g = NumberFormat::createInstance(Locale("hi", "IN"), status);
161627f654740f2a26ad62a5c155af9199af9e69b889claireho    CHECK_DATA(status, "createInstance(hi_IN)");
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString out;
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l = (int32_t)1876543210L;
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    g->format(l, out);
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete g;
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // expect "1,87,65,43,210", but with Hindi digits
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //         01234567890123
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool ok = TRUE;
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (out.length() != 14) {
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ok = FALSE;
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i=0; i<out.length(); ++i) {
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBool expectGroup = FALSE;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            switch (i) {
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 1:
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 4:
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 7:
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 10:
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectGroup = TRUE;
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Later -- fix this to get the actual grouping
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // character from the resource bundle.
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBool isGroup = (out.charAt(i) == 0x002C);
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (isGroup != expectGroup) {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ok = FALSE;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!ok) {
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL  Expected " + l +
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " x hi_IN -> \"1,87,65,43,210\" (with Hindi digits), got \"" +
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(out) + "\"");
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok    " + l +
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " x hi_IN -> \"" +
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(out) + "\"");
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestWhiteSpaceParsing(void) {
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), ec);
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("a  b#0c  ", US, ec);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
16636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(ec, "FAIL: Constructor - %s", u_errorName(ec));
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n = 1234;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(fmt, "a b1234c ", n);
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(fmt, "a   b1234c   ", n);
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test currencies whose display name is a ChoiceFormat.
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestComplexCurrency() {
167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    UErrorCode ec = U_ZERO_ERROR;
1677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    Locale loc("kn", "IN", "");
1678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    NumberFormat* fmt = NumberFormat::createCurrencyInstance(loc, ec);
1679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    if (U_SUCCESS(ec)) {
1680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect2(*fmt, 1.0, CharsToUnicodeString("Re.\\u00A01.00"));
1681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        Use .00392625 because that's 2^-8.  Any value less than 0.005 is fine.
1682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect(*fmt, 1.00390625, CharsToUnicodeString("Re.\\u00A01.00")); // tricky
1683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect2(*fmt, 12345678.0, CharsToUnicodeString("Rs.\\u00A01,23,45,678.00"));
1684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect2(*fmt, 0.5, CharsToUnicodeString("Rs.\\u00A00.50"));
1685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect2(*fmt, -1.0, CharsToUnicodeString("-Re.\\u00A01.00"));
1686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        expect2(*fmt, -10.0, CharsToUnicodeString("-Rs.\\u00A010.00"));
1687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    } else {
1688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//        errln("FAIL: getCurrencyInstance(kn_IN)");
1689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    }
1690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//    delete fmt;
1691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
169550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatTest::roundingTest(NumberFormat& nf, double x, int32_t maxFractionDigits, const char* expected)
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf.setMaximumFractionDigits(maxFractionDigits);
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString out; nf.format(x, out);
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"" + x + " formats with " + maxFractionDigits + " fractional digits to " + out);
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(out==expected)) errln((UnicodeString)"FAIL: Expected " + expected);
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Upgrade to alphaWorks
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestExponent(void) {
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt1(UnicodeString("0.###E0"), US, status);
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormat(0.###E0)");
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt2(UnicodeString("0.###E+0"), US, status);
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormat(0.###E+0)");
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n = 1234;
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(fmt1, n, "1.234E3");
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(fmt2, n, "1.234E+3");
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(fmt1, "1.234E+3", n); // Either format should parse "E+3"
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Upgrade to alphaWorks
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestScientific(void) {
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test pattern round-trip
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000",
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "0.###E0;[0.###E0]" };
17338de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t PAT_length = UPRV_LENGTHOF(PAT);
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DIGITS[] = {
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // min int, max int, min frac, max frac
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 0, 0, // "#E0"
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1, 1, 0, 4, // "0.####E0"
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        2, 2, 3, 3, // "00.000E00"
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1, 3, 0, 4, // "##0.####E000"
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1, 1, 0, 3, // "0.###E0;[0.###E0]"
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<PAT_length; ++i) {
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pat(PAT[i]);
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat df(pat, US, status);
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "DecimalFormat constructor");
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pat2;
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df.toPattern(pat2);
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pat == pat2) {
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("Ok   Pattern rt \"") +
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat + "\" -> \"" +
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat2 + "\"");
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL Pattern rt \"") +
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat + "\" -> \"" +
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat2 + "\"");
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Make sure digit counts match what we expect
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (df.getMinimumIntegerDigits() != DIGITS[4*i] ||
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df.getMaximumIntegerDigits() != DIGITS[4*i+1] ||
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df.getMinimumFractionDigits() != DIGITS[4*i+2] ||
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df.getMaximumFractionDigits() != DIGITS[4*i+3]) {
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL \"" + pat +
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                "\" min/max int; min/max frac = ") +
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  df.getMinimumIntegerDigits() + "/" +
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  df.getMaximumIntegerDigits() + ";" +
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  df.getMinimumFractionDigits() + "/" +
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  df.getMaximumFractionDigits() + ", expect " +
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DIGITS[4*i] + "/" +
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DIGITS[4*i+1] + ";" +
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DIGITS[4*i+2] + "/" +
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DIGITS[4*i+3]);
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test the constructor for default locale. We have to
177750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // manually set the default locale, as there is no
177850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // guarantee that the default locale has the same
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // scientific format.
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale def = Locale::getDefault();
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getUS(), status);
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(NumberFormat::createScientificInstance(status),
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.678901,
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "1.2345678901E4", status);
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(def, status);
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("#E0", US, status),
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.0,
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "1.2345E4", status);
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("0E0", US, status),
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.0,
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "1E4", status);
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(NumberFormat::createScientificInstance(Locale::getUS(), status),
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.678901,
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "1.2345678901E4", status);
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.###E0", US, status),
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.0,
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "12.34E3", status);
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.###E0", US, status),
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.00001,
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "12.35E3", status);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.####E0", US, status),
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 12345,
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "12.345E3", status);
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(NumberFormat::createScientificInstance(Locale::getFrance(), status),
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12345.678901,
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "1,2345678901E4", status);
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.####E0", US, status),
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           789.12345e-9,
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "789.12E-9", status);
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.####E0", US, status),
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           780.e-9,
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "780E-9", status);
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat(".###E0", US, status),
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           45678.0,
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           ".457E5", status);
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(".###E0", US, status),
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 0,
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           ".0E0", status);
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat[] { new DecimalFormat("#E0", US),
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 new DecimalFormat("##E0", US),
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 new DecimalFormat("####E0", US),
182450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                 new DecimalFormat("0E0", US),
182550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                 new DecimalFormat("00E0", US),
182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                 new DecimalFormat("000E0", US),
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               },
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           new Long(45678000),
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           new String[] { "4.5678E7",
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "45.678E6",
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "4567.8E4",
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "5E7",
183350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                          "46E6",
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "457E5",
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           );
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ! Unroll this test into individual tests below...
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("#E0", US, status),
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "4.5678E7", status);
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##E0", US, status),
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "45.678E6", status);
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("####E0", US, status),
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "4567.8E4", status);
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("0E0", US, status),
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "5E7", status);
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("00E0", US, status),
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "46E6", status);
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("000E0", US, status),
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 45678000, "457E5", status);
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("###E0", US, status),
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           new Object[] { new Double(0.0000123), "12.3E-6",
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(0.000123), "123E-6",
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(0.00123), "1.23E-3",
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(0.0123), "12.3E-3",
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(0.123), "123E-3",
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(1.23), "1.23E0",
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(12.3), "12.3E0",
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(123), "123E0",
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Double(1230), "1.23E3",
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         });
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ! Unroll this test into individual tests below...
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.0000123, "12.3E-6", status);
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.000123, "123E-6", status);
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.00123, "1.23E-3", status);
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.0123, "12.3E-3", status);
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.123, "123E-3", status);
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.23, "1.23E0", status);
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           12.3, "12.3E0", status);
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           123.0, "123E0", status);
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("###E0", US, status),
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1230.0, "1.23E3", status);
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("0.#E+00", US, status),
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           new Object[] { new Double(0.00012), "1.2E-04",
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          new Long(12000),     "1.2E+04",
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         });
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ! Unroll this test into individual tests below...
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    !
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("0.#E+00", US, status),
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           0.00012, "1.2E-04", status);
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("0.#E+00", US, status),
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (int32_t) 12000, "1.2E+04", status);
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Upgrade to alphaWorks
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestPad(void) {
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("*^##.##", US, status),
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "^^^^0", status);
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("*^##.##", US, status),
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1.3, "^-1.3", status);
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "0.0E0______ g-m/s^2", status);
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.0/3, "333.333E-3_ g-m/s^2", status);
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "0.0______ g-m/s^2", status);
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.0/3, "0.33333__ g-m/s^2", status);
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test padding before a sign
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)";
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-10),  "xxxxxxxxxx(10.0)", status);
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-1000),"xxxxxxx(1,000.0)", status);
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-1000000),"xxx(1,000,000.0)", status);
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -100.37,       "xxxxxxxx(100.37)", status);
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -10456.37,     "xxxxx(10,456.37)", status);
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1120456.37,   "xx(1,120,456.37)", status);
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -112045600.37, "(112,045,600.37)", status);
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1252045600.37,"(1,252,045,600.37)", status);
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(10),  "xxxxxxxxxxxx10.0", status);
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(1000),"xxxxxxxxx1,000.0", status);
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(1000000),"xxxxx1,000,000.0", status);
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           100.37,       "xxxxxxxxxx100.37", status);
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           10456.37,     "xxxxxxx10,456.37", status);
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1120456.37,   "xxxx1,120,456.37", status);
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           112045600.37, "xx112,045,600.37", status);
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr, US, status),
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           10252045600.37,"10,252,045,600.37", status);
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test padding between a sign and a number
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)";
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-10),  "(10.0xxxxxxxxxx)", status);
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-1000),"(1,000.0xxxxxxx)", status);
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-1000000),"(1,000,000.0xxx)", status);
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -100.37,       "(100.37xxxxxxxx)", status);
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -10456.37,     "(10,456.37xxxxx)", status);
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1120456.37,   "(1,120,456.37xx)", status);
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -112045600.37, "(112,045,600.37)", status);
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1252045600.37,"(1,252,045,600.37)", status);
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(10),  "10.0xxxxxxxxxxxx", status);
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(1000),"1,000.0xxxxxxxxx", status);
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(1000000),"1,000,000.0xxxxx", status);
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           100.37,       "100.37xxxxxxxxxx", status);
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           10456.37,     "10,456.37xxxxxxx", status);
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1120456.37,   "1,120,456.37xxxx", status);
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           112045600.37, "112,045,600.37xx", status);
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(formatStr2, US, status),
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           10252045600.37,"10,252,045,600.37", status);
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //testing the setPadCharacter(UnicodeString) and getPadCharacterString()
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("#", US, status);
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormat constructor");
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString padString("P");
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadCharacter(padString);
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "*P##.##", DecimalFormat::kPadBeforePrefix, 5, padString);
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadCharacter((UnicodeString)"^");
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, (UnicodeString)"^");
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //commented untill implementation is complete
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*  fmt.setPadCharacter((UnicodeString)"^^^");
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "*^^^#", DecimalFormat::kPadBeforePrefix, 3, (UnicodeString)"^^^");
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    padString.remove();
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    padString.append((UChar)0x0061);
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    padString.append((UChar)0x0302);
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadCharacter(padString);
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000};
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern(patternChars);
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, pattern , DecimalFormat::kPadBeforePrefix, 4, padString);
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Upgrade to alphaWorks
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestPatterns2(void) {
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("#", US, status);
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormat constructor");
202850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar hat = 0x005E; /*^*/
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "*^#", DecimalFormat::kPadBeforePrefix, 1, hat);
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "$*^#", DecimalFormat::kPadAfterPrefix, 2, hat);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "#*^", DecimalFormat::kPadBeforeSuffix, 1, hat);
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "#$*^", DecimalFormat::kPadAfterSuffix, 2, hat);
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "$*^$#", ILLEGAL);
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "#$*^$", ILLEGAL);
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat::kPadBeforeSuffix,
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              12, (UChar)0x0078 /*x*/);
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "''#0*x", DecimalFormat::kPadBeforeSuffix,
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              3, (UChar)0x0078 /*x*/);
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, "'I''ll'*a###.##", DecimalFormat::kPadAfterPrefix,
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              10, (UChar)0x0061 /*a*/);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern("AA#,##0.00ZZ", status);
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "applyPattern");
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadCharacter(hat);
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(10);
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadPosition(DecimalFormat::kPadBeforePrefix);
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "*^AA#,##0.00ZZ");
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadPosition(DecimalFormat::kPadBeforeSuffix);
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA#,##0.00*^ZZ");
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadPosition(DecimalFormat::kPadAfterSuffix);
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA#,##0.00ZZ*^");
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //            12  3456789012
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString exp("AA*^#,##0.00ZZ", "");
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(12);
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setPadPosition(DecimalFormat::kPadAfterPrefix);
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, exp);
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(13);
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              12  34567890123
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA*^##,##0.00ZZ");
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(14);
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              12  345678901234
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA*^###,##0.00ZZ");
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(15);
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              12  3456789012345
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setFormatWidth(16);
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              12  34567890123456
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPat(fmt, "AA*^#,###,##0.00ZZ");
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestSurrogateSupport(void) {
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols custom(Locale::getUS(), status);
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, "decimal");
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, "plus");
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, " minus ");
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kExponentialSymbol, "exponent");
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString patternStr("*\\U00010000##.##", "");
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    patternStr = patternStr.unescape();
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expStr("\\U00010000\\U00010000\\U00010000\\U000100000", "");
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expStr = expStr.unescape();
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(patternStr, custom, status),
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), expStr, status);
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("*^##.##", custom, status),
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "^^^^0", status);
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##.##", custom, status),
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           -1.3, " minus 1decimal3", status);
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status),
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "0decimal0exponent0 g-m/s^2", status);
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status),
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.0/3, "333decimal333exponent minus 3 g-m/s^2", status);
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status),
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(0), "0decimal0 g-m/s^2", status);
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status),
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.0/3, "0decimal33333 g-m/s^2", status);
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString zero((UChar32)0x10000);
211927f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString one((UChar32)0x10001);
212027f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString two((UChar32)0x10002);
212127f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString five((UChar32)0x10005);
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero);
212327f654740f2a26ad62a5c155af9199af9e69b889claireho    custom.setSymbol(DecimalFormatSymbols::kOneDigitSymbol, one);
212427f654740f2a26ad62a5c155af9199af9e69b889claireho    custom.setSymbol(DecimalFormatSymbols::kTwoDigitSymbol, two);
212527f654740f2a26ad62a5c155af9199af9e69b889claireho    custom.setSymbol(DecimalFormatSymbols::kFiveDigitSymbol, five);
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expStr = UnicodeString("\\U00010001decimal\\U00010002\\U00010005\\U00010000", "");
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expStr = expStr.unescape();
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat("##0.000", custom, status),
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           1.25, expStr, status);
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, (UChar)0x30);
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "units of money");
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, "money separator");
2135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    patternStr = UNICODE_STRING_SIMPLE("0.00 \\u00A4' in your bank account'");
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    patternStr = patternStr.unescape();
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expStr = UnicodeString(" minus 20money separator00 units of money in your bank account", "");
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(patternStr, custom, status),
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-20), expStr, status);
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    custom.setSymbol(DecimalFormatSymbols::kPercentSymbol, "percent");
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    patternStr = "'You''ve lost ' -0.00 %' of your money today'";
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    patternStr = patternStr.unescape();
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expStr = UnicodeString(" minus You've lost   minus 2000decimal00 percent of your money today", "");
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect2(new DecimalFormat(patternStr, custom, status),
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int32_t(-20), expStr, status);
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyPatterns(void) {
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, locCount;
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale* locs = NumberFormat::getAvailableLocales(locCount);
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<locCount; ++i) {
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode ec = U_ZERO_ERROR;
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat* nf = NumberFormat::createCurrencyInstance(locs[i], ec);
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Can't create NumberFormat(%s) - %s", locs[i].getName(), u_errorName(ec));
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Make sure currency formats do not have a variable number
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // of fraction digits
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t min = nf->getMinimumFractionDigits();
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t max = nf->getMaximumFractionDigits();
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (min != max) {
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString a, b;
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                nf->format(1.0, a);
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                nf->format(1.125, b);
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: " + locs[i].getName() +
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " min fraction digits != max fraction digits; "
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      "x 1.0 => " + escape(a) +
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      "; x 1.125 => " + escape(b));
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Make sure EURO currency formats have exactly 2 fraction digits
217527f654740f2a26ad62a5c155af9199af9e69b889claireho            DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
217627f654740f2a26ad62a5c155af9199af9e69b889claireho            if (df != NULL) {
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (u_strcmp(EUR, df->getCurrency()) == 0) {
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (min != 2 || max != 2) {
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UnicodeString a;
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        nf->format(1.0, a);
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln((UnicodeString)"FAIL: " + locs[i].getName() +
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              " is a EURO format but it does not have 2 fraction digits; "
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              "x 1.0 => " +
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              escape(a));
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestRegCurrency(void) {
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar USD[4];
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US", USD, 4, &status);
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar YEN[4];
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("ja_JP", YEN, 4, &status);
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar TMP[4];
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar QQQ[] = {0x51, 0x51, 0x51, 0};
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
22036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Unable to get currency for locale, error %s", u_errorName(status));
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
220650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status);
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status);
220950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US", TMP, 4, &status);
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(YEN, TMP) != 0) {
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: didn't return YEN registered for en_US");
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_EURO", TMP, 4, &status);
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(QQQ, TMP) != 0) {
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: didn't return QQQ for en_US_EURO");
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
221950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status);
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fallbackLen) {
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: tried to fallback en_XX_BAR");
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
222550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!ucurr_unregister(enkey, &status)) {
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: couldn't unregister enkey");
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucurr_forLocale("en_US", TMP, 4, &status);
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: didn't return USD for en_US after unregister of en_US");
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
223550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_EURO", TMP, 4, &status);
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(QQQ, TMP) != 0) {
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US");
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
224050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_BLAH", TMP, 4, &status);
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: could not find USD for en_US_BLAH after unregister of en");
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
224650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!ucurr_unregister(enUSEUROkey, &status)) {
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: couldn't unregister enUSEUROkey");
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
225050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_EURO", TMP, 4, &status);
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(EUR, TMP) != 0) {
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_EURO");
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyNames(void) {
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Do a basic check of getName()
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // USD { "US$", "US Dollar"            } // 04/04/1792-
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar USD[] = {0x55, 0x53, 0x44, 0}; /*USD*/
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar USX[] = {0x55, 0x53, 0x58, 0}; /*USX*/
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar CAD[] = {0x43, 0x41, 0x44, 0}; /*CAD*/
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar ITL[] = {0x49, 0x54, 0x4C, 0}; /*ITL*/
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isChoiceFormat;
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len;
22696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    const UBool possibleDataError = TRUE;
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
227150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // THE LOCALE DATA before diving into the code.
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("USD.getName(SYMBOL_NAME)",
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString("$"),
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString(ucurr_getName(USD, "en",
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_SYMBOL_NAME,
22766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
22776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("USD.getName(LONG_NAME)",
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString("US Dollar"),
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString(ucurr_getName(USD, "en",
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_LONG_NAME,
22826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
22836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("CAD.getName(SYMBOL_NAME)",
2285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                 UnicodeString("CA$"),
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString(ucurr_getName(CAD, "en",
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_SYMBOL_NAME,
22886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
22896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("CAD.getName(SYMBOL_NAME)",
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString("$"),
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString(ucurr_getName(CAD, "en_CA",
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_SYMBOL_NAME,
22946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
22956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2296c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("USD.getName(SYMBOL_NAME) in en_NZ",
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString("US$"),
2298c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                 UnicodeString(ucurr_getName(USD, "en_NZ",
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_SYMBOL_NAME,
23006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
23016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("CAD.getName(SYMBOL_NAME)",
2303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                 UnicodeString("CA$"),
2304c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                 UnicodeString(ucurr_getName(CAD, "en_NZ",
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_SYMBOL_NAME,
23066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
23076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("USX.getName(LONG_NAME)",
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString("USX"),
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UnicodeString(ucurr_getName(USX, "en_US",
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UCURR_LONG_NAME,
23126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             &isChoiceFormat, &len, &ec)),
23136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                             possibleDataError);
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccess("ucurr_getName", ec);
231550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ec = U_ZERO_ERROR;
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test that a default or fallback warning is being returned. JB 4239.
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_getName(CAD, "es_ES", UCURR_LONG_NAME, &isChoiceFormat,
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &len, &ec);
232150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue("ucurr_getName (es_ES fallback)",
23226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError);
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_getName(CAD, "zh_TW", UCURR_LONG_NAME, &isChoiceFormat,
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &len, &ec);
232650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue("ucurr_getName (zh_TW fallback)",
23276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    U_USING_FALLBACK_WARNING == ec, TRUE, possibleDataError);
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_getName(CAD, "en_US", UCURR_LONG_NAME, &isChoiceFormat,
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &len, &ec);
233150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue("ucurr_getName (en_US default)",
233250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    U_USING_DEFAULT_WARNING == ec || U_USING_FALLBACK_WARNING == ec, TRUE);
233350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucurr_getName(CAD, "ti", UCURR_LONG_NAME, &isChoiceFormat,
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &len, &ec);
2336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    assertTrue("ucurr_getName (ti default)",
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_USING_DEFAULT_WARNING == ec, TRUE);
233850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test that a default warning is being returned when falling back to root. JB 4536.
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_getName(ITL, "cy", UCURR_LONG_NAME, &isChoiceFormat,
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &len, &ec);
234250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue("ucurr_getName (cy default to root)",
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_USING_DEFAULT_WARNING == ec, TRUE);
234450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TODO add more tests later
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyUnit(void){
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar USD[] = {85, 83, 68, 0}; /*USD*/
2351fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const UChar BAD[] = {63, 63, 63, 0}; /*???*/
2352fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const UChar BAD2[] = {63, 63, 65, 0}; /*???*/
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyUnit cu(USD, ec);
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccess("CurrencyUnit", ec);
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar * r = cu.getISOCurrency(); // who is the buffer owner ?
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("getISOCurrency()", USD, r);
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyUnit cu2(cu);
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(cu2 == cu)){
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CurrencyUnit copy constructed object should be same");
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyUnit * cu3 = (CurrencyUnit *)cu.clone();
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*cu3 == cu)){
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CurrencyUnit cloned object should be same");
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2368fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CurrencyUnit bad(BAD, ec);
2369fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    assertSuccess("CurrencyUnit", ec);
2370fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (cu.getIndex() == bad.getIndex()) {
2371fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Indexes of different currencies should differ.");
2372fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2373fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CurrencyUnit bad2(BAD2, ec);
2374fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    assertSuccess("CurrencyUnit", ec);
2375fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (bad2.getIndex() != bad.getIndex()) {
2376fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Indexes of unrecognized currencies should be the same.");
2377fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2378fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (bad == bad2) {
2379fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Different unrecognized currencies should not be equal.");
2380fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2381fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    bad = bad2;
2382fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (bad != bad2) {
2383fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Currency unit assignment should be the same.");
2384fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cu3;
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyAmount(void){
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar USD[] = {85, 83, 68, 0}; /*USD*/
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyAmount ca(9, USD, ec);
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccess("CurrencyAmount", ec);
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyAmount ca2(ca);
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(ca2 == ca)){
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CurrencyAmount copy constructed object should be same");
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ca2=ca;
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(ca2 == ca)){
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CurrencyAmount assigned object should be same");
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
240350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CurrencyAmount *ca3 = (CurrencyAmount *)ca.clone();
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*ca3 == ca)){
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CurrencyAmount cloned object should be same");
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ca3;
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestSymbolsWithBadLocale(void) {
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale locDefault;
2413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const char *badLocales[] = {
2414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // length < ULOC_FULLNAME_CAPACITY
2415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_VARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME",
2416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2417103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // length > ULOC_FULLNAME_CAPACITY
2418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x-crazy_ZZ_MY_SPECIAL_ADMINISTRATION_REGION_NEEDS_A_SPECIAL_VARIANT_WITH_A_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_REALLY_LONG_NAME"
2419103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }; // expect U_USING_DEFAULT_WARNING for both
2420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unsigned int i;
24228de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (i = 0; i < UPRV_LENGTHOF(badLocales); i++) {
2423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        const char *localeName = badLocales[i];
2424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        Locale locBad(localeName);
242564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        TEST_ASSERT_TRUE(!locBad.isBogus());
2426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UErrorCode status = U_ZERO_ERROR;
2427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString intlCurrencySymbol((UChar)0xa4);
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        intlCurrencySymbol.append((UChar)0xa4);
243064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
2431103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        logln("Current locale is %s", Locale::getDefault().getName());
2432103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        Locale::setDefault(locBad, status);
2433103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        logln("Current locale is %s", Locale::getDefault().getName());
2434103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        DecimalFormatSymbols mySymbols(status);
2435103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (status != U_USING_DEFAULT_WARNING) {
2436103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln("DecimalFormatSymbols should return U_USING_DEFAULT_WARNING.");
2437103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2438103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (strcmp(mySymbols.getLocale().getName(), locBad.getName()) != 0) {
2439103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln("DecimalFormatSymbols does not have the right locale.", locBad.getName());
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2441103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        int symbolEnum = (int)DecimalFormatSymbols::kDecimalSeparatorSymbol;
2442103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        for (; symbolEnum < (int)DecimalFormatSymbols::kFormatSymbolCount; symbolEnum++) {
2443103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            UnicodeString symbolString = mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum);
2444103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            logln(UnicodeString("DecimalFormatSymbols[") + symbolEnum + UnicodeString("] = ") + prettify(symbolString));
2445103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (symbolString.length() == 0
2446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                && symbolEnum != (int)DecimalFormatSymbols::kGroupingSeparatorSymbol
2447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                && symbolEnum != (int)DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol)
2448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            {
2449103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                errln("DecimalFormatSymbols has an empty string at index %d.", symbolEnum);
2450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        status = U_ZERO_ERROR;
2454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        Locale::setDefault(locDefault, status);
2455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        logln("Current locale is %s", Locale::getDefault().getName());
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check that adoptDecimalFormatSymbols and setDecimalFormatSymbols
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * behave the same, except for memory ownership semantics. (No
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * version of this test on Java, since Java has only one method.)
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestAdoptDecimalFormatSymbols(void) {
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *sym = new DecimalFormatSymbols(Locale::getUS(), ec);
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
24686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(ec, "Fail: DecimalFormatSymbols constructor - %s", u_errorName(ec));
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete sym;
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat(" #,##0.00");
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pat.insert(0, (UChar)0x00A4);
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt(pat, sym, ec);
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DecimalFormat constructor");
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(2350.75, str);
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str == "$ 2,350.75") {
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(str);
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
248527f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("Fail: " + str + ", expected $ 2,350.75");
2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym = new DecimalFormatSymbols(Locale::getUS(), ec);
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DecimalFormatSymbols constructor");
2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete sym;
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym->setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q");
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.adoptDecimalFormatSymbols(sym);
2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.truncate(0);
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(2350.75, str);
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str == "Q 2,350.75") {
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(str);
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
250227f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("Fail: adoptDecimalFormatSymbols -> " + str + ", expected Q 2,350.75");
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym = new DecimalFormatSymbols(Locale::getUS(), ec);
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DecimalFormatSymbols constructor");
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete sym;
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt2(pat, sym, ec);
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DecimalFormat constructor");
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
251650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym2(Locale::getUS(), ec);
2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DecimalFormatSymbols constructor");
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym2.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "Q");
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt2.setDecimalFormatSymbols(sym2);
2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.truncate(0);
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt2.format(2350.75, str);
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str == "Q 2,350.75") {
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(str);
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
253027f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("Fail: setDecimalFormatSymbols -> " + str + ", expected Q 2,350.75");
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestPerMill() {
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt(ctou("###.###\\u2030"), ec);
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccess("DecimalFormat ct", ec)) return;
2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("0.4857 x ###.###\\u2030",
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 ctou("485.7\\u2030"), fmt.format(0.4857, str));
254150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), ec);
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, ctou("m"));
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt2("", sym, ec);
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt2.applyLocalizedPattern("###.###m", ec);
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccess("setup", ec)) return;
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.truncate(0);
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEquals("0.4857 x ###.###m",
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 "485.7m", fmt2.format(0.4857, str));
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Generic test for patterns that should be legal/illegal.
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestIllegalPatterns() {
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test cases:
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Prefix with "-:" for illegal patterns
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Prefix with "+:" for legal patterns
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* DATA[] = {
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Unquoted special characters in the suffix are illegal
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "-:000.000|###",
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "+:000.000'|###'",
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; DATA[i]; ++i) {
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* pat=DATA[i];
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool valid = (*pat) == '+';
2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pat += 2;
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode ec = U_ZERO_ERROR;
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat fmt(pat, ec); // locale doesn't matter here
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(ec) == valid) {
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Ok: pattern \"%s\": %s",
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat, u_errorName(ec));
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
25756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errcheckln(ec, "FAIL: pattern \"%s\" should have %s; got %s",
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  pat, (valid?"succeeded":"failed"),
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  u_errorName(ec));
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* KEYWORDS[] = {
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*0*/ "ref=", // <reference pattern to parse numbers>
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*1*/ "loc=", // <locale for formats>
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*2*/ "f:",   // <pattern or '-'> <number> <exp. string>
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*3*/ "fp:",  // <pattern or '-'> <number> <exp. string> <exp. number>
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*4*/ "rt:",  // <pattern or '-'> <(exp.) number> <(exp.) string>
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*5*/ "p:",   // <pattern or '-'> <string> <exp. number>
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*6*/ "perr:", // <pattern or '-'> <invalid string>
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'>
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*8*/ "fpc:", // <pattern or '-'> <curr.amt> <exp. string> <exp. curr.amt>
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return an integer representing the next token from this
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iterator.  The integer will be an index into the given list, or
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * -1 if there are no more tokens, or -2 if the token is not on
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the list.
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t keywordIndex(const UnicodeString& tok) {
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; KEYWORDS[i]!=0; ++i) {
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tok==KEYWORDS[i]) {
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return i;
2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -1;
2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Parse a CurrencyAmount using the given NumberFormat, with
2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the 'delim' character separating the number and the currency.
2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void parseCurrencyAmount(const UnicodeString& str,
2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                const NumberFormat& fmt,
2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                UChar delim,
2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                Formattable& result,
2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                UErrorCode& ec) {
2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString num, cur;
2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = str.indexOf(delim);
2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.extractBetween(0, i, num);
2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.extractBetween(i+1, INT32_MAX, cur);
2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable n;
2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.parse(num, n, ec);
2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result.adoptObject(new CurrencyAmount(n, cur.getTerminatedBuffer(), ec));
2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCases() {
2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TextFile reader("NumberFormatTestCases.txt", "UTF8", ec);
2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
26346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Couldn't open NumberFormatTestCases.txt");
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TokenIterator tokens(&reader);
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc("en", "US", "");
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *ref = 0, *fmt = 0;
2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MeasureFormat *mfmt = 0;
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat, tok, mloc, str, out, where, currAmt;
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable n;
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (;;) {
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!tokens.next(tok, ec)) {
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        where = UnicodeString("(") + tokens.getLineNumber() + ") ";
2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t cmd = keywordIndex(tok);
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch (cmd) {
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0:
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // ref= <reference pattern>
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(tok, ec)) goto error;
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete ref;
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ref = new DecimalFormat(tok,
2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      new DecimalFormatSymbols(Locale::getUS(), ec), ec);
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dataerrln("Error constructing DecimalFormat");
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                goto error;
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1:
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // loc= <locale>
2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(tok, ec)) goto error;
266727f654740f2a26ad62a5c155af9199af9e69b889claireho            loc = Locale::createFromName(CharString().appendInvariantChars(tok, ec).data());
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 2: // f:
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 3: // fp:
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 4: // rt:
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 5: // p:
2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(tok, ec)) goto error;
2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (tok != "-") {
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pat = tok;
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                delete fmt;
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc, ec), ec);
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: " + where + "Pattern \"" + pat + "\": " + u_errorName(ec));
2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ec = U_ZERO_ERROR;
2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(tok, ec)) goto error;
2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(tok, ec)) goto error;
2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (cmd == 3) {
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if (!tokens.next(tok, ec)) goto error;
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (cmd == 2 || cmd == 3 || cmd == 4) {
2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // f: <pattern or '-'> <number> <exp. string>
2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // fp: <pattern or '-'> <number> <exp. string> <exp. number>
2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // rt: <pattern or '-'> <number> <string>
2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString num;
2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!tokens.next(num, ec)) goto error;
2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!tokens.next(str, ec)) goto error;
2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ref->parse(num, n, ec);
2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccess("parse", ec);
2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertEquals(where + "\"" + pat + "\".format(" + num + ")",
2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             str, fmt->format(n, out.remove(), ec));
2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccess("format", ec);
2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (cmd == 3) { // fp:
2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(num, ec)) goto error;
2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ref->parse(num, n, ec);
2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertSuccess("parse", ec);
2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (cmd != 2) { // != f:
2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Formattable m;
2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fmt->parse(str, m, ec);
2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertSuccess("parse", ec);
2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")",
2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 n, m);
271250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                }
2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // p: <pattern or '-'> <string to parse> <exp. number>
2715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString expstr;
2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!tokens.next(str, ec)) goto error;
2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!tokens.next(expstr, ec)) goto error;
2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                Formattable exp, n;
2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ref->parse(expstr, exp, ec);
2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccess("parse", ec);
2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt->parse(str, n, ec);
2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccess("parse", ec);
2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")",
2725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             exp, n);
2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 8: // fpc:
2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(tok, ec)) goto error;
2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (tok != "-") {
2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mloc = tok;
2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                delete mfmt;
2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mfmt = MeasureFormat::createCurrencyFormat(
273427f654740f2a26ad62a5c155af9199af9e69b889claireho                    Locale::createFromName(
273527f654740f2a26ad62a5c155af9199af9e69b889claireho                        CharString().appendInvariantChars(mloc, ec).data()), ec);
2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: " + where + "Loc \"" + mloc + "\": " + u_errorName(ec));
2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ec = U_ZERO_ERROR;
2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(tok, ec)) goto error;
2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(tok, ec)) goto error;
2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!tokens.next(tok, ec)) goto error;
2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2744f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            } else if (mfmt == NULL) {
2745f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                errln("FAIL: " + where + "Loc \"" + mloc + "\": skip case using previous locale, no valid MeasureFormat");
2746f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (!tokens.next(tok, ec)) goto error;
2747f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (!tokens.next(tok, ec)) goto error;
2748f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (!tokens.next(tok, ec)) goto error;
2749f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt>
2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(currAmt, ec)) goto error;
2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(str, ec)) goto error;
2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec);
2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (assertSuccess("parseCurrencyAmount", ec)) {
2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")",
2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             str, mfmt->format(n, out.remove(), ec));
2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccess("format", ec);
2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(currAmt, ec)) goto error;
2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec);
2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (assertSuccess("parseCurrencyAmount", ec)) {
2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                Formattable m;
2764b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mfmt->parseObject(str, m, ec);
2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (assertSuccess("parseCurrency", ec)) {
2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")",
2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 n, m);
2769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else {
2770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    errln("FAIL: source " + str);
2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 6:
2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // perr: <pattern or '-'> <invalid string>
2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Under construction");
2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto done;
2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 7: {
2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // pat: <pattern> <exp. toPattern, or '-' or 'err'>
2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString testpat;
2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString exppat;
2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(testpat, ec)) goto error;
2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!tokens.next(exppat, ec)) goto error;
2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBool err = exppat == "err";
2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBool existingPat = FALSE;
2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (testpat == "-") {
2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (err) {
2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: " + where + "Invalid command \"pat: - err\"");
2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                existingPat = TRUE;
2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testpat = pat;
2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exppat == "-") exppat = testpat;
2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            DecimalFormat* f = 0;
2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode ec2 = U_ZERO_ERROR;
2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (existingPat) {
2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                f = fmt;
2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                f = new DecimalFormat(testpat, ec2);
2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_SUCCESS(ec2)) {
2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (err) {
2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: " + where + "Invalid pattern \"" + testpat +
2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "\" was accepted");
2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString pat2;
2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertEquals(where + "\"" + testpat + "\".toPattern()",
2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 exppat, f->toPattern(pat2));
2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (err) {
2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln("Ok: " + where + "Invalid pattern \"" + testpat +
2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "\" failed: " + u_errorName(ec2));
2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: " + where + "Valid pattern \"" + testpat +
2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          "\" failed: " + u_errorName(ec2));
2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!existingPat) delete f;
2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } break;
2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case -1:
2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " + where + "Unknown command \"" + tok + "\"");
2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto done;
2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    goto done;
2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru error:
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(ec)) {
2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Unexpected EOF");
2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
28336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(ec, "FAIL: " + where + "Unexpected " + u_errorName(ec));
2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru done:
2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete mfmt;
2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ref;
2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Support methods
2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool NumberFormatTest::equalValue(const Formattable& a, const Formattable& b) {
2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (a.getType() == b.getType()) {
2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return a == b;
2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (a.getType() == Formattable::kLong) {
2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (b.getType() == Formattable::kInt64) {
2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return a.getLong() == b.getLong();
2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (b.getType() == Formattable::kDouble) {
285650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return (double) a.getLong() == b.getDouble(); // TODO check use of double instead of long
2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (a.getType() == Formattable::kDouble) {
2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (b.getType() == Formattable::kLong) {
2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return a.getDouble() == (double) b.getLong();
2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (b.getType() == Formattable::kInt64) {
2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return a.getDouble() == (double)b.getInt64();
2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (a.getType() == Formattable::kInt64) {
2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (b.getType() == Formattable::kLong) {
2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return a.getInt64() == (int64_t)b.getLong();
2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (b.getType() == Formattable::kDouble) {
2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return a.getInt64() == (int64_t)b.getDouble();
2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid NumberFormatTest::expect3(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) {
2875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Don't round-trip format test, since we explicitly do it
2876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expect_rbnf(fmt, n, str, FALSE);
2877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expect_rbnf(fmt, str, n);
2878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expect2(NumberFormat& fmt, const Formattable& n, const UnicodeString& str) {
2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Don't round-trip format test, since we explicitly do it
2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(fmt, n, str, FALSE);
2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect(fmt, str, n);
2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expect2(NumberFormat* fmt, const Formattable& n,
2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               const UnicodeString& exp,
2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               UErrorCode status) {
288927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (fmt == NULL || U_FAILURE(status)) {
289027f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("FAIL: NumberFormat constructor");
2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect2(*fmt, n, exp);
2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expect(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) {
2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable num;
2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.parse(str, num, status);
2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
290227f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln(UnicodeString("FAIL: Parse failed for \"") + str + "\" - " + u_errorName(status));
2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((DecimalFormat*) &fmt)->toPattern(pat);
2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (equalValue(num, n)) {
2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   \"") + str + "\" x " +
2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              pat + " = " +
2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(num));
2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
291227f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln(UnicodeString("FAIL \"") + str + "\" x " +
2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              pat + " = " +
2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(num) + ", expected " + toString(n));
2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid NumberFormatTest::expect_rbnf(NumberFormat& fmt, const UnicodeString& str, const Formattable& n) {
2919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Formattable num;
2921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    fmt.parse(str, num, status);
2922b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(status)) {
2923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        errln(UnicodeString("FAIL: Parse failed for \"") + str + "\"");
2924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
2925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (equalValue(num, n)) {
2927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        logln(UnicodeString("Ok   \"") + str + " = " +
2928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              toString(num));
2929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
2930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        errln(UnicodeString("FAIL \"") + str + " = " +
2931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              toString(num) + ", expected " + toString(n));
2932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid NumberFormatTest::expect_rbnf(NumberFormat& fmt, const Formattable& n,
2936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                              const UnicodeString& exp, UBool rt) {
2937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UnicodeString saw;
2938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    FieldPosition pos;
2939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    fmt.format(n, saw, pos, status);
2941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CHECK(status, "NumberFormat::format");
2942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (saw == exp) {
294350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        logln(UnicodeString("Ok   ") + toString(n) +
2944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              " = \"" +
2945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              escape(saw) + "\"");
2946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // We should be able to round-trip the formatted string =>
2947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // number => string (but not the other way around: number
2948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // => string => number2, might have number2 != number):
2949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (rt) {
2950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            Formattable n2;
2951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            fmt.parse(exp, n2, status);
2952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(status)) {
2953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\"");
2954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                return;
2955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
2956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UnicodeString saw2;
2957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            fmt.format(n2, saw2, pos, status);
2958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            CHECK(status, "NumberFormat::format");
2959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (saw2 != exp) {
2960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) +
2961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      " => \"" + saw2 + "\"");
2962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
2963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
296550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln(UnicodeString("FAIL ") + toString(n) +
2966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              " = \"" +
2967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              escape(saw) + "\", expected \"" + exp + "\"");
2968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expect(NumberFormat& fmt, const Formattable& n,
2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              const UnicodeString& exp, UBool rt) {
2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString saw;
2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(n, saw, pos, status);
2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "NumberFormat::format");
2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((DecimalFormat*) &fmt)->toPattern(pat);
2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (saw == exp) {
2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   ") + toString(n) + " x " +
2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(pat) + " = \"" +
2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(saw) + "\"");
2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // We should be able to round-trip the formatted string =>
2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // number => string (but not the other way around: number
2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // => string => number2, might have number2 != number):
2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rt) {
2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable n2;
2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.parse(exp, n2, status);
2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
299127f654740f2a26ad62a5c155af9199af9e69b889claireho                errln(UnicodeString("FAIL: Parse failed for \"") + exp + "\" - " + u_errorName(status));
2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString saw2;
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(n2, saw2, pos, status);
2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(status, "NumberFormat::format");
2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (saw2 != exp) {
2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL \"" + exp + "\" => " + toString(n2) +
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " => \"" + saw2 + "\"");
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
300327f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln(UnicodeString("FAIL ") + toString(n) + " x " +
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(pat) + " = \"" +
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              escape(saw) + "\", expected \"" + exp + "\"");
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expect(NumberFormat* fmt, const Formattable& n,
3010fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                              const UnicodeString& exp, UBool rt,
3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UErrorCode status) {
301227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (fmt == NULL || U_FAILURE(status)) {
301327f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("FAIL: NumberFormat constructor");
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3015fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        expect(*fmt, n, exp, rt);
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expectCurrency(NumberFormat& nf, const Locale& locale,
3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      double value, const UnicodeString& string) {
3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat& fmt = * (DecimalFormat*) &nf;
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar DEFAULT_CURR[] = {45/*-*/,0};
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar curr[4];
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(curr, DEFAULT_CURR);
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*locale.getLanguage() != 0) {
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucurr_forLocale(locale.getName(), curr, 4, &ec);
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        assertSuccess("ucurr_forLocale", ec);
3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt.setCurrency(curr, ec);
3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        assertSuccess("DecimalFormat::setCurrency", ec);
3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt.setCurrency(curr); //Deprecated variant, for coverage only
3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(value, s);
3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.findAndReplace((UChar32)0x00A0, (UChar32)0x0020);
3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Default display of the number yields "1234.5599999999999"
3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // instead of "1234.56".  Use a formatter to fix this.
304050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    NumberFormat* f =
3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat::createInstance(Locale::getUS(), ec);
3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString v;
3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Oops; bad formatter.  Use default op+= display.
3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        v = (UnicodeString)"" + value;
3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f->setMaximumFractionDigits(4);
3048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f->setGroupingUsed(FALSE);
3049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f->format(value, v);
3050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete f;
3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s == string) {
3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + v + " x " + curr + " => " + prettify(s));
3055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + v + " x " + curr + " => " + prettify(s) +
3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", expected " + prettify(string));
3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expectPat(DecimalFormat& fmt, const UnicodeString& exp) {
3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.toPattern(pat);
3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pat == exp) {
3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   \"") + pat + "\"");
3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL \"") + pat + "\", expected \"" + exp + "\"");
3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat,
3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 int32_t pos) {
3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, pat, pos, 0, (UnicodeString)"");
3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat,
3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 int32_t pos, int32_t width, UChar pad) {
3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectPad(fmt, pat, pos, width, UnicodeString(pad));
3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat,
3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 int32_t pos, int32_t width, const UnicodeString& pad) {
3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t apos = 0, awidth = 0;
3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString apadStr;
3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern(pat, status);
3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        apos = fmt.getPadPosition();
3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        awidth = fmt.getFormatWidth();
3088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        apadStr=fmt.getPadCharacterString();
3089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        apos = -1;
3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        awidth = width;
3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        apadStr = pad;
3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (apos == pos && awidth == width && apadStr == pad) {
3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString infoStr;
3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos == ILLEGAL) {
3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            infoStr = UnicodeString(" width=", "") + awidth + UnicodeString(" pad=", "") + apadStr;
3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   \"") + pat + "\" pos=" + apos + infoStr);
3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL \"") + pat + "\" pos=" + apos +
3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " width=" + awidth + " pad=" + apadStr +
3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", expected " + pos + " " + width + " " + pad);
3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
310659d709d503bab6e2b61931737e662dd293b40578ccornelius
310759d709d503bab6e2b61931737e662dd293b40578ccornelius// This test is flaky b/c the symbols for CNY and JPY are equivalent in this locale  - FIXME
310859d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestCompatibleCurrencies() {
310959d709d503bab6e2b61931737e662dd293b40578ccornelius/*
3110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const UChar JPY[] = {0x4A, 0x50, 0x59, 0};
3111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const UChar CNY[] = {0x43, 0x4E, 0x59, 0};
311259d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
311359d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<NumberFormat> fmt(
311459d709d503bab6e2b61931737e662dd293b40578ccornelius        NumberFormat::createCurrencyInstance(Locale::getUS(), status));
311559d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(status)) {
311659d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("Could not create number format instance.");
311759d709d503bab6e2b61931737e662dd293b40578ccornelius        return;
311859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
311959d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of halfwidth yen sign\n", __FILE__, __LINE__);
312059d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmt, JPY, 1235,  "\\u00A51,235");
312159d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of fullwidth yen sign\n", __FILE__, __LINE__);
312259d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmt, JPY, 1235,  "\\uFFE51,235");
312359d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of halfwidth yen sign\n", __FILE__, __LINE__);
312459d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmt, CNY, 1235,  "CN\\u00A51,235");
312559d709d503bab6e2b61931737e662dd293b40578ccornelius
312659d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<NumberFormat> fmtTW(
312759d709d503bab6e2b61931737e662dd293b40578ccornelius        NumberFormat::createCurrencyInstance(Locale::getTaiwan(), status));
312859d709d503bab6e2b61931737e662dd293b40578ccornelius
312959d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of halfwidth yen sign in TW\n", __FILE__, __LINE__);
313059d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmtTW, CNY, 1235,  "\\u00A51,235");
313159d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of fullwidth yen sign in TW\n", __FILE__, __LINE__);
313259d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmtTW, CNY, 1235,  "\\uFFE51,235");
313359d709d503bab6e2b61931737e662dd293b40578ccornelius
313459d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<NumberFormat> fmtJP(
313559d709d503bab6e2b61931737e662dd293b40578ccornelius        NumberFormat::createCurrencyInstance(Locale::getJapan(), status));
313659d709d503bab6e2b61931737e662dd293b40578ccornelius
313759d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of halfwidth yen sign in JP\n", __FILE__, __LINE__);
313859d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmtJP, JPY, 1235,  "\\u00A51,235");
313959d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d - testing parse of fullwidth yen sign in JP\n", __FILE__, __LINE__);
314059d709d503bab6e2b61931737e662dd293b40578ccornelius    expectParseCurrency(*fmtJP, JPY, 1235,  "\\uFFE51,235");
314159d709d503bab6e2b61931737e662dd293b40578ccornelius
314259d709d503bab6e2b61931737e662dd293b40578ccornelius    // more..
314359d709d503bab6e2b61931737e662dd293b40578ccornelius*/
314459d709d503bab6e2b61931737e662dd293b40578ccornelius}
314559d709d503bab6e2b61931737e662dd293b40578ccornelius
314659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::expectParseCurrency(const NumberFormat &fmt, const UChar* currency, double amount, const char *text) {
314759d709d503bab6e2b61931737e662dd293b40578ccornelius    ParsePosition ppos;
314859d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString utext = ctou(text);
314959d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<CurrencyAmount> currencyAmount(fmt.parseCurrency(utext, ppos));
315059d709d503bab6e2b61931737e662dd293b40578ccornelius    if (!ppos.getIndex()) {
315159d709d503bab6e2b61931737e662dd293b40578ccornelius        errln(UnicodeString("Parse of ") + utext + " should have succeeded.");
315259d709d503bab6e2b61931737e662dd293b40578ccornelius        return;
315359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
315459d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
315559d709d503bab6e2b61931737e662dd293b40578ccornelius
315659d709d503bab6e2b61931737e662dd293b40578ccornelius    char theInfo[100];
315759d709d503bab6e2b61931737e662dd293b40578ccornelius    sprintf(theInfo, "For locale %s, string \"%s\", currency ",
315859d709d503bab6e2b61931737e662dd293b40578ccornelius            fmt.getLocale(ULOC_ACTUAL_LOCALE, status).getBaseName(),
315959d709d503bab6e2b61931737e662dd293b40578ccornelius            text);
316059d709d503bab6e2b61931737e662dd293b40578ccornelius    u_austrcpy(theInfo+uprv_strlen(theInfo), currency);
316159d709d503bab6e2b61931737e662dd293b40578ccornelius
316259d709d503bab6e2b61931737e662dd293b40578ccornelius    char theOperation[100];
316359d709d503bab6e2b61931737e662dd293b40578ccornelius
316459d709d503bab6e2b61931737e662dd293b40578ccornelius    uprv_strcpy(theOperation, theInfo);
316559d709d503bab6e2b61931737e662dd293b40578ccornelius    uprv_strcat(theOperation, ", check amount:");
316659d709d503bab6e2b61931737e662dd293b40578ccornelius    assertTrue(theOperation, amount ==  currencyAmount->getNumber().getDouble(status));
316759d709d503bab6e2b61931737e662dd293b40578ccornelius
316859d709d503bab6e2b61931737e662dd293b40578ccornelius    uprv_strcpy(theOperation, theInfo);
316959d709d503bab6e2b61931737e662dd293b40578ccornelius    uprv_strcat(theOperation, ", check currency:");
317059d709d503bab6e2b61931737e662dd293b40578ccornelius    assertEquals(theOperation, currency, currencyAmount->getISOCurrency());
317159d709d503bab6e2b61931737e662dd293b40578ccornelius}
317259d709d503bab6e2b61931737e662dd293b40578ccornelius
317359d709d503bab6e2b61931737e662dd293b40578ccornelius
3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestJB3832(){
3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* localeID = "pt_PT@currency=PTE";
3176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc(localeID);
3177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3178f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString expected(CharsToUnicodeString("1,150$50\\u00A0\\u200B")); // per cldrbug 7670
3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat* currencyFmt = NumberFormat::createCurrencyInstance(loc, status);
3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
31826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Could not create currency formatter for locale %s - %s", localeID, u_errorName(status));
3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currencyFmt->format(1150.50, s);
3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s!=expected){
318750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln(UnicodeString("FAIL: Expected: ")+expected
318850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                + UnicodeString(" Got: ") + s
3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + UnicodeString( " for locale: ")+ UnicodeString(localeID) );
3190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Status %s", u_errorName(status));
3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete currencyFmt;
3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestHost()
3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
3199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API
3200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Win32NumberTest::testLocales(this);
3201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Locale loc("en_US@compat=host");
3203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (UNumberFormatStyle k = UNUM_DECIMAL;
3204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         k < UNUM_FORMAT_STYLE_COUNT; k = (UNumberFormatStyle)(k+1)) {
3205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        LocalPointer<NumberFormat> full(NumberFormat::createInstance(loc, k, status));
3207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (!NumberFormat::isStyleSupported(k)) {
3208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (status != U_UNSUPPORTED_ERROR) {
3209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("FAIL: expected style %d to be unsupported - %s",
3210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                      k, u_errorName(status));
3211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
3212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
3213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
3214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (full.isNull() || U_FAILURE(status)) {
3215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dataerrln("FAIL: Can't create number instance of style %d for host - %s",
3216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                      k, u_errorName(status));
3217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
3218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString result1;
3220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Formattable number(10.00);
3221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        full->format(number, result1, status);
3222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAIL: Can't format for host");
3224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
3225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Formattable formattable;
3227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        full->parse(result1, formattable, status);
3228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAIL: Can't parse for host");
3230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
3231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestHostClone()
3236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Verify that a cloned formatter gives the same results
3239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    and is useable after the original has been deleted.
3240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
3241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This is mainly important on Windows.
3242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc("en_US@compat=host");
3244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate now = Calendar::getNow();
3245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *full = NumberFormat::createInstance(loc, status);
3246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (full == NULL || U_FAILURE(status)) {
32476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: Can't create Relative date instance - %s", u_errorName(status));
3248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString result1;
3251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    full->format(now, result1, status);
3252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Format *fullClone = full->clone();
3253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete full;
3254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    full = NULL;
3255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString result2;
3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fullClone->format(now, result2, status);
3258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: format failure.");
3260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result1 != result2) {
3262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Clone returned different result from non-clone.");
3263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fullClone;
3265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestCurrencyFormat()
3268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test is here to increase code coverage.
3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MeasureFormat *cloneObj;
3272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
3273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable toFormat, result;
3274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar ISO_CODE[4] = {0x0047, 0x0042, 0x0050, 0};
3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  saveDefaultLocale = Locale::getDefault();
3277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault( Locale::getUK(), status );
3278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("couldn't set default Locale!");
3280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MeasureFormat *measureObj = MeasureFormat::createCurrencyFormat(status);
3284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault( saveDefaultLocale, status );
3285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
32866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: Status %s", u_errorName(status));
3287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cloneObj = (MeasureFormat *)measureObj->clone();
3290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cloneObj == NULL) {
3291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Clone doesn't work");
3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    toFormat.adoptObject(new CurrencyAmount(1234.56, ISO_CODE, status));
3295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    measureObj->format(toFormat, str, status);
3296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    measureObj->parseObject(str, result, status);
3297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Status %s", u_errorName(status));
3299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result != toFormat) {
3301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("measureObj does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat));
3302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.truncate(0);
3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cloneObj->format(toFormat, str, status);
3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cloneObj->parseObject(str, result, status);
3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Status %s", u_errorName(status));
3309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result != toFormat) {
3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Clone does not round trip. Formatted string was \"" + str + "\" Got: " + toString(result) + " Expected: " + toString(toFormat));
3312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*measureObj != *cloneObj) {
3314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Cloned object is not equal to the original object");
3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete measureObj;
3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cloneObj;
3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_USELESS_COLLATOR_ERROR;
3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (MeasureFormat::createCurrencyFormat(status) != NULL) {
3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("createCurrencyFormat should have returned NULL.");
3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Port of ICU4J rounding test. */
3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::TestRounding() {
3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Locale::getEnglish(), status);
3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
33316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Unable to create decimal formatter. - %s", u_errorName(status));
3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int roundingIncrements[]={1, 2, 5, 20, 50, 100};
3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int testValues[]={0, 300};
3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int j=0; j<2; j++) {
3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int mode=DecimalFormat::kRoundUp;mode<DecimalFormat::kRoundHalfEven;mode++) {
3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->setRoundingMode((DecimalFormat::ERoundingMode)mode);
3341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int increment=0; increment<6; increment++) {
3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                double base=testValues[j];
3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                double rInc=roundingIncrements[increment];
3344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                checkRounding(df, base, 20, rInc);
3345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                rInc=1.000000000/rInc;
3346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                checkRounding(df, base, 20, rInc);
3347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete df;
3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3353103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid NumberFormatTest::TestRoundingPattern() {
3354103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
3355103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    struct {
3356103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString  pattern;
3357103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        double        testCase;
3358103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString expected;
3359103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } tests[] = {
3360103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            { (UnicodeString)"##0.65", 1.234, (UnicodeString)"1.30" },
3361103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            { (UnicodeString)"#50",    1230,  (UnicodeString)"1250" }
3362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
33638de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t numOfTests = UPRV_LENGTHOF(tests);
3364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UnicodeString result;
3365103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3366103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    DecimalFormat *df = (DecimalFormat*)NumberFormat::createCurrencyInstance(Locale::getEnglish(), status);
3367103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
3368103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        dataerrln("Unable to create decimal formatter. - %s", u_errorName(status));
3369103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
3370103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
3371103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3372103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (int32_t i = 0; i < numOfTests; i++) {
3373103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        result.remove();
3374103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3375103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->applyPattern(tests[i].pattern, status);
3376103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (U_FAILURE(status)) {
3377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln("Unable to apply pattern to decimal formatter. - %s", u_errorName(status));
3378103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
3379103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3380103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->format(tests[i].testCase, result);
3381103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3382103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (result != tests[i].expected) {
3383103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected);
3384103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
3385103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
3386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    delete df;
3388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
3389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatTest::checkRounding(DecimalFormat* df, double base, int iterations, double increment) {
3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setRoundingIncrement(increment);
3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double lastParsed=INT32_MIN; //Intger.MIN_VALUE
3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=-iterations; i<=iterations;i++) {
3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double iValue=base+(increment*(i*0.1));
3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double smallIncrement=0.00000001;
3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (iValue!=0) {
3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            smallIncrement*=iValue;
3398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //we not only test the value, but some values in a small range around it
3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastParsed=checkRound(df, iValue-smallIncrement, lastParsed);
3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastParsed=checkRound(df, iValue, lastParsed);
3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastParsed=checkRound(df, iValue+smallIncrement, lastParsed);
3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querudouble NumberFormatTest::checkRound(DecimalFormat* df, double iValue, double lastParsed) {
3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
3408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString formattedDecimal;
3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double parsed;
3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable result;
3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(iValue, formattedDecimal, status);
3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error formatting number.");
3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(formattedDecimal, result, status);
3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error parsing number.");
3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsed=result.getDouble();
3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (lastParsed>parsed) {
3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Rounding wrong direction! %d > %d", lastParsed, parsed);
3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return lastParsed;
3430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid NumberFormatTest::TestNonpositiveMultiplier() {
3433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    DecimalFormatSymbols US(Locale::getUS(), status);
3435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    CHECK(status, "DecimalFormatSymbols constructor");
3436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    DecimalFormat df(UnicodeString("0"), US, status);
3437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    CHECK(status, "DecimalFormat(0)");
343850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // test zero multiplier
3440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t mult = df.getMultiplier();
3442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    df.setMultiplier(0);
3443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (df.getMultiplier() != mult) {
3444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln("DecimalFormat.setMultiplier(0) did not ignore its zero input");
3445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
344650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // test negative multiplier
344850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    df.setMultiplier(-1);
3450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (df.getMultiplier() != -1) {
3451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln("DecimalFormat.setMultiplier(-1) ignored its negative input");
3452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
3453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
345450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, "1122.123", -1122.123);
3456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, "-1122.123", 1122.123);
3457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, "1.2", -1.2);
3458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, "-1.2", 1.2);
3459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
346050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Note:  the tests with the final parameter of FALSE will not round trip.
346150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //        The initial numeric value will format correctly, after the multiplier.
346250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //        Parsing the formatted text will be out-of-range for an int64, however.
346350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //        The expect() function could be modified to detect this and fall back
346450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //        to looking at the decimal parsed value, but it doesn't.
346550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, U_INT64_MIN,    "9223372036854775808", FALSE);
346650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, U_INT64_MIN+1,  "9223372036854775807");
346750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, (int64_t)-123,                  "123");
346850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, (int64_t)123,                  "-123");
3469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, U_INT64_MAX-1, "-9223372036854775806");
347050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, U_INT64_MAX,   "-9223372036854775807");
3471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    df.setMultiplier(-2);
3473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, -(U_INT64_MIN/2)-1, "-9223372036854775806");
347450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, -(U_INT64_MIN/2),   "-9223372036854775808");
347550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, -(U_INT64_MIN/2)+1, "-9223372036854775810", FALSE);
3476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    df.setMultiplier(-7);
347850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, -(U_INT64_MAX/7)-1, "9223372036854775814", FALSE);
347950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expect(df, -(U_INT64_MAX/7),   "9223372036854775807");
3480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expect(df, -(U_INT64_MAX/7)+1, "9223372036854775800");
3481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // TODO: uncomment (and fix up) all the following int64_t tests once BigInteger is ported
3483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // (right now the big numbers get turned into doubles and lose tons of accuracy)
3484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, U_INT64_MAX, Int64ToUnicodeString(-U_INT64_MAX));
3485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, U_INT64_MIN, UnicodeString(Int64ToUnicodeString(U_INT64_MIN), 1));
3486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, U_INT64_MAX / 2, Int64ToUnicodeString(-(U_INT64_MAX / 2)));
3487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, U_INT64_MIN / 2, Int64ToUnicodeString(-(U_INT64_MIN / 2)));
3488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // TODO: uncomment (and fix up) once BigDecimal is ported and DecimalFormat can handle it
3490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
3491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
3492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
3493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    //expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
3494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
3495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
3497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char * stringToParse;
3498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int          parsedPos;
3499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int          errorIndex;
3500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool        lenient;
3501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} TestSpaceParsingItem;
3502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
350350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
3504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestSpaceParsing() {
3505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // the data are:
3506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // the string to be parsed, parsed position, parsed error index
3507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const TestSpaceParsingItem DATA[] = {
3508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // TOTO: Update the following TODOs, some may be handled now
3509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124",           4, -1, FALSE},
3510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124 $124",      4, -1, FALSE},
3511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124 ",          4, -1, FALSE},
3512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        //{"$ 124 ",       5, -1, FALSE}, // TODO: need to handle space correctly
3513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        //{"$\\u00A0124 ", 5, -1, FALSE}, // TODO: need to handle space correctly
3514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$ 124 ",         0,  1, FALSE}, // errorIndex used to be 0, now 1 (better)
3515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$\\u00A0124 ",   0,  1, FALSE}, // errorIndex used to be 0, now 1 (better)
3516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {" $ 124 ",        0,  0, FALSE}, // TODO: need to handle space correctly
3517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"124$",           0,  3, FALSE}, // TODO: need to handle space correctly
3518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // {"124 $",       5, -1, FALSE}, // TODO: OK or not, need currency spacing rule
3519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"124 $",          0,  3, FALSE},
3520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124",           4, -1, TRUE},
3521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124 $124",      4, -1, TRUE},
3522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$124 ",          4, -1, TRUE},
3523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$ 124 ",         5, -1, TRUE},
3524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"$\\u00A0124 ",   5, -1, TRUE},
3525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {" $ 124 ",        6, -1, TRUE},
3526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        //{"124$",         4, -1, TRUE}, // TODO: need to handle trailing currency correctly
3527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"124$",           3, -1, TRUE},
3528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        //{"124 $",        5, -1, TRUE}, // TODO: OK or not, need currency spacing rule
3529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"124 $",          4, -1, TRUE},
3530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Locale locale("en_US");
3533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat* foo = NumberFormat::createCurrencyInstance(locale, status);
3534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
3535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(status)) {
3536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete foo;
3537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
3538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
35398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i = 0; i < UPRV_LENGTHOF(DATA); ++i) {
3540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ParsePosition parsePosition(0);
3541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString stringToBeParsed = ctou(DATA[i].stringToParse);
3542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int parsedPosition = DATA[i].parsedPos;
3543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int errorIndex = DATA[i].errorIndex;
3544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        foo->setLenient(DATA[i].lenient);
3545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Formattable result;
3546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        foo->parse(stringToBeParsed, result, parsePosition);
3547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (parsePosition.getIndex() != parsedPosition ||
3548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            parsePosition.getErrorIndex() != errorIndex) {
3549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("FAILED parse " + stringToBeParsed + "; lenient: " + DATA[i].lenient + "; wrong position, expected: (" + parsedPosition + ", " + errorIndex + "); got (" + parsePosition.getIndex() + ", " + parsePosition.getErrorIndex() + ")");
3550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (parsePosition.getErrorIndex() == -1 &&
355250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.getType() == Formattable::kLong &&
3553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            result.getLong() != 124) {
3554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAILED parse " + stringToBeParsed + "; wrong number, expect: 124, got " + result.getLong());
3555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete foo;
3558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/**
3561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Test using various numbering systems and numbering system keyword.
3562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
3563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliustypedef struct {
3564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char *localeName;
3565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    double      value;
3566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UBool        isRBNF;
3567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char *expectedResult;
3568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} TestNumberingSystemItem;
3569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid NumberFormatTest::TestNumberingSystems() {
3571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const TestNumberingSystemItem DATA[] = {
3573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "en_US@numbers=thai", 1234.567, FALSE, "\\u0E51,\\u0E52\\u0E53\\u0E54.\\u0E55\\u0E56\\u0E57" },
3574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "en_US@numbers=hebr", 5678.0, TRUE, "\\u05D4\\u05F3\\u05EA\\u05E8\\u05E2\\u05F4\\u05D7" },
3575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "en_US@numbers=arabext", 1234.567, FALSE, "\\u06F1\\u066c\\u06F2\\u06F3\\u06F4\\u066b\\u06F5\\u06F6\\u06F7" },
357659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_EG", 1234.567, FALSE, "\\u0661\\u066C\\u0662\\u0663\\u0664\\u066b\\u0665\\u0666\\u0667" },
3577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "th_TH@numbers=traditional", 1234.567, FALSE, "\\u0E51,\\u0E52\\u0E53\\u0E54.\\u0E55\\u0E56\\u0E57" }, // fall back to native per TR35
3578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "ar_MA", 1234.567, FALSE, "1.234,567" },
3579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "en_US@numbers=hanidec", 1234.567, FALSE, "\\u4e00,\\u4e8c\\u4e09\\u56db.\\u4e94\\u516d\\u4e03" },
3580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "ta_IN@numbers=native", 1234.567, FALSE, "\\u0BE7,\\u0BE8\\u0BE9\\u0BEA.\\u0BEB\\u0BEC\\u0BED" },
3581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "ta_IN@numbers=traditional", 1235.0, TRUE, "\\u0BF2\\u0BE8\\u0BF1\\u0BE9\\u0BF0\\u0BEB" },
3582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "ta_IN@numbers=finance", 1234.567, FALSE, "1,234.567" }, // fall back to default per TR35
3583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "zh_TW@numbers=native", 1234.567, FALSE, "\\u4e00,\\u4e8c\\u4e09\\u56db.\\u4e94\\u516d\\u4e03" },
3584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { "zh_TW@numbers=traditional", 1234.567, TRUE, "\\u4E00\\u5343\\u4E8C\\u767E\\u4E09\\u5341\\u56DB\\u9EDE\\u4E94\\u516D\\u4E03" },
358554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "zh_TW@numbers=finance", 1234.567, TRUE, "\\u58F9\\u4EDF\\u8CB3\\u4F70\\u53C3\\u62FE\\u8086\\u9EDE\\u4F0D\\u9678\\u67D2" },
3586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { NULL, 0, FALSE, NULL }
3587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
3588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode ec;
359027f654740f2a26ad62a5c155af9199af9e69b889claireho
3591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const TestNumberingSystemItem *item;
3592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (item = DATA; item->localeName != NULL; item++) {
3593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        ec = U_ZERO_ERROR;
3594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        Locale loc = Locale::createFromName(item->localeName);
359550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3596fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        NumberFormat *origFmt = NumberFormat::createInstance(loc,ec);
3597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (U_FAILURE(ec)) {
3598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            dataerrln("FAIL: getInstance(%s) - %s", item->localeName, u_errorName(ec));
3599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            continue;
3600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
3601fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // Clone to test ticket #10682
3602fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        NumberFormat *fmt = (NumberFormat *) origFmt->clone();
3603fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        delete origFmt;
3604fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (item->isRBNF) {
3607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            expect3(*fmt,item->value,CharsToUnicodeString(item->expectedResult));
3608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        } else {
3609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            expect2(*fmt,item->value,CharsToUnicodeString(item->expectedResult));
3610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
3611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        delete fmt;
3612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Test bogus keyword value
3616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ec = U_ZERO_ERROR;
3617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    Locale loc4 = Locale::createFromName("en_US@numbers=foobar");
3618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    NumberFormat* fmt4= NumberFormat::createInstance(loc4, ec);
3619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( ec != U_UNSUPPORTED_ERROR ) {
3620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        errln("FAIL: getInstance(en_US@numbers=foobar) should have returned U_UNSUPPORTED_ERROR");
3621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        delete fmt4;
3622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
362427f654740f2a26ad62a5c155af9199af9e69b889claireho    ec = U_ZERO_ERROR;
362550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    NumberingSystem *ns = NumberingSystem::createInstance(ec);
362650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(ec)) {
362750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("FAIL: NumberingSystem::createInstance(ec); - %s", u_errorName(ec));
362850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
362950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
363027f654740f2a26ad62a5c155af9199af9e69b889claireho    if ( ns != NULL ) {
363127f654740f2a26ad62a5c155af9199af9e69b889claireho        ns->getDynamicClassID();
363227f654740f2a26ad62a5c155af9199af9e69b889claireho        ns->getStaticClassID();
363327f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
363427f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("FAIL: getInstance() returned NULL.");
363527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
363650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
363750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    NumberingSystem *ns1 = new NumberingSystem(*ns);
363850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (ns1 == NULL) {
363950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("FAIL: NumberSystem copy constructor returned NULL.");
364050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
364150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
364250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete ns1;
364350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete ns;
3644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
3645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
364850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
3649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestMultiCurrencySign() {
3650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* DATA[][6] = {
3651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // the fields in the following test are:
365250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // locale,
365350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // currency pattern (with negative pattern),
3654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency number to be formatted,
3655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency format using currency symbol name, such as "$" for USD,
3656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency format using currency ISO name, such as "USD",
3657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency format using plural name, such as "US dollars".
3658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // for US locale
365950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"},
366050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"},
366159d709d503bab6e2b61931737e662dd293b40578ccornelius        {"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"},
3662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // for CHINA locale
3663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\uFFE51,234.56", "CNY1,234.56", "\\u4EBA\\u6C11\\u5E011,234.56"},
3664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\uFFE51,234.56)", "(CNY1,234.56)", "(\\u4EBA\\u6C11\\u5E011,234.56)"},
3665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\uFFE51.00", "CNY1.00", "\\u4EBA\\u6C11\\u5E011.00"}
3666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar doubleCurrencySign[] = {0xA4, 0xA4, 0};
3669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UnicodeString doubleCurrencyStr(doubleCurrencySign);
3670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar tripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0};
3671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UnicodeString tripleCurrencyStr(tripleCurrencySign);
3672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
36738de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i=0; i<UPRV_LENGTHOF(DATA); ++i) {
3674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char* locale = DATA[i][0];
3675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString pat = ctou(DATA[i][1]);
3676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        double numberToBeFormat = atof(DATA[i][2]);
3677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale(locale), status);
3679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete sym;
3681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
3682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int j=1; j<=3; ++j) {
3684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // j represents the number of currency sign in the pattern.
3685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (j == 2) {
3686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                pat = pat.findAndReplace(ctou("\\u00A4"), doubleCurrencyStr);
3687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else if (j == 3) {
3688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                pat = pat.findAndReplace(ctou("\\u00A4\\u00A4"), tripleCurrencyStr);
3689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            DecimalFormat* fmt = new DecimalFormat(pat, new DecimalFormatSymbols(*sym), status);
3692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(status)) {
3693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("FAILED init DecimalFormat ");
3694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                delete fmt;
3695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                continue;
3696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UnicodeString s;
3698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            ((NumberFormat*) fmt)->format(numberToBeFormat, s);
3699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][3] is the currency format result using a
3700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // single currency sign.
3701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][4] is the currency format result using
3702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // double currency sign.
3703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][5] is the currency format result using
3704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // triple currency sign.
3705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][j+2] is the currency format result using
3706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // 'j' number of currency sign.
3707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UnicodeString currencyFormatResult = ctou(DATA[i][2+j]);
3708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (s.compare(currencyFormatResult)) {
3709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("FAIL format: Expected " + currencyFormatResult + "; Got " + s);
3710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // mix style parsing
3712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            for (int k=3; k<=5; ++k) {
3713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // DATA[i][3] is the currency format result using a
3714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // single currency sign.
3715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // DATA[i][4] is the currency format result using
3716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // double currency sign.
3717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // DATA[i][5] is the currency format result using
3718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              // triple currency sign.
3719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              UnicodeString oneCurrencyFormat = ctou(DATA[i][k]);
3720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              UErrorCode status = U_ZERO_ERROR;
3721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              Formattable parseRes;
3722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              fmt->parse(oneCurrencyFormat, parseRes, status);
3723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              if (U_FAILURE(status) ||
3724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                  (parseRes.getType() == Formattable::kDouble &&
372550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   parseRes.getDouble() != numberToBeFormat) ||
3726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                  (parseRes.getType() == Formattable::kLong &&
3727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                   parseRes.getLong() != numberToBeFormat)) {
3728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                  errln("FAILED parse " + oneCurrencyFormat + "; (i, j, k): " +
3729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        i + ", " + j + ", " + k);
3730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              }
3731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete fmt;
3733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete sym;
3735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
373950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
3740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestCurrencyFormatForMixParsing() {
3741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    MeasureFormat* curFmt = MeasureFormat::createCurrencyFormat(Locale("en_US"), status);
3743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(status)) {
3744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete curFmt;
3745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
3746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* formats[] = {
3748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "$1,234.56",  // string to be parsed
3749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USD1,234.56",
3750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollars1,234.56",
3751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1,234.56 US dollars"
3752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
375327f654740f2a26ad62a5c155af9199af9e69b889claireho    const CurrencyAmount* curramt = NULL;
37548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i = 0; i < UPRV_LENGTHOF(formats); ++i) {
3755b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString stringToBeParsed = ctou(formats[i]);
375627f654740f2a26ad62a5c155af9199af9e69b889claireho        logln(UnicodeString("stringToBeParsed: ") + stringToBeParsed);
3757b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Formattable result;
3758b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3759b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        curFmt->parseObject(stringToBeParsed, result, status);
3760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
376150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          errln("FAIL: measure format parsing: '%s' ec: %s", formats[i], u_errorName(status));
376250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else if (result.getType() != Formattable::kObject ||
376327f654740f2a26ad62a5c155af9199af9e69b889claireho            (curramt = dynamic_cast<const CurrencyAmount*>(result.getObject())) == NULL ||
376427f654740f2a26ad62a5c155af9199af9e69b889claireho            curramt->getNumber().getDouble() != 1234.56 ||
376527f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString(curramt->getISOCurrency()).compare(ISO_CURRENCY_USD)
376627f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
3767b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number ");
376827f654740f2a26ad62a5c155af9199af9e69b889claireho            if (curramt->getNumber().getDouble() != 1234.56) {
376927f654740f2a26ad62a5c155af9199af9e69b889claireho                errln((UnicodeString)"wong number, expect: 1234.56" + ", got: " + curramt->getNumber().getDouble());
3770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
377127f654740f2a26ad62a5c155af9199af9e69b889claireho            if (curramt->getISOCurrency() != ISO_CURRENCY_USD) {
377227f654740f2a26ad62a5c155af9199af9e69b889claireho                errln((UnicodeString)"wong currency, expect: USD" + ", got: " + curramt->getISOCurrency());
3773b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3775b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete curFmt;
3777b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3778b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3779b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
378050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
3781b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestDecimalFormatCurrencyParse() {
3782b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Locale.US
3783b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3784b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    DecimalFormatSymbols* sym = new DecimalFormatSymbols(Locale("en_US"), status);
3785b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(status)) {
3786b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete sym;
3787b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
3788b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3789b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UnicodeString pat;
3790b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar currency = 0x00A4;
3791b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // "\xA4#,##0.00;-\xA4#,##0.00"
3792b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00");
3793b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    DecimalFormat* fmt = new DecimalFormat(pat, sym, status);
3794b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(status)) {
3795b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete fmt;
3796b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        errln("failed to new DecimalFormat in TestDecimalFormatCurrencyParse");
3797b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
3798b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3799b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* DATA[][2] = {
3800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // the data are:
3801b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // string to be parsed, the parsed result (number)
380250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"$1.00", "1"},
380350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"USD1.00", "1"},
380450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"1.00 US dollar", "1"},
380550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"$1,234.56", "1234.56"},
380650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"USD1,234.56", "1234.56"},
380750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"1,234.56 US dollar", "1234.56"},
3808b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
38098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i = 0; i < UPRV_LENGTHOF(DATA); ++i) {
3810b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString stringToBeParsed = ctou(DATA[i][0]);
3811b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        double parsedResult = atof(DATA[i][1]);
3812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3813b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Formattable result;
3814b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fmt->parse(stringToBeParsed, result, status);
3815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status) ||
3816b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            (result.getType() == Formattable::kDouble &&
3817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            result.getDouble() != parsedResult) ||
3818b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            (result.getType() == Formattable::kLong &&
3819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            result.getLong() != parsedResult)) {
3820b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln((UnicodeString)"FAIL parse: Expected " + parsedResult);
3821b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3823b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete fmt;
382450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
3825b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3826b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
382750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
3828b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestCurrencyIsoPluralFormat() {
3829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const char* DATA[][6] = {
3830b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // the data are:
383150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // locale,
3832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency amount to be formatted,
3833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency ISO code to be formatted,
3834b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using CURRENCYSTYLE,
3835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using ISOCURRENCYSTYLE,
3836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using PLURALCURRENCYSTYLE,
383750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
383859d709d503bab6e2b61931737e662dd293b40578ccornelius        {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
3839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
384059d709d503bab6e2b61931737e662dd293b40578ccornelius        {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
3841c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00\\u7F8E\\u5143"},
3842c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56\\u7F8E\\u5143"},
3843c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00\\u4EBA\\u6C11\\u5E01"},
3844c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "CNY1,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"},
3845c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
3846c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"ru_RU", "2", "RUB", "2,00\\u00A0\\u20BD", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
3847c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"ru_RU", "5", "RUB", "5,00\\u00A0\\u20BD", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
3848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // test locale without currency information
384950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"},
3850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // test choice format
3851c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"es_AR", "1", "INR", "INR\\u00A01,00", "INR\\u00A01,00", "1,00 rupia india"},
3852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
3853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UNumberFormatStyle currencyStyles[] = {
3854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY,
3855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY_ISO,
3856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY_PLURAL
3857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
385850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3859f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (int32_t i=0; i<UPRV_LENGTHOF(DATA); ++i) {
3860f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius      for (int32_t kIndex = 0; kIndex < UPRV_LENGTHOF(currencyStyles); ++kIndex) {
3861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNumberFormatStyle k = currencyStyles[kIndex];
3862b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char* localeString = DATA[i][0];
3863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        double numberToBeFormat = atof(DATA[i][1]);
3864b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char* currencyISOCode = DATA[i][2];
3865b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Locale locale(localeString);
3866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status);
3868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete numFmt;
38706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status));
3871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
3872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar currencyCode[4];
387427f654740f2a26ad62a5c155af9199af9e69b889claireho        u_charsToUChars(currencyISOCode, currencyCode, 4);
3875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numFmt->setCurrency(currencyCode, status);
3876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete numFmt;
3878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln((UnicodeString)"can not set currency:" + currencyISOCode);
3879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
3880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
388150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString strBuf;
3883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numFmt->format(numberToBeFormat, strBuf);
3884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int resultDataIndex = 3 + kIndex;
3885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // DATA[i][resultDataIndex] is the currency format result
3886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // using 'k' currency style.
3887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString formatResult = ctou(DATA[i][resultDataIndex]);
3888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (strBuf.compare(formatResult)) {
3889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAIL: Expected " + formatResult + " actual: " + strBuf);
3890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // test parsing, and test parsing for all currency formats.
3892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int j = 3; j < 6; ++j) {
389350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            // DATA[i][3] is the currency format result using
3894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // CURRENCYSTYLE formatter.
3895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][4] is the currency format result using
3896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // ISOCURRENCYSTYLE formatter.
3897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][5] is the currency format result using
3898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // PLURALCURRENCYSTYLE formatter.
3899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]);
3900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
3901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            Formattable parseResult;
3902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            numFmt->parse(oneCurrencyFormatResult, parseResult, status);
3903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(status) ||
3904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (parseResult.getType() == Formattable::kDouble &&
3905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                 parseResult.getDouble() != numberToBeFormat) ||
3906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (parseResult.getType() == Formattable::kLong &&
3907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                 parseResult.getLong() != numberToBeFormat)) {
390850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                errln((UnicodeString)"FAIL: getCurrencyFormat of locale " +
3909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      localeString + " failed roundtripping the number");
3910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (parseResult.getType() == Formattable::kDouble) {
3911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getDouble());
3912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else {
3913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    errln((UnicodeString)"expected: " + numberToBeFormat + "; actual: " +parseResult.getLong());
3914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
3915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete numFmt;
391850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
3919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3922b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid
3923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestCurrencyParsing() {
3924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const char* DATA[][6] = {
3925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // the data are:
392650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // locale,
3927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency amount to be formatted,
3928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // currency ISO code to be formatted,
3929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using CURRENCYSTYLE,
3930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using ISOCURRENCYSTYLE,
3931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // format result using PLURALCURRENCYSTYLE,
3932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"},
393359d709d503bab6e2b61931737e662dd293b40578ccornelius        {"pa_IN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00 \\u0a2f\\u0a42.\\u0a10\\u0a38. \\u0a21\\u0a3e\\u0a32\\u0a30"},
3934c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"es_AR", "1", "USD", "US$\\u00A01,00", "USD\\u00A01,00", "1,00 d\\u00f3lar estadounidense"},
393564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        {"ar_EG", "1", "USD", "\\u0661\\u066b\\u0660\\u0660\\u00a0US$", "\\u0661\\u066b\\u0660\\u0660\\u00a0USD", "\\u0661\\u066b\\u0660\\u0660 \\u062f\\u0648\\u0644\\u0627\\u0631 \\u0623\\u0645\\u0631\\u064a\\u0643\\u064a"},
393664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        {"fa_CA", "1", "USD", "\\u06f1\\u066b\\u06f0\\u06f0\\u00a0\\u061c$", "\\u06f1\\u066b\\u06f0\\u06f0\\u00a0\\u061cUSD", "\\u06f1\\u066b\\u06f0\\u06f0 \\u062f\\u0644\\u0627\\u0631 \\u0627\\u0645\\u0631\\u06cc\\u06a9\\u0627"},
393764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        {"he_IL", "1", "USD", "\\u200f1.00\\u00a0$", "\\u200f1.00\\u00a0USD", "1.00 \\u05d3\\u05d5\\u05dc\\u05e8 \\u05d0\\u05de\\u05e8\\u05d9\\u05e7\\u05d0\\u05d9"},
393859d709d503bab6e2b61931737e662dd293b40578ccornelius        {"hr_HR", "1", "USD", "1,00\\u00a0USD", "1,00\\u00a0USD", "1,00 Ameri\\u010dki dolar"},
3939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {"id_ID", "1", "USD", "US$1,00", "USD1,00", "1,00 Dolar Amerika Serikat"},
394059d709d503bab6e2b61931737e662dd293b40578ccornelius        {"it_IT", "1", "USD", "1,00\\u00a0US$", "1,00\\u00a0USD", "1,00 Dollaro Statunitense"},
3941c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"ko_KR", "1", "USD", "US$1.00", "USD1.00", "1.00 \\ubbf8\\uad6d \\ub2ec\\ub7ec"},
39421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00\\u7c73\\u30c9\\u30eb"},
3943c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
394459d709d503bab6e2b61931737e662dd293b40578ccornelius        {"zh_TW", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"},
394559d709d503bab6e2b61931737e662dd293b40578ccornelius        {"zh_Hant", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"},
394659d709d503bab6e2b61931737e662dd293b40578ccornelius        {"zh_Hant", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00 \\u65e5\\u5713"},
39471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        {"ja_JP", "1", "JPY", "\\uFFE51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"},
39481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        {"ja_JP", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"},
3949c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u0439 \\u0440\\u0443\\u0431\\u043B\\u044C"}
3950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UNumberFormatStyle currencyStyles[] = {
3952b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY,
3953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY_ISO,
3954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY_PLURAL
3955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
395659d709d503bab6e2b61931737e662dd293b40578ccornelius    static const char* currencyStyleNames[] = {
395759d709d503bab6e2b61931737e662dd293b40578ccornelius      "UNUM_CURRENCY",
395859d709d503bab6e2b61931737e662dd293b40578ccornelius      "UNUM_CURRENCY_ISO",
395959d709d503bab6e2b61931737e662dd293b40578ccornelius      "UNUM_CURRENCY_PLURAL"
396059d709d503bab6e2b61931737e662dd293b40578ccornelius    };
396150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#ifdef NUMFMTST_CACHE_DEBUG
3963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruint deadloop = 0;
3964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querufor (;;) {
3965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printf("loop: %d\n", deadloop++);
3966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
39678de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i=0; i< UPRV_LENGTHOF(DATA); ++i) {  /* i = test case #  - should be i=0*/
3968f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius      for (int32_t kIndex = 2; kIndex < UPRV_LENGTHOF(currencyStyles); ++kIndex) {
396959d709d503bab6e2b61931737e662dd293b40578ccornelius        UNumberFormatStyle k = currencyStyles[kIndex]; /* k = style */
3970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char* localeString = DATA[i][0];
3971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        double numberToBeFormat = atof(DATA[i][1]);
3972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char* currencyISOCode = DATA[i][2];
3973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Locale locale(localeString);
3974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status);
397659d709d503bab6e2b61931737e662dd293b40578ccornelius        logln("#%d NumberFormat(%s, %s) Currency=%s\n",
397759d709d503bab6e2b61931737e662dd293b40578ccornelius              i, localeString, currencyStyleNames[kIndex],
397859d709d503bab6e2b61931737e662dd293b40578ccornelius              currencyISOCode);
397959d709d503bab6e2b61931737e662dd293b40578ccornelius
3980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete numFmt;
39826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"can not create instance, locale:" + localeString + ", style: " + k + " - " + u_errorName(status));
3983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
3984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar currencyCode[4];
3986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        u_charsToUChars(currencyISOCode, currencyCode, 4);
3987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numFmt->setCurrency(currencyCode, status);
3988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
3989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete numFmt;
3990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln((UnicodeString)"can not set currency:" + currencyISOCode);
3991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
3992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
399350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString strBuf;
3995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numFmt->format(numberToBeFormat, strBuf);
399659d709d503bab6e2b61931737e662dd293b40578ccornelius        /*
3997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int resultDataIndex = 3 + kIndex;
3998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // DATA[i][resultDataIndex] is the currency format result
3999b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // using 'k' currency style.
4000b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString formatResult = ctou(DATA[i][resultDataIndex]);
4001b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (strBuf.compare(formatResult)) {
4002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("FAIL: Expected " + formatResult + " actual: " + strBuf);
4003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
4004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        */
4005b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // test parsing, and test parsing for all currency formats.
4006b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int j = 3; j < 6; ++j) {
400750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            // DATA[i][3] is the currency format result using
4008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // CURRENCYSTYLE formatter.
4009b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][4] is the currency format result using
4010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // ISOCURRENCYSTYLE formatter.
4011b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // DATA[i][5] is the currency format result using
4012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // PLURALCURRENCYSTYLE formatter.
4013b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UnicodeString oneCurrencyFormatResult = ctou(DATA[i][j]);
4014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
4015b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            Formattable parseResult;
401659d709d503bab6e2b61931737e662dd293b40578ccornelius            logln("parse(%s)", DATA[i][j]);
4017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            numFmt->parse(oneCurrencyFormatResult, parseResult, status);
4018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(status) ||
4019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (parseResult.getType() == Formattable::kDouble &&
4020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                 parseResult.getDouble() != numberToBeFormat) ||
4021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (parseResult.getType() == Formattable::kLong &&
4022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                 parseResult.getLong() != numberToBeFormat)) {
402359d709d503bab6e2b61931737e662dd293b40578ccornelius                errln((UnicodeString)"FAIL: NumberFormat(" + localeString +", " + currencyStyleNames[kIndex] +
402459d709d503bab6e2b61931737e662dd293b40578ccornelius                      "), Currency="+currencyISOCode+", parse("+DATA[i][j]+") returned error " + (UnicodeString)u_errorName(status)+".  Testcase: data[" + i + "][" + currencyStyleNames[j-3] +"="+j+"]");
4025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (parseResult.getType() == Formattable::kDouble) {
402659d709d503bab6e2b61931737e662dd293b40578ccornelius                    errln((UnicodeString)"expected: " + numberToBeFormat + "; actual (double): " +parseResult.getDouble());
4027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else {
402859d709d503bab6e2b61931737e662dd293b40578ccornelius                    errln((UnicodeString)"expected: " + numberToBeFormat + "; actual (long): " +parseResult.getLong());
4029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
403059d709d503bab6e2b61931737e662dd293b40578ccornelius                errln((UnicodeString)" round-trip would be: " + strBuf);
4031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
4032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
4033b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete numFmt;
403450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
4035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
4036b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#ifdef NUMFMTST_CACHE_DEBUG
4037b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
4038b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
4039b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
4040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
4041b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
4042b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid
4043b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruNumberFormatTest::TestParseCurrencyInUCurr() {
4044b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* DATA[] = {
4045b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US DOLLAR",  // case in-sensitive
4046b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "$1.00",
4047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USD1.00",
4048b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollar1.00",
4049b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollars1.00",
4050b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "$1.00",
405154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        "A$1.00",
4052b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ADP1.00",
4053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ADP1.00",
4054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AED1.00",
4055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AED1.00",
4056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AFA1.00",
4057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AFA1.00",
4058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AFN1.00",
4059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ALL1.00",
4060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AMD1.00",
4061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ANG1.00",
4062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AOA1.00",
4063b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AOK1.00",
4064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AOK1.00",
4065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AON1.00",
4066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AON1.00",
4067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AOR1.00",
4068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AOR1.00",
4069b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "ARS1.00",
4070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ARA1.00",
4071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ARA1.00",
4072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ARP1.00",
4073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ARP1.00",
4074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ARS1.00",
4075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ATS1.00",
4076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ATS1.00",
4077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AUD1.00",
4078b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AWG1.00",
4079b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AZM1.00",
4080b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AZM1.00",
4081b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AZN1.00",
408259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Afghan Afghani (1927\\u20132002)1.00",
408359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Afghan afghani (1927\\u20132002)1.00",
4084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Afghan Afghani1.00",
4085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Afghan Afghanis1.00",
4086b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Albanian Lek1.00",
4087b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Albanian lek1.00",
4088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Albanian lek\\u00eb1.00",
4089b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Algerian Dinar1.00",
4090b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Algerian dinar1.00",
4091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Algerian dinars1.00",
4092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Andorran Peseta1.00",
4093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Andorran peseta1.00",
4094b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Andorran pesetas1.00",
409559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan Kwanza (1977\\u20131991)1.00",
409659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan Readjusted Kwanza (1995\\u20131999)1.00",
4097b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Angolan Kwanza1.00",
409859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan New Kwanza (1990\\u20132000)1.00",
409959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan kwanza (1977\\u20131991)1.00",
410059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan readjusted kwanza (1995\\u20131999)1.00",
4101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Angolan kwanza1.00",
410259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan kwanzas (1977\\u20131991)1.00",
410359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan readjusted kwanzas (1995\\u20131999)1.00",
4104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Angolan kwanzas1.00",
410559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan new kwanza (1990\\u20132000)1.00",
410659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan new kwanzas (1990\\u20132000)1.00",
4107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine Austral1.00",
410859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Argentine Peso (1983\\u20131985)1.00",
4109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine Peso1.00",
4110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine austral1.00",
4111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine australs1.00",
411259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Argentine peso (1983\\u20131985)1.00",
4113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine peso1.00",
411459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Argentine pesos (1983\\u20131985)1.00",
4115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine pesos1.00",
4116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Armenian Dram1.00",
4117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Armenian dram1.00",
4118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Armenian drams1.00",
4119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Aruban Florin1.00",
4120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Aruban florin1.00",
4121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Australian Dollar1.00",
4122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Australian dollar1.00",
4123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Australian dollars1.00",
4124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Austrian Schilling1.00",
4125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Austrian schilling1.00",
4126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Austrian schillings1.00",
412759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Azerbaijani Manat (1993\\u20132006)1.00",
4128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Azerbaijani Manat1.00",
412959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Azerbaijani manat (1993\\u20132006)1.00",
4130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Azerbaijani manat1.00",
413159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Azerbaijani manats (1993\\u20132006)1.00",
4132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Azerbaijani manats1.00",
4133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BAD1.00",
4134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BAD1.00",
4135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BAM1.00",
4136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BBD1.00",
4137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BDT1.00",
4138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BEC1.00",
4139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BEC1.00",
4140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BEF1.00",
4141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BEL1.00",
4142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BEL1.00",
4143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BGL1.00",
4144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BGN1.00",
4145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BGN1.00",
4146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BHD1.00",
4147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BIF1.00",
4148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BMD1.00",
4149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BND1.00",
4150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BOB1.00",
4151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BOP1.00",
4152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BOP1.00",
4153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BOV1.00",
4154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BOV1.00",
4155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRB1.00",
4156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRB1.00",
4157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRC1.00",
4158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRC1.00",
4159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRE1.00",
4160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRE1.00",
4161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRL1.00",
4162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRN1.00",
4163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRN1.00",
4164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRR1.00",
4165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BRR1.00",
4166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BSD1.00",
4167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BSD1.00",
4168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BTN1.00",
4169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BUK1.00",
4170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BUK1.00",
4171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BWP1.00",
4172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BYB1.00",
4173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BYB1.00",
4174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BYR1.00",
4175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BZD1.00",
4176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahamian Dollar1.00",
4177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahamian dollar1.00",
4178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahamian dollars1.00",
4179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahraini Dinar1.00",
4180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahraini dinar1.00",
4181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahraini dinars1.00",
4182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bangladeshi Taka1.00",
4183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bangladeshi taka1.00",
4184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bangladeshi takas1.00",
4185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Barbadian Dollar1.00",
4186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Barbadian dollar1.00",
4187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Barbadian dollars1.00",
418864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Belarusian Ruble (1994\\u20131999)1.00",
4189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belarusian Ruble1.00",
419064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Belarusian ruble (1994\\u20131999)1.00",
419164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Belarusian rubles (1994\\u20131999)1.00",
4192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belarusian ruble1.00",
4193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belarusian rubles1.00",
4194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Franc (convertible)1.00",
4195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Franc (financial)1.00",
4196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Franc1.00",
4197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian franc (convertible)1.00",
4198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian franc (financial)1.00",
4199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian franc1.00",
4200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian francs (convertible)1.00",
4201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian francs (financial)1.00",
4202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian francs1.00",
4203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belize Dollar1.00",
4204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belize dollar1.00",
4205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belize dollars1.00",
4206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bermudan Dollar1.00",
4207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bermudan dollar1.00",
4208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bermudan dollars1.00",
4209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bhutanese Ngultrum1.00",
4210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bhutanese ngultrum1.00",
4211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bhutanese ngultrums1.00",
4212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Mvdol1.00",
4213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Peso1.00",
4214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian mvdol1.00",
4215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian mvdols1.00",
4216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian peso1.00",
4217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian pesos1.00",
4218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Boliviano1.00",
4219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Boliviano1.00",
4220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Bolivianos1.00",
4221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bosnia-Herzegovina Convertible Mark1.00",
422259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Bosnia-Herzegovina Dinar (1992\\u20131994)1.00",
4223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bosnia-Herzegovina convertible mark1.00",
4224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bosnia-Herzegovina convertible marks1.00",
422559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Bosnia-Herzegovina dinar (1992\\u20131994)1.00",
422659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Bosnia-Herzegovina dinars (1992\\u20131994)1.00",
4227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Botswanan Pula1.00",
4228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Botswanan pula1.00",
4229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Botswanan pulas1.00",
423059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian New Cruzado (1989\\u20131990)1.00",
423159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian Cruzado (1986\\u20131989)1.00",
423259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian Cruzeiro (1990\\u20131993)1.00",
423359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian New Cruzeiro (1967\\u20131986)1.00",
423459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian Cruzeiro (1993\\u20131994)1.00",
4235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian Real1.00",
423659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian new cruzado (1989\\u20131990)1.00",
423759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian new cruzados (1989\\u20131990)1.00",
423859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzado (1986\\u20131989)1.00",
423959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzados (1986\\u20131989)1.00",
424059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzeiro (1990\\u20131993)1.00",
424159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian new cruzeiro (1967\\u20131986)1.00",
424259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzeiro (1993\\u20131994)1.00",
424359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzeiros (1990\\u20131993)1.00",
424459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian new cruzeiros (1967\\u20131986)1.00",
424559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian cruzeiros (1993\\u20131994)1.00",
4246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian real1.00",
4247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian reals1.00",
42481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "British Pound1.00",
42491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "British pound1.00",
42501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "British pounds1.00",
4251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brunei Dollar1.00",
4252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brunei dollar1.00",
4253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brunei dollars1.00",
4254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian Hard Lev1.00",
4255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian Lev1.00",
4256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian Leva1.00",
4257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian hard lev1.00",
4258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian hard leva1.00",
4259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian lev1.00",
4260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burmese Kyat1.00",
4261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burmese kyat1.00",
4262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burmese kyats1.00",
4263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burundian Franc1.00",
4264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burundian franc1.00",
4265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burundian francs1.00",
4266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CA$1.00",
4267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CAD1.00",
4268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CDF1.00",
4269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CDF1.00",
42701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "West African CFA Franc1.00",
42711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Central African CFA Franc1.00",
42721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "West African CFA franc1.00",
42731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Central African CFA franc1.00",
42741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "West African CFA francs1.00",
42751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Central African CFA francs1.00",
4276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFP Franc1.00",
4277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFP franc1.00",
4278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFP francs1.00",
4279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFPF1.00",
4280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CHE1.00",
4281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CHE1.00",
4282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CHF1.00",
4283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CHW1.00",
4284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CHW1.00",
4285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CLF1.00",
4286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CLF1.00",
4287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CLP1.00",
4288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CNY1.00",
4289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "COP1.00",
4290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "COU1.00",
4291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "COU1.00",
4292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CRC1.00",
4293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CSD1.00",
4294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CSD1.00",
4295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CSK1.00",
4296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CSK1.00",
4297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CUP1.00",
4298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CUP1.00",
4299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CVE1.00",
4300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CYP1.00",
4301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CZK1.00",
4302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cambodian Riel1.00",
4303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cambodian riel1.00",
4304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cambodian riels1.00",
4305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Canadian Dollar1.00",
4306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Canadian dollar1.00",
4307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Canadian dollars1.00",
4308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cape Verdean Escudo1.00",
4309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cape Verdean escudo1.00",
4310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cape Verdean escudos1.00",
4311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cayman Islands Dollar1.00",
4312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cayman Islands dollar1.00",
4313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cayman Islands dollars1.00",
4314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Chilean Peso1.00",
431527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chilean Unit of Account (UF)1.00",
4316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Chilean peso1.00",
4317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Chilean pesos1.00",
431827f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chilean unit of account (UF)1.00",
431927f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chilean units of account (UF)1.00",
432027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chinese Yuan1.00",
4321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Chinese yuan1.00",
4322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Colombian Peso1.00",
4323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Colombian peso1.00",
4324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Colombian pesos1.00",
4325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Comorian Franc1.00",
4326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Comorian franc1.00",
4327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Comorian francs1.00",
4328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Congolese Franc1.00",
4329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Congolese franc1.00",
4330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Congolese francs1.00",
4331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Costa Rican Col\\u00f3n1.00",
4332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Costa Rican col\\u00f3n1.00",
4333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Costa Rican col\\u00f3ns1.00",
4334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian Dinar1.00",
4335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian Kuna1.00",
4336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian dinar1.00",
4337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian dinars1.00",
4338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian kuna1.00",
4339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian kunas1.00",
4340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cuban Peso1.00",
4341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cuban peso1.00",
4342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cuban pesos1.00",
4343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cypriot Pound1.00",
4344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cypriot pound1.00",
4345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cypriot pounds1.00",
4346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czech Republic Koruna1.00",
4347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czech Republic koruna1.00",
4348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czech Republic korunas1.00",
4349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czechoslovak Hard Koruna1.00",
4350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czechoslovak hard koruna1.00",
4351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czechoslovak hard korunas1.00",
4352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DDM1.00",
4353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DDM1.00",
4354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DEM1.00",
4355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DEM1.00",
4356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DJF1.00",
4357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DKK1.00",
4358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DOP1.00",
4359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DZD1.00",
4360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Danish Krone1.00",
4361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Danish krone1.00",
4362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Danish kroner1.00",
4363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "German Mark1.00",
4364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "German mark1.00",
4365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "German marks1.00",
4366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Djiboutian Franc1.00",
4367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Djiboutian franc1.00",
4368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Djiboutian francs1.00",
4369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dominican Peso1.00",
4370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dominican peso1.00",
4371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dominican pesos1.00",
4372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EC$1.00",
4373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ECS1.00",
4374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ECS1.00",
4375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ECV1.00",
4376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ECV1.00",
4377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EEK1.00",
4378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EEK1.00",
4379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EGP1.00",
4380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EGP1.00",
4381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ERN1.00",
4382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ERN1.00",
4383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ESA1.00",
4384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ESA1.00",
4385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ESB1.00",
4386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ESB1.00",
4387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ESP1.00",
4388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ETB1.00",
4389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EUR1.00",
4390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East Caribbean Dollar1.00",
4391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East Caribbean dollar1.00",
4392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East Caribbean dollars1.00",
4393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East German Mark1.00",
4394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East German mark1.00",
4395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East German marks1.00",
4396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ecuadorian Sucre1.00",
439727f654740f2a26ad62a5c155af9199af9e69b889claireho        "Ecuadorian Unit of Constant Value1.00",
4398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ecuadorian sucre1.00",
4399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ecuadorian sucres1.00",
440027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Ecuadorian unit of constant value1.00",
440127f654740f2a26ad62a5c155af9199af9e69b889claireho        "Ecuadorian units of constant value1.00",
4402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Egyptian Pound1.00",
4403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Egyptian pound1.00",
4404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Egyptian pounds1.00",
4405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Salvadoran Col\\u00f3n1.00",
4406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Salvadoran col\\u00f3n1.00",
4407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Salvadoran colones1.00",
4408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Equatorial Guinean Ekwele1.00",
4409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Equatorial Guinean ekwele1.00",
4410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Eritrean Nakfa1.00",
4411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Eritrean nakfa1.00",
4412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Eritrean nakfas1.00",
4413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Estonian Kroon1.00",
4414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Estonian kroon1.00",
4415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Estonian kroons1.00",
4416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ethiopian Birr1.00",
4417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ethiopian birr1.00",
4418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ethiopian birrs1.00",
4419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Euro1.00",
4420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Composite Unit1.00",
4421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Currency Unit1.00",
4422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Monetary Unit1.00",
4423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Unit of Account (XBC)1.00",
4424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Unit of Account (XBD)1.00",
4425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European composite unit1.00",
4426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European composite units1.00",
4427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European currency unit1.00",
4428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European currency units1.00",
4429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European monetary unit1.00",
4430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European monetary units1.00",
4431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European unit of account (XBC)1.00",
4432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European unit of account (XBD)1.00",
4433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European units of account (XBC)1.00",
4434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European units of account (XBD)1.00",
4435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FIM1.00",
4436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FIM1.00",
4437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FJD1.00",
4438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FKP1.00",
4439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FKP1.00",
4440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FRF1.00",
4441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FRF1.00",
4442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Falkland Islands Pound1.00",
4443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Falkland Islands pound1.00",
4444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Falkland Islands pounds1.00",
4445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fijian Dollar1.00",
4446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fijian dollar1.00",
4447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fijian dollars1.00",
4448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Finnish Markka1.00",
4449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Finnish markka1.00",
4450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Finnish markkas1.00",
445150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "CHF1.00",
4452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French Franc1.00",
4453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French Gold Franc1.00",
4454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French UIC-Franc1.00",
4455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French UIC-franc1.00",
4456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French UIC-francs1.00",
4457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French franc1.00",
4458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French francs1.00",
4459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French gold franc1.00",
4460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French gold francs1.00",
4461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GBP1.00",
4462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GEK1.00",
4463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GEK1.00",
4464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GEL1.00",
4465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GHC1.00",
4466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GHC1.00",
4467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GHS1.00",
4468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GIP1.00",
4469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GIP1.00",
4470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GMD1.00",
4471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GMD1.00",
4472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GNF1.00",
4473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GNS1.00",
4474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GNS1.00",
4475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GQE1.00",
4476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GQE1.00",
4477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GRD1.00",
4478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GRD1.00",
4479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GTQ1.00",
4480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GWE1.00",
4481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GWE1.00",
4482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GWP1.00",
4483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GWP1.00",
4484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GYD1.00",
4485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gambian Dalasi1.00",
4486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gambian dalasi1.00",
4487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gambian dalasis1.00",
4488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian Kupon Larit1.00",
4489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian Lari1.00",
4490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian kupon larit1.00",
4491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian kupon larits1.00",
4492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian lari1.00",
4493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian laris1.00",
449459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ghanaian Cedi (1979\\u20132007)1.00",
4495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ghanaian Cedi1.00",
449659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ghanaian cedi (1979\\u20132007)1.00",
4497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ghanaian cedi1.00",
449859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ghanaian cedis (1979\\u20132007)1.00",
4499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ghanaian cedis1.00",
4500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gibraltar Pound1.00",
4501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gibraltar pound1.00",
4502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gibraltar pounds1.00",
4503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gold1.00",
4504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gold1.00",
4505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Greek Drachma1.00",
4506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Greek drachma1.00",
4507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Greek drachmas1.00",
4508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guatemalan Quetzal1.00",
4509b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guatemalan quetzal1.00",
4510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guatemalan quetzals1.00",
4511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean Franc1.00",
4512b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean Syli1.00",
4513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean franc1.00",
4514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean francs1.00",
4515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean syli1.00",
4516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean sylis1.00",
4517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinea-Bissau Peso1.00",
4518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinea-Bissau peso1.00",
4519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinea-Bissau pesos1.00",
4520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guyanaese Dollar1.00",
4521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guyanaese dollar1.00",
4522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guyanaese dollars1.00",
4523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HK$1.00",
4524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HKD1.00",
4525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HNL1.00",
4526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HRD1.00",
4527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HRD1.00",
4528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HRK1.00",
4529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HRK1.00",
4530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HTG1.00",
4531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HTG1.00",
4532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HUF1.00",
4533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Haitian Gourde1.00",
4534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Haitian gourde1.00",
4535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Haitian gourdes1.00",
4536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Honduran Lempira1.00",
4537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Honduran lempira1.00",
4538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Honduran lempiras1.00",
4539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hong Kong Dollar1.00",
4540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hong Kong dollar1.00",
4541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hong Kong dollars1.00",
4542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hungarian Forint1.00",
4543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hungarian forint1.00",
4544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hungarian forints1.00",
4545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IDR1.00",
4546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IEP1.00",
4547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ILP1.00",
4548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ILP1.00",
4549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ILS1.00",
4550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "INR1.00",
4551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IQD1.00",
4552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IRR1.00",
4553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ISK1.00",
4554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ISK1.00",
4555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ITL1.00",
4556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Icelandic Kr\\u00f3na1.00",
4557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Icelandic kr\\u00f3na1.00",
4558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Icelandic kr\\u00f3nur1.00",
4559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indian Rupee1.00",
4560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indian rupee1.00",
4561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indian rupees1.00",
4562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indonesian Rupiah1.00",
4563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indonesian rupiah1.00",
4564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indonesian rupiahs1.00",
4565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iranian Rial1.00",
4566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iranian rial1.00",
4567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iranian rials1.00",
4568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iraqi Dinar1.00",
4569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iraqi dinar1.00",
4570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iraqi dinars1.00",
4571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Irish Pound1.00",
4572b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Irish pound1.00",
4573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Irish pounds1.00",
4574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Israeli Pound1.00",
457564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Israeli new shekel1.00",
4576b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Israeli pound1.00",
4577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Israeli pounds1.00",
4578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Italian Lira1.00",
4579b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Italian lira1.00",
4580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Italian liras1.00",
4581b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JMD1.00",
4582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JOD1.00",
4583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JPY1.00",
4584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jamaican Dollar1.00",
4585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jamaican dollar1.00",
4586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jamaican dollars1.00",
4587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Japanese Yen1.00",
4588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Japanese yen1.00",
4589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jordanian Dinar1.00",
4590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jordanian dinar1.00",
4591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jordanian dinars1.00",
4592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KES1.00",
4593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KGS1.00",
4594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KHR1.00",
4595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KMF1.00",
4596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KPW1.00",
4597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KPW1.00",
4598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KRW1.00",
4599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KWD1.00",
4600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KYD1.00",
4601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KYD1.00",
4602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KZT1.00",
460327f654740f2a26ad62a5c155af9199af9e69b889claireho        "Kazakhstani Tenge1.00",
460427f654740f2a26ad62a5c155af9199af9e69b889claireho        "Kazakhstani tenge1.00",
460527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Kazakhstani tenges1.00",
4606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kenyan Shilling1.00",
4607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kenyan shilling1.00",
4608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kenyan shillings1.00",
4609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kuwaiti Dinar1.00",
4610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kuwaiti dinar1.00",
4611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kuwaiti dinars1.00",
4612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kyrgystani Som1.00",
4613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kyrgystani som1.00",
4614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kyrgystani soms1.00",
4615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HNL1.00",
4616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LAK1.00",
4617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LAK1.00",
4618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LBP1.00",
4619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LKR1.00",
4620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LRD1.00",
4621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LRD1.00",
4622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LSL1.00",
4623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LTL1.00",
4624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LTL1.00",
4625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LTT1.00",
4626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LTT1.00",
4627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUC1.00",
4628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUC1.00",
4629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUF1.00",
4630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUF1.00",
4631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUL1.00",
4632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LUL1.00",
4633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LVL1.00",
4634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LVL1.00",
4635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LVR1.00",
4636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LVR1.00",
4637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LYD1.00",
4638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Laotian Kip1.00",
4639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Laotian kip1.00",
4640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Laotian kips1.00",
4641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian Lats1.00",
4642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian Ruble1.00",
4643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian lats1.00",
4644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "Latvian lati1.00",
4645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian ruble1.00",
4646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian rubles1.00",
4647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lebanese Pound1.00",
4648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lebanese pound1.00",
4649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lebanese pounds1.00",
4650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lesotho Loti1.00",
4651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lesotho loti1.00",
4652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lesotho lotis1.00",
4653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Liberian Dollar1.00",
4654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Liberian dollar1.00",
4655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Liberian dollars1.00",
4656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Libyan Dinar1.00",
4657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Libyan dinar1.00",
4658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Libyan dinars1.00",
4659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian Litas1.00",
4660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian Talonas1.00",
4661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian litas1.00",
4662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian litai1.00",
4663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian talonas1.00",
4664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian talonases1.00",
4665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian Convertible Franc1.00",
4666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourg Financial Franc1.00",
4667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian Franc1.00",
4668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian convertible franc1.00",
4669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian convertible francs1.00",
4670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourg financial franc1.00",
4671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourg financial francs1.00",
4672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian franc1.00",
4673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian francs1.00",
4674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MAD1.00",
4675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MAD1.00",
4676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MAF1.00",
4677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MAF1.00",
4678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MDL1.00",
4679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MDL1.00",
4680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MX$1.00",
4681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MGA1.00",
4682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MGA1.00",
4683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MGF1.00",
4684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MGF1.00",
4685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MKD1.00",
4686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MLF1.00",
4687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MLF1.00",
4688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MMK1.00",
4689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MMK1.00",
4690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MNT1.00",
4691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MOP1.00",
4692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MOP1.00",
4693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MRO1.00",
4694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MTL1.00",
4695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MTP1.00",
4696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MTP1.00",
4697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MUR1.00",
4698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MUR1.00",
4699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MVR1.00",
4700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MVR1.00",
4701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MWK1.00",
4702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MXN1.00",
4703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MXP1.00",
4704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MXP1.00",
4705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MXV1.00",
4706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MXV1.00",
4707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MYR1.00",
4708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MZE1.00",
4709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MZE1.00",
4710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MZM1.00",
4711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MZN1.00",
4712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macanese Pataca1.00",
4713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macanese pataca1.00",
4714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macanese patacas1.00",
4715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macedonian Denar1.00",
4716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macedonian denar1.00",
4717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macedonian denari1.00",
4718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Ariaries1.00",
4719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Ariary1.00",
4720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Ariary1.00",
4721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Franc1.00",
4722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy franc1.00",
4723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy francs1.00",
4724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malawian Kwacha1.00",
4725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malawian Kwacha1.00",
4726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malawian Kwachas1.00",
4727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malaysian Ringgit1.00",
4728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malaysian ringgit1.00",
4729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malaysian ringgits1.00",
4730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maldivian Rufiyaa1.00",
4731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maldivian rufiyaa1.00",
4732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maldivian rufiyaas1.00",
4733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malian Franc1.00",
4734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malian franc1.00",
4735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malian francs1.00",
4736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese Lira1.00",
4737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese Pound1.00",
4738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese lira1.00",
4739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese lira1.00",
4740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese pound1.00",
4741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese pounds1.00",
4742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritanian Ouguiya1.00",
4743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritanian ouguiya1.00",
4744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritanian ouguiyas1.00",
4745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritian Rupee1.00",
4746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritian rupee1.00",
4747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritian rupees1.00",
4748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mexican Peso1.00",
474959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mexican Silver Peso (1861\\u20131992)1.00",
475027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Mexican Investment Unit1.00",
4751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mexican peso1.00",
4752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mexican pesos1.00",
475359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mexican silver peso (1861\\u20131992)1.00",
475459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mexican silver pesos (1861\\u20131992)1.00",
475527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Mexican investment unit1.00",
475627f654740f2a26ad62a5c155af9199af9e69b889claireho        "Mexican investment units1.00",
4757b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moldovan Leu1.00",
4758b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moldovan leu1.00",
4759b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moldovan lei1.00",
4760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mongolian Tugrik1.00",
4761b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mongolian tugrik1.00",
4762b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mongolian tugriks1.00",
4763b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan Dirham1.00",
4764b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan Franc1.00",
4765b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan dirham1.00",
4766b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan dirhams1.00",
4767b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan franc1.00",
4768b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan francs1.00",
4769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican Escudo1.00",
4770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican Metical1.00",
4771b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican escudo1.00",
4772b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican escudos1.00",
4773b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican metical1.00",
4774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican meticals1.00",
477559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Myanmar Kyat1.00",
477659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Myanmar kyat1.00",
477759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Myanmar kyats1.00",
4778b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NAD1.00",
4779b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NGN1.00",
4780b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NIC1.00",
4781b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NIO1.00",
4782b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NIO1.00",
4783b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NLG1.00",
4784b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NLG1.00",
4785b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NOK1.00",
4786b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NPR1.00",
4787b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NT$1.00",
4788b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NZ$1.00",
4789b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NZD1.00",
4790b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Namibian Dollar1.00",
4791b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Namibian dollar1.00",
4792b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Namibian dollars1.00",
4793b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nepalese Rupee1.00",
4794b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nepalese rupee1.00",
4795b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nepalese rupees1.00",
4796b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Netherlands Antillean Guilder1.00",
4797b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Netherlands Antillean guilder1.00",
4798b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Netherlands Antillean guilders1.00",
4799b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dutch Guilder1.00",
4800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dutch guilder1.00",
4801b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dutch guilders1.00",
480264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Israeli New Shekel1.00",
480364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Israeli New Shekels1.00",
4804b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Zealand Dollar1.00",
4805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Zealand dollar1.00",
4806b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Zealand dollars1.00",
480727f654740f2a26ad62a5c155af9199af9e69b889claireho        "Nicaraguan C\\u00f3rdoba1.00",
480859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Nicaraguan C\\u00f3rdoba (1988\\u20131991)1.00",
480927f654740f2a26ad62a5c155af9199af9e69b889claireho        "Nicaraguan c\\u00f3rdoba1.00",
481027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Nicaraguan c\\u00f3rdobas1.00",
481159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Nicaraguan c\\u00f3rdoba (1988\\u20131991)1.00",
481259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Nicaraguan c\\u00f3rdobas (1988\\u20131991)1.00",
4813b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nigerian Naira1.00",
4814b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nigerian naira1.00",
4815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nigerian nairas1.00",
4816b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "North Korean Won1.00",
4817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "North Korean won1.00",
4818b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "North Korean won1.00",
4819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Norwegian Krone1.00",
4820b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Norwegian krone1.00",
4821b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Norwegian kroner1.00",
4822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "OMR1.00",
482359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mozambican Metical (1980\\u20132006)1.00",
482459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mozambican metical (1980\\u20132006)1.00",
482559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mozambican meticals (1980\\u20132006)1.00",
482659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Romanian Lei (1952\\u20132006)1.00",
482759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Romanian Leu (1952\\u20132006)1.00",
482859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Romanian leu (1952\\u20132006)1.00",
482959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Serbian Dinar (2002\\u20132006)1.00",
483059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Serbian dinar (2002\\u20132006)1.00",
483159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Serbian dinars (2002\\u20132006)1.00",
483259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese Dinar (1992\\u20132007)1.00",
483359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese Pound (1957\\u20131998)1.00",
483459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese dinar (1992\\u20132007)1.00",
483559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese dinars (1992\\u20132007)1.00",
483659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese pound (1957\\u20131998)1.00",
483759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese pounds (1957\\u20131998)1.00",
483859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Turkish Lira (1922\\u20132005)1.00",
483959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Turkish Lira (1922\\u20132005)1.00",
4840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Omani Rial1.00",
4841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Omani rial1.00",
4842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Omani rials1.00",
4843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PAB1.00",
4844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PAB1.00",
4845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PEI1.00",
4846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PEI1.00",
4847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PEN1.00",
4848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PEN1.00",
4849b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PES1.00",
4850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PES1.00",
4851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PGK1.00",
4852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PGK1.00",
4853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PHP1.00",
4854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PKR1.00",
4855b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PLN1.00",
4856b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PLZ1.00",
4857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PLZ1.00",
4858b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PTE1.00",
4859b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PTE1.00",
4860b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PYG1.00",
4861b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Pakistani Rupee1.00",
4862b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Pakistani rupee1.00",
4863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Pakistani rupees1.00",
4864b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Palladium1.00",
4865b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Palladium1.00",
4866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Panamanian Balboa1.00",
4867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Panamanian balboa1.00",
4868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Panamanian balboas1.00",
4869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Papua New Guinean Kina1.00",
4870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Papua New Guinean kina1.00",
4871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Papua New Guinean kina1.00",
4872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Paraguayan Guarani1.00",
4873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Paraguayan guarani1.00",
4874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Paraguayan guaranis1.00",
4875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Peruvian Inti1.00",
487664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Peruvian Sol1.00",
487759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Peruvian Sol (1863\\u20131965)1.00",
4878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Peruvian inti1.00",
4879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Peruvian intis1.00",
488064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Peruvian sol1.00",
488164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Peruvian soles1.00",
488259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Peruvian sol (1863\\u20131965)1.00",
488359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Peruvian soles (1863\\u20131965)1.00",
4884b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Philippine Peso1.00",
4885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Philippine peso1.00",
4886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Philippine pesos1.00",
4887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Platinum1.00",
4888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Platinum1.00",
488959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Polish Zloty (1950\\u20131995)1.00",
4890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish Zloty1.00",
4891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish zlotys1.00",
4892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish zloty (PLZ)1.00",
4893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish zloty1.00",
4894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish zlotys (PLZ)1.00",
4895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Escudo1.00",
4896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Guinea Escudo1.00",
4897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Guinea escudo1.00",
4898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Guinea escudos1.00",
4899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese escudo1.00",
4900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese escudos1.00",
4901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GTQ1.00",
4902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "QAR1.00",
4903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Qatari Rial1.00",
4904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Qatari rial1.00",
4905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Qatari rials1.00",
4906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RHD1.00",
4907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RHD1.00",
4908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RINET Funds1.00",
4909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RINET Funds1.00",
4910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CN\\u00a51.00",
4911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ROL1.00",
4912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ROL1.00",
4913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RON1.00",
4914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RON1.00",
4915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RSD1.00",
4916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RSD1.00",
4917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RUB1.00",
4918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RUR1.00",
4919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RUR1.00",
4920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RWF1.00",
4921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RWF1.00",
4922b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rhodesian Dollar1.00",
4923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rhodesian dollar1.00",
4924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rhodesian dollars1.00",
4925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Romanian Leu1.00",
4926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Romanian lei1.00",
4927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Romanian leu1.00",
492859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Russian Ruble (1991\\u20131998)1.00",
4929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Russian Ruble1.00",
493059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Russian ruble (1991\\u20131998)1.00",
4931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Russian ruble1.00",
493259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Russian rubles (1991\\u20131998)1.00",
4933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Russian rubles1.00",
4934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rwandan Franc1.00",
4935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rwandan franc1.00",
4936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rwandan francs1.00",
4937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SAR1.00",
4938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SBD1.00",
4939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SCR1.00",
4940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDD1.00",
4941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDD1.00",
4942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDG1.00",
4943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDG1.00",
4944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDP1.00",
4945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SDP1.00",
4946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SEK1.00",
4947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SGD1.00",
4948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SHP1.00",
4949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SHP1.00",
4950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SIT1.00",
4951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SIT1.00",
4952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SKK1.00",
4953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SLL1.00",
4954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SLL1.00",
4955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SOS1.00",
4956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SRD1.00",
4957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SRD1.00",
4958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SRG1.00",
4959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "STD1.00",
4960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SUR1.00",
4961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SUR1.00",
4962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SVC1.00",
4963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SVC1.00",
4964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SYP1.00",
4965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SZL1.00",
4966f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "St. Helena Pound1.00",
4967f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "St. Helena pound1.00",
4968f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "St. Helena pounds1.00",
4969f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobra1.00",
4970f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobra1.00",
4971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobras1.00",
4972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Saudi Riyal1.00",
4973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Saudi riyal1.00",
4974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Saudi riyals1.00",
4975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Serbian Dinar1.00",
4976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Serbian dinar1.00",
4977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Serbian dinars1.00",
4978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Seychellois Rupee1.00",
4979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Seychellois rupee1.00",
4980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Seychellois rupees1.00",
4981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sierra Leonean Leone1.00",
4982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sierra Leonean leone1.00",
4983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sierra Leonean leones1.00",
4984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Silver1.00",
4985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Silver1.00",
4986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Singapore Dollar1.00",
4987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Singapore dollar1.00",
4988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Singapore dollars1.00",
4989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovak Koruna1.00",
4990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovak koruna1.00",
4991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovak korunas1.00",
4992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovenian Tolar1.00",
4993b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovenian tolar1.00",
4994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovenian tolars1.00",
4995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Solomon Islands Dollar1.00",
4996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Solomon Islands dollar1.00",
4997b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Solomon Islands dollars1.00",
4998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Somali Shilling1.00",
4999b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Somali shilling1.00",
5000b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Somali shillings1.00",
5001b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African Rand (financial)1.00",
5002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African Rand1.00",
5003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African rand (financial)1.00",
5004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African rand1.00",
5005b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African rands (financial)1.00",
5006b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African rand1.00",
5007b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South Korean Won1.00",
5008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South Korean won1.00",
5009b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South Korean won1.00",
5010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Soviet Rouble1.00",
5011b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Soviet rouble1.00",
5012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Soviet roubles1.00",
5013b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peseta (A account)1.00",
5014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peseta (convertible account)1.00",
5015b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peseta1.00",
5016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish peseta (A account)1.00",
5017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish peseta (convertible account)1.00",
5018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish peseta1.00",
5019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish pesetas (A account)1.00",
5020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish pesetas (convertible account)1.00",
5021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish pesetas1.00",
5022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Special Drawing Rights1.00",
502327f654740f2a26ad62a5c155af9199af9e69b889claireho        "Sri Lankan Rupee1.00",
502427f654740f2a26ad62a5c155af9199af9e69b889claireho        "Sri Lankan rupee1.00",
502527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Sri Lankan rupees1.00",
5026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sudanese Pound1.00",
5027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sudanese pound1.00",
5028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sudanese pounds1.00",
5029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Surinamese Dollar1.00",
5030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Surinamese dollar1.00",
5031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Surinamese dollars1.00",
503227f654740f2a26ad62a5c155af9199af9e69b889claireho        "Surinamese Guilder1.00",
503327f654740f2a26ad62a5c155af9199af9e69b889claireho        "Surinamese guilder1.00",
503427f654740f2a26ad62a5c155af9199af9e69b889claireho        "Surinamese guilders1.00",
5035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swazi Lilangeni1.00",
5036b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swazi lilangeni1.00",
5037b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swazi emalangeni1.00",
5038b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swedish Krona1.00",
5039b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swedish krona1.00",
5040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swedish kronor1.00",
5041b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swiss Franc1.00",
5042b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swiss franc1.00",
5043b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swiss francs1.00",
5044b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Syrian Pound1.00",
5045b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Syrian pound1.00",
5046b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Syrian pounds1.00",
5047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "THB1.00",
5048b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TJR1.00",
5049b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TJR1.00",
5050b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TJS1.00",
5051b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TJS1.00",
5052b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TMM1.00",
5053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TMM1.00",
5054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TND1.00",
5055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TND1.00",
5056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TOP1.00",
5057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TPE1.00",
5058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TPE1.00",
5059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TRL1.00",
5060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TRY1.00",
5061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TRY1.00",
5062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TTD1.00",
5063b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TWD1.00",
5064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TZS1.00",
5065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Taiwan Dollar1.00",
5066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Taiwan dollar1.00",
5067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Taiwan dollars1.00",
5068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani Ruble1.00",
5069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani Somoni1.00",
5070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani ruble1.00",
5071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani rubles1.00",
5072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani somoni1.00",
5073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani somonis1.00",
5074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tanzanian Shilling1.00",
5075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tanzanian shilling1.00",
5076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tanzanian shillings1.00",
5077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Testing Currency Code1.00",
5078b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Testing Currency Code1.00",
5079b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Thai Baht1.00",
5080b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Thai baht1.00",
5081b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Thai baht1.00",
5082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Timorese Escudo1.00",
5083b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Timorese escudo1.00",
5084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Timorese escudos1.00",
5085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tongan Pa\\u02bbanga1.00",
5086b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tongan pa\\u02bbanga1.00",
5087b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tongan pa\\u02bbanga1.00",
5088f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "Trinidad & Tobago Dollar1.00",
5089f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "Trinidad & Tobago dollar1.00",
5090f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "Trinidad & Tobago dollars1.00",
5091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tunisian Dinar1.00",
5092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tunisian dinar1.00",
5093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tunisian dinars1.00",
5094b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkish Lira1.00",
5095b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkish Lira1.00",
5096b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkish lira1.00",
5097b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkmenistani Manat1.00",
5098b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkmenistani manat1.00",
5099b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkmenistani manat1.00",
5100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UAE dirham1.00",
5101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UAE dirhams1.00",
5102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UAH1.00",
5103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UAK1.00",
5104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UAK1.00",
5105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UGS1.00",
5106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UGS1.00",
5107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UGX1.00",
5108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dollar (Next day)1.00",
5109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dollar (Same day)1.00",
5110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dollar1.00",
5111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollar (next day)1.00",
5112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollar (same day)1.00",
5113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollar1.00",
5114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollars (next day)1.00",
5115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollars (same day)1.00",
5116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US dollars1.00",
5117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USD1.00",
5118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USN1.00",
5119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USN1.00",
5120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USS1.00",
5121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USS1.00",
5122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UYI1.00",
5123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UYI1.00",
5124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UYP1.00",
5125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UYP1.00",
5126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UYU1.00",
5127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UZS1.00",
5128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UZS1.00",
512959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ugandan Shilling (1966\\u20131987)1.00",
5130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ugandan Shilling1.00",
513159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ugandan shilling (1966\\u20131987)1.00",
5132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ugandan shilling1.00",
513359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ugandan shillings (1966\\u20131987)1.00",
5134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ugandan shillings1.00",
5135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian Hryvnia1.00",
5136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian Karbovanets1.00",
5137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian hryvnia1.00",
5138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian hryvnias1.00",
5139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian karbovanets1.00",
5140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian karbovantsiv1.00",
514127f654740f2a26ad62a5c155af9199af9e69b889claireho        "Colombian Real Value Unit1.00",
5142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "United Arab Emirates Dirham1.00",
514327f654740f2a26ad62a5c155af9199af9e69b889claireho        "Unknown Currency1.00",
514459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Uruguayan Peso (1975\\u20131993)1.00",
5145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Uruguayan Peso1.00",
514627f654740f2a26ad62a5c155af9199af9e69b889claireho        "Uruguayan Peso (Indexed Units)1.00",
514759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Uruguayan peso (1975\\u20131993)1.00",
514827f654740f2a26ad62a5c155af9199af9e69b889claireho        "Uruguayan peso (indexed units)1.00",
5149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Uruguayan peso1.00",
515059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Uruguayan pesos (1975\\u20131993)1.00",
515127f654740f2a26ad62a5c155af9199af9e69b889claireho        "Uruguayan pesos (indexed units)1.00",
5152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Uruguayan pesos1.00",
51531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Uzbekistani Som1.00",
51541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Uzbekistani som1.00",
51551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Uzbekistani som1.00",
5156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VEB1.00",
5157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VEF1.00",
5158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VND1.00",
5159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VUV1.00",
5160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vanuatu Vatu1.00",
5161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vanuatu vatu1.00",
5162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vanuatu vatus1.00",
5163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Venezuelan Bol\\u00edvar1.00",
516459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Venezuelan Bol\\u00edvar (1871\\u20132008)1.00",
5165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Venezuelan bol\\u00edvar1.00",
5166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Venezuelan bol\\u00edvars1.00",
516759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Venezuelan bol\\u00edvar (1871\\u20132008)1.00",
516859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Venezuelan bol\\u00edvars (1871\\u20132008)1.00",
5169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vietnamese Dong1.00",
5170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vietnamese dong1.00",
5171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vietnamese dong1.00",
5172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR Euro1.00",
5173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR Franc1.00",
5174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR euro1.00",
5175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR euros1.00",
5176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR franc1.00",
5177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR francs1.00",
5178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WST1.00",
5179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WST1.00",
5180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Samoan Tala1.00",
5181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Samoan tala1.00",
5182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Samoan tala1.00",
5183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAF1.00",
5184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAF1.00",
5185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAG1.00",
5186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAG1.00",
5187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAU1.00",
5188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XAU1.00",
5189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBA1.00",
5190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBA1.00",
5191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBB1.00",
5192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBB1.00",
5193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBC1.00",
5194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBC1.00",
5195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBD1.00",
5196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XBD1.00",
5197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XCD1.00",
5198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XDR1.00",
5199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XDR1.00",
5200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XEU1.00",
5201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XEU1.00",
5202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XFO1.00",
5203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XFO1.00",
5204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XFU1.00",
5205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XFU1.00",
5206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XOF1.00",
5207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XOF1.00",
5208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XPD1.00",
5209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XPD1.00",
5210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XPF1.00",
5211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XPT1.00",
5212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XPT1.00",
5213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XRE1.00",
5214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XRE1.00",
5215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XTS1.00",
5216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XTS1.00",
5217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XXX1.00",
5218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XXX1.00",
5219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YDD1.00",
5220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YDD1.00",
5221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YER1.00",
5222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUD1.00",
5223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUD1.00",
5224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUM1.00",
5225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUM1.00",
5226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUN1.00",
5227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YUN1.00",
5228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni Dinar1.00",
5229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni Rial1.00",
5230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni dinar1.00",
5231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni dinars1.00",
5232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni rial1.00",
5233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni rials1.00",
523459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian Convertible Dinar (1990\\u20131992)1.00",
523559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian Hard Dinar (1966\\u20131990)1.00",
523659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian New Dinar (1994\\u20132002)1.00",
523759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian convertible dinar (1990\\u20131992)1.00",
523859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian convertible dinars (1990\\u20131992)1.00",
523959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian hard dinar (1966\\u20131990)1.00",
524059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian hard dinars (1966\\u20131990)1.00",
524159d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian new dinar (1994\\u20132002)1.00",
524259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian new dinars (1994\\u20132002)1.00",
5243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZAL1.00",
5244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZAL1.00",
5245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZAR1.00",
5246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZMK1.00",
5247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZMK1.00",
5248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZRN1.00",
5249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZRN1.00",
5250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZRZ1.00",
5251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZRZ1.00",
5252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZWD1.00",
525359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean New Zaire (1993\\u20131998)1.00",
525459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean Zaire (1971\\u20131993)1.00",
525559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean new zaire (1993\\u20131998)1.00",
525659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean new zaires (1993\\u20131998)1.00",
525759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean zaire (1971\\u20131993)1.00",
525859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean zaires (1971\\u20131993)1.00",
5259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Zambian Kwacha1.00",
5260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Zambian kwacha1.00",
5261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Zambian kwachas1.00",
526259d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zimbabwean Dollar (1980\\u20132008)1.00",
526359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zimbabwean dollar (1980\\u20132008)1.00",
526459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zimbabwean dollars (1980\\u20132008)1.00",
5265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "euro1.00",
5266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "euros1.00",
526759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Turkish lira (1922\\u20132005)1.00",
5268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "special drawing rights1.00",
526927f654740f2a26ad62a5c155af9199af9e69b889claireho        "Colombian real value unit1.00",
527027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Colombian real value units1.00",
5271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "unknown currency1.00",
5272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "\\u00a31.00",
5273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "\\u00a51.00",
5274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "\\u20ab1.00",
5275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "\\u20aa1.00",
5276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "\\u20ac1.00",
5277786288bd87363f3f86c1211ef7e1fb94aa9a40f7Fredrik Roubert        "\\u20b91.00",
5278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        //
5279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // Following has extra text, should be parsed correctly too
5280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "$1.00 random",
5281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "USD1.00 random",
5282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollar random",
5283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollars random",
5284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Afghan Afghani random",
5285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Afghan Afghani random",
528659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Afghan Afghanis (1927\\u20131992) random",
5287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Afghan Afghanis random",
5288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Albanian Lek random",
5289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Albanian lek random",
529050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "1.00 Albanian lek\\u00eb random",
5291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Algerian Dinar random",
5292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Algerian dinar random",
5293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Algerian dinars random",
5294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Andorran Peseta random",
5295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Andorran peseta random",
5296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Andorran pesetas random",
529759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan Kwanza (1977\\u20131990) random",
529859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan Readjusted Kwanza (1995\\u20131999) random",
5299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Angolan Kwanza random",
530059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan New Kwanza (1990\\u20132000) random",
530159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan kwanza (1977\\u20131991) random",
530259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan readjusted kwanza (1995\\u20131999) random",
5303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Angolan kwanza random",
530459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan kwanzas (1977\\u20131991) random",
530559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan readjusted kwanzas (1995\\u20131999) random",
5306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Angolan kwanzas random",
530759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan new kwanza (1990\\u20132000) random",
530859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Angolan new kwanzas (1990\\u20132000) random",
5309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine Austral random",
531059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Argentine Peso (1983\\u20131985) random",
5311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine Peso random",
5312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine austral random",
5313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine australs random",
531459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Argentine peso (1983\\u20131985) random",
5315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine peso random",
531659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Argentine pesos (1983\\u20131985) random",
5317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Argentine pesos random",
5318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Armenian Dram random",
5319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Armenian dram random",
5320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Armenian drams random",
5321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Aruban Florin random",
5322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Aruban florin random",
5323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Australian Dollar random",
5324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Australian dollar random",
5325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Australian dollars random",
5326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Austrian Schilling random",
5327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Austrian schilling random",
5328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Austrian schillings random",
532959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Azerbaijani Manat (1993\\u20132006) random",
5330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Azerbaijani Manat random",
533159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Azerbaijani manat (1993\\u20132006) random",
5332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Azerbaijani manat random",
533359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Azerbaijani manats (1993\\u20132006) random",
5334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Azerbaijani manats random",
5335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahamian Dollar random",
5336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahamian dollar random",
5337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahamian dollars random",
5338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahraini Dinar random",
5339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahraini dinar random",
5340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bahraini dinars random",
5341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bangladeshi Taka random",
5342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bangladeshi taka random",
5343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bangladeshi takas random",
5344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Barbadian Dollar random",
5345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Barbadian dollar random",
5346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Barbadian dollars random",
534764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Belarusian Ruble (1994\\u20131999) random",
5348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belarusian Ruble random",
534964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Belarusian ruble (1994\\u20131999) random",
535064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Belarusian rubles (1994\\u20131999) random",
5351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belarusian ruble random",
5352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belarusian rubles random",
5353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian Franc (convertible) random",
5354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian Franc (financial) random",
5355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian Franc random",
5356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian franc (convertible) random",
5357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian franc (financial) random",
5358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian franc random",
5359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian francs (convertible) random",
5360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian francs (financial) random",
5361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belgian francs random",
5362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belize Dollar random",
5363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belize dollar random",
5364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Belize dollars random",
5365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bermudan Dollar random",
5366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bermudan dollar random",
5367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bermudan dollars random",
5368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bhutanese Ngultrum random",
5369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bhutanese ngultrum random",
5370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bhutanese ngultrums random",
5371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian Mvdol random",
5372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian Peso random",
5373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian mvdol random",
5374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian mvdols random",
5375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian peso random",
5376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian pesos random",
5377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian Boliviano random",
5378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian Boliviano random",
5379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bolivian Bolivianos random",
5380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bosnia-Herzegovina Convertible Mark random",
538159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Bosnia-Herzegovina Dinar (1992\\u20131994) random",
5382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bosnia-Herzegovina convertible mark random",
5383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bosnia-Herzegovina convertible marks random",
538459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Bosnia-Herzegovina dinar (1992\\u20131994) random",
538559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Bosnia-Herzegovina dinars (1992\\u20131994) random",
5386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Botswanan Pula random",
5387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Botswanan pula random",
5388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Botswanan pulas random",
538959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian New Cruzado (1989\\u20131990) random",
539059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian Cruzado (1986\\u20131989) random",
539159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian Cruzeiro (1990\\u20131993) random",
539259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian New Cruzeiro (1967\\u20131986) random",
539359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian Cruzeiro (1993\\u20131994) random",
5394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brazilian Real random",
539559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian new cruzado (1989\\u20131990) random",
539659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian new cruzados (1989\\u20131990) random",
539759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzado (1986\\u20131989) random",
539859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzados (1986\\u20131989) random",
539959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzeiro (1990\\u20131993) random",
540059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian new cruzeiro (1967\\u20131986) random",
540159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzeiro (1993\\u20131994) random",
540259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzeiros (1990\\u20131993) random",
540359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian new cruzeiros (1967\\u20131986) random",
540459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Brazilian cruzeiros (1993\\u20131994) random",
5405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brazilian real random",
5406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brazilian reals random",
54071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 British Pound random",
54081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 British pound random",
54091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 British pounds random",
5410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brunei Dollar random",
5411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brunei dollar random",
5412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Brunei dollars random",
5413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian Hard Lev random",
5414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian Lev random",
5415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian Leva random",
5416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian hard lev random",
5417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian hard leva random",
5418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Bulgarian lev random",
5419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burmese Kyat random",
5420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burmese kyat random",
5421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burmese kyats random",
5422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burundian Franc random",
5423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burundian franc random",
5424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Burundian francs random",
5425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cambodian Riel random",
5426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cambodian riel random",
5427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cambodian riels random",
5428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Canadian Dollar random",
5429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Canadian dollar random",
5430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Canadian dollars random",
5431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cape Verdean Escudo random",
5432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cape Verdean escudo random",
5433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cape Verdean escudos random",
5434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cayman Islands Dollar random",
5435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cayman Islands dollar random",
5436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cayman Islands dollars random",
5437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Chilean Peso random",
543827f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Chilean Unit of Account (UF) random",
5439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Chilean peso random",
5440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Chilean pesos random",
544127f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Chilean unit of account (UF) random",
544227f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Chilean units of account (UF) random",
544327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Chinese Yuan random",
5444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Chinese yuan random",
5445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Colombian Peso random",
5446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Colombian peso random",
5447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Colombian pesos random",
5448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Comorian Franc random",
5449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Comorian franc random",
5450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Comorian francs random",
5451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Congolese Franc Congolais random",
5452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Congolese franc Congolais random",
5453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Congolese francs Congolais random",
5454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Costa Rican Col\\u00f3n random",
5455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Costa Rican col\\u00f3n random",
5456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Costa Rican col\\u00f3ns random",
5457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian Dinar random",
5458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian Kuna random",
5459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian dinar random",
5460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian dinars random",
5461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian kuna random",
5462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Croatian kunas random",
5463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cuban Peso random",
5464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cuban peso random",
5465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cuban pesos random",
5466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cypriot Pound random",
5467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cypriot pound random",
5468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Cypriot pounds random",
5469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czech Republic Koruna random",
5470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czech Republic koruna random",
5471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czech Republic korunas random",
5472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czechoslovak Hard Koruna random",
5473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czechoslovak hard koruna random",
5474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Czechoslovak hard korunas random",
5475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Danish Krone random",
5476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Danish krone random",
5477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Danish kroner random",
5478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 German Mark random",
5479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 German mark random",
5480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 German marks random",
5481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Djiboutian Franc random",
5482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Djiboutian franc random",
5483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Djiboutian francs random",
5484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dominican Peso random",
5485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dominican peso random",
5486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dominican pesos random",
5487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East Caribbean Dollar random",
5488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East Caribbean dollar random",
5489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East Caribbean dollars random",
5490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East German Mark random",
5491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East German mark random",
5492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 East German marks random",
5493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ecuadorian Sucre random",
549427f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Ecuadorian Unit of Constant Value random",
5495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ecuadorian sucre random",
5496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ecuadorian sucres random",
549727f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Ecuadorian unit of constant value random",
549827f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Ecuadorian units of constant value random",
5499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Egyptian Pound random",
5500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Egyptian pound random",
5501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Egyptian pounds random",
5502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Salvadoran Col\\u00f3n random",
5503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Salvadoran col\\u00f3n random",
5504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Salvadoran colones random",
5505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Equatorial Guinean Ekwele random",
5506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Equatorial Guinean ekwele random",
5507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Eritrean Nakfa random",
5508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Eritrean nakfa random",
5509b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Eritrean nakfas random",
5510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Estonian Kroon random",
5511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Estonian kroon random",
5512b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Estonian kroons random",
5513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ethiopian Birr random",
5514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ethiopian birr random",
5515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ethiopian birrs random",
5516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European Composite Unit random",
5517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European Currency Unit random",
5518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European Monetary Unit random",
5519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European Unit of Account (XBC) random",
5520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European Unit of Account (XBD) random",
5521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European composite unit random",
5522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European composite units random",
5523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European currency unit random",
5524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European currency units random",
5525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European monetary unit random",
5526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European monetary units random",
5527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European unit of account (XBC) random",
5528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European unit of account (XBD) random",
5529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European units of account (XBC) random",
5530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 European units of account (XBD) random",
5531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Falkland Islands Pound random",
5532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Falkland Islands pound random",
5533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Falkland Islands pounds random",
5534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Fijian Dollar random",
5535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Fijian dollar random",
5536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Fijian dollars random",
5537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Finnish Markka random",
5538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Finnish markka random",
5539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Finnish markkas random",
5540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French Franc random",
5541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French Gold Franc random",
5542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French UIC-Franc random",
5543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French UIC-franc random",
5544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French UIC-francs random",
5545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French franc random",
5546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French francs random",
5547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French gold franc random",
5548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 French gold francs random",
5549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gambian Dalasi random",
5550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gambian dalasi random",
5551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gambian dalasis random",
5552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian Kupon Larit random",
5553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian Lari random",
5554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian kupon larit random",
5555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian kupon larits random",
5556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian lari random",
5557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Georgian laris random",
555859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ghanaian Cedi (1979\\u20132007) random",
5559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ghanaian Cedi random",
556059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ghanaian cedi (1979\\u20132007) random",
5561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ghanaian cedi random",
556259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ghanaian cedis (1979\\u20132007) random",
5563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ghanaian cedis random",
5564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gibraltar Pound random",
5565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gibraltar pound random",
5566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gibraltar pounds random",
5567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gold random",
5568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Gold random",
5569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Greek Drachma random",
5570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Greek drachma random",
5571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Greek drachmas random",
5572b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guatemalan Quetzal random",
5573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guatemalan quetzal random",
5574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guatemalan quetzals random",
5575b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean Franc random",
5576b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean Syli random",
5577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean franc random",
5578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean francs random",
5579b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean syli random",
5580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinean sylis random",
5581b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinea-Bissau Peso random",
5582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinea-Bissau peso random",
5583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guinea-Bissau pesos random",
5584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guyanaese Dollar random",
5585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guyanaese dollar random",
5586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Guyanaese dollars random",
5587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Haitian Gourde random",
5588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Haitian gourde random",
5589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Haitian gourdes random",
5590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Honduran Lempira random",
5591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Honduran lempira random",
5592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Honduran lempiras random",
5593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hong Kong Dollar random",
5594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hong Kong dollar random",
5595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hong Kong dollars random",
5596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hungarian Forint random",
5597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hungarian forint random",
5598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Hungarian forints random",
5599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Icelandic Kr\\u00f3na random",
5600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Icelandic kr\\u00f3na random",
5601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Icelandic kr\\u00f3nur random",
5602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indian Rupee random",
5603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indian rupee random",
5604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indian rupees random",
5605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indonesian Rupiah random",
5606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indonesian rupiah random",
5607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Indonesian rupiahs random",
5608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iranian Rial random",
5609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iranian rial random",
5610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iranian rials random",
5611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iraqi Dinar random",
5612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iraqi dinar random",
5613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Iraqi dinars random",
5614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Irish Pound random",
5615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Irish pound random",
5616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Irish pounds random",
5617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Israeli Pound random",
561864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Israeli new shekel random",
5619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Israeli pound random",
5620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Israeli pounds random",
5621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Italian Lira random",
5622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Italian lira random",
5623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Italian liras random",
5624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jamaican Dollar random",
5625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jamaican dollar random",
5626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jamaican dollars random",
5627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Japanese Yen random",
5628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Japanese yen random",
5629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jordanian Dinar random",
5630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jordanian dinar random",
5631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Jordanian dinars random",
563227f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Kazakhstani Tenge random",
563327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Kazakhstani tenge random",
563427f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Kazakhstani tenges random",
5635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kenyan Shilling random",
5636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kenyan shilling random",
5637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kenyan shillings random",
5638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kuwaiti Dinar random",
5639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kuwaiti dinar random",
5640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kuwaiti dinars random",
5641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kyrgystani Som random",
5642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kyrgystani som random",
5643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Kyrgystani soms random",
5644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Laotian Kip random",
5645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Laotian kip random",
5646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Laotian kips random",
5647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian Lats random",
5648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian Ruble random",
5649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian lats random",
5650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian lati random",
5651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian ruble random",
5652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Latvian rubles random",
5653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lebanese Pound random",
5654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lebanese pound random",
5655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lebanese pounds random",
5656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lesotho Loti random",
5657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lesotho loti random",
5658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lesotho lotis random",
5659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Liberian Dollar random",
5660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Liberian dollar random",
5661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Liberian dollars random",
5662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Libyan Dinar random",
5663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Libyan dinar random",
5664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Libyan dinars random",
5665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian Litas random",
5666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian Talonas random",
5667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian litas random",
5668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian litai random",
5669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian talonas random",
5670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Lithuanian talonases random",
5671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian Convertible Franc random",
5672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourg Financial Franc random",
5673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian Franc random",
5674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian convertible franc random",
5675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian convertible francs random",
5676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourg financial franc random",
5677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourg financial francs random",
5678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian franc random",
5679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Luxembourgian francs random",
5680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macanese Pataca random",
5681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macanese pataca random",
5682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macanese patacas random",
5683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macedonian Denar random",
5684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macedonian denar random",
5685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Macedonian denari random",
5686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy Ariaries random",
5687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy Ariary random",
5688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy Ariary random",
5689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy Franc random",
5690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy franc random",
5691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malagasy francs random",
5692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malawian Kwacha random",
5693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malawian Kwacha random",
5694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malawian Kwachas random",
5695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malaysian Ringgit random",
5696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malaysian ringgit random",
5697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malaysian ringgits random",
5698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maldivian Rufiyaa random",
5699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maldivian rufiyaa random",
5700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maldivian rufiyaas random",
5701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malian Franc random",
5702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malian franc random",
5703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Malian francs random",
5704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese Lira random",
5705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese Pound random",
5706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese lira random",
5707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese liras random",
5708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese pound random",
5709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Maltese pounds random",
5710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritanian Ouguiya random",
5711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritanian ouguiya random",
5712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritanian ouguiyas random",
5713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritian Rupee random",
5714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritian rupee random",
5715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mauritian rupees random",
5716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mexican Peso random",
571759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mexican Silver Peso (1861\\u20131992) random",
571827f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Mexican Investment Unit random",
5719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mexican peso random",
5720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mexican pesos random",
572159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mexican silver peso (1861\\u20131992) random",
572259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mexican silver pesos (1861\\u20131992) random",
572327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Mexican investment unit random",
572427f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Mexican investment units random",
5725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moldovan Leu random",
5726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moldovan leu random",
5727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moldovan lei random",
5728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mongolian Tugrik random",
5729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mongolian tugrik random",
5730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mongolian tugriks random",
5731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan Dirham random",
5732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan Franc random",
5733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan dirham random",
5734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan dirhams random",
5735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan franc random",
5736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Moroccan francs random",
5737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican Escudo random",
5738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican Metical random",
5739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican escudo random",
5740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican escudos random",
5741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican metical random",
5742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Mozambican meticals random",
574359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Myanmar Kyat random",
574459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Myanmar kyat random",
574559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Myanmar kyats random",
5746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Namibian Dollar random",
5747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Namibian dollar random",
5748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Namibian dollars random",
5749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nepalese Rupee random",
5750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nepalese rupee random",
5751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nepalese rupees random",
5752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Netherlands Antillean Guilder random",
5753b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Netherlands Antillean guilder random",
5754b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Netherlands Antillean guilders random",
5755b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dutch Guilder random",
5756b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dutch guilder random",
5757b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dutch guilders random",
575864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Israeli New Shekel random",
575964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Israeli new shekels random",
5760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Zealand Dollar random",
5761b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Zealand dollar random",
5762b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Zealand dollars random",
576327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Nicaraguan C\\u00f3rdoba random",
576459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Nicaraguan C\\u00f3rdoba (1988\\u20131991) random",
576527f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Nicaraguan c\\u00f3rdoba random",
576627f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Nicaraguan c\\u00f3rdoba random",
576759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Nicaraguan c\\u00f3rdoba (1988\\u20131991) random",
576859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Nicaraguan c\\u00f3rdobas (1988\\u20131991) random",
5769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nigerian Naira random",
5770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nigerian naira random",
5771b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nigerian nairas random",
5772b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 North Korean Won random",
5773b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 North Korean won random",
5774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 North Korean won random",
5775b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Norwegian Krone random",
5776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Norwegian krone random",
5777b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Norwegian kroner random",
577859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mozambican Metical (1980\\u20132006) random",
577959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mozambican metical (1980\\u20132006) random",
578059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Mozambican meticals (1980\\u20132006) random",
578159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Romanian Lei (1952\\u20132006) random",
578259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Romanian Leu (1952\\u20132006) random",
578359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Romanian leu (1952\\u20132006) random",
578459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Serbian Dinar (2002\\u20132006) random",
578559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Serbian dinar (2002\\u20132006) random",
578659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Serbian dinars (2002\\u20132006) random",
578759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese Dinar (1992\\u20132007) random",
578859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese Pound (1957\\u20131998) random",
578959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese dinar (1992\\u20132007) random",
579059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese dinars (1992\\u20132007) random",
579159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese pound (1957\\u20131998) random",
579259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Sudanese pounds (1957\\u20131998) random",
579359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Turkish Lira (1922\\u20132005) random",
579459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Turkish Lira (1922\\u20132005) random",
5795b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Omani Rial random",
5796b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Omani rial random",
5797b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Omani rials random",
5798b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Pakistani Rupee random",
5799b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Pakistani rupee random",
5800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Pakistani rupees random",
5801b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Palladium random",
5802b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Palladium random",
5803b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Panamanian Balboa random",
5804b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Panamanian balboa random",
5805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Panamanian balboas random",
5806b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Papua New Guinean Kina random",
5807b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Papua New Guinean kina random",
5808b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Papua New Guinean kina random",
5809b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Paraguayan Guarani random",
5810b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Paraguayan guarani random",
5811b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Paraguayan guaranis random",
5812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Peruvian Inti random",
581364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Peruvian Sol random",
581459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Peruvian Sol (1863\\u20131965) random",
5815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Peruvian inti random",
5816b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Peruvian intis random",
581764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Peruvian sol random",
581864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "1.00 Peruvian soles random",
581959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Peruvian sol (1863\\u20131965) random",
582059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Peruvian soles (1863\\u20131965) random",
5821b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Philippine Peso random",
5822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Philippine peso random",
5823b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Philippine pesos random",
5824b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Platinum random",
5825b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Platinum random",
582659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Polish Zloty (1950\\u20131995) random",
5827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Polish Zloty random",
5828b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Polish zlotys random",
5829b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Polish zloty (PLZ) random",
5830b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Polish zloty random",
5831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Polish zlotys (PLZ) random",
5832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese Escudo random",
5833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese Guinea Escudo random",
5834b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese Guinea escudo random",
5835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese Guinea escudos random",
5836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese escudo random",
5837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Portuguese escudos random",
5838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Qatari Rial random",
5839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Qatari rial random",
5840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Qatari rials random",
5841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 RINET Funds random",
5842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 RINET Funds random",
5843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rhodesian Dollar random",
5844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rhodesian dollar random",
5845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rhodesian dollars random",
5846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Romanian Leu random",
5847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Romanian lei random",
5848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Romanian leu random",
584959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Russian Ruble (1991\\u20131998) random",
5850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Russian Ruble random",
585159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Russian ruble (1991\\u20131998) random",
5852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Russian ruble random",
585359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Russian rubles (1991\\u20131998) random",
5854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Russian rubles random",
5855b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rwandan Franc random",
5856b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rwandan franc random",
5857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Rwandan francs random",
5858f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 St. Helena Pound random",
5859f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 St. Helena pound random",
5860f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 St. Helena pounds random",
5861f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobra random",
5862f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobra random",
5863f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe dobras random",
5864b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Saudi Riyal random",
5865b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Saudi riyal random",
5866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Saudi riyals random",
5867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Serbian Dinar random",
5868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Serbian dinar random",
5869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Serbian dinars random",
5870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Seychellois Rupee random",
5871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Seychellois rupee random",
5872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Seychellois rupees random",
5873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sierra Leonean Leone random",
5874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sierra Leonean leone random",
5875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sierra Leonean leones random",
5876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Singapore Dollar random",
5877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Singapore dollar random",
5878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Singapore dollars random",
5879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovak Koruna random",
5880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovak koruna random",
5881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovak korunas random",
5882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovenian Tolar random",
5883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovenian tolar random",
5884b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Slovenian tolars random",
5885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Solomon Islands Dollar random",
5886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Solomon Islands dollar random",
5887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Solomon Islands dollars random",
5888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Somali Shilling random",
5889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Somali shilling random",
5890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Somali shillings random",
5891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African Rand (financial) random",
5892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African Rand random",
5893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African rand (financial) random",
5894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African rand random",
5895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African rands (financial) random",
5896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South African rand random",
5897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South Korean Won random",
5898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South Korean won random",
5899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 South Korean won random",
5900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Soviet Rouble random",
5901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Soviet rouble random",
5902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Soviet roubles random",
5903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish Peseta (A account) random",
5904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish Peseta (convertible account) random",
5905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish Peseta random",
5906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish peseta (A account) random",
5907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish peseta (convertible account) random",
5908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish peseta random",
5909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish pesetas (A account) random",
5910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish pesetas (convertible account) random",
5911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Spanish pesetas random",
5912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Special Drawing Rights random",
591327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Sri Lankan Rupee random",
591427f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Sri Lankan rupee random",
591527f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Sri Lankan rupees random",
5916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sudanese Pound random",
5917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sudanese pound random",
5918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Sudanese pounds random",
5919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Surinamese Dollar random",
5920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Surinamese dollar random",
5921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Surinamese dollars random",
592227f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Surinamese Guilder random",
592327f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Surinamese guilder random",
592427f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Surinamese guilders random",
5925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swazi Lilangeni random",
5926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swazi lilangeni random",
5927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swazi emalangeni random",
5928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swedish Krona random",
5929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swedish krona random",
5930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swedish kronor random",
5931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swiss Franc random",
5932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swiss franc random",
5933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Swiss francs random",
5934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Syrian Pound random",
5935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Syrian pound random",
5936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Syrian pounds random",
5937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Taiwan Dollar random",
5938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Taiwan dollar random",
5939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Taiwan dollars random",
5940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani Ruble random",
5941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani Somoni random",
5942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani ruble random",
5943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani rubles random",
5944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani somoni random",
5945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tajikistani somonis random",
5946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tanzanian Shilling random",
5947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tanzanian shilling random",
5948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tanzanian shillings random",
5949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Testing Currency Code random",
5950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Testing Currency Code random",
5951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Thai Baht random",
5952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Thai baht random",
5953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Thai baht random",
5954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Timorese Escudo random",
5955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Timorese escudo random",
5956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Timorese escudos random",
5957f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 Trinidad & Tobago Dollar random",
5958f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 Trinidad & Tobago dollar random",
5959f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "1.00 Trinidad & Tobago dollars random",
5960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tunisian Dinar random",
5961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tunisian dinar random",
5962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Tunisian dinars random",
5963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkish Lira random",
5964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkish Lira random",
5965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkish lira random",
5966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkmenistani Manat random",
5967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkmenistani manat random",
5968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Turkmenistani manat random",
5969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US Dollar (Next day) random",
5970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US Dollar (Same day) random",
5971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US Dollar random",
5972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollar (next day) random",
5973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollar (same day) random",
5974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollar random",
5975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollars (next day) random",
5976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollars (same day) random",
5977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dollars random",
597859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ugandan Shilling (1966\\u20131987) random",
5979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ugandan Shilling random",
598059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ugandan shilling (1966\\u20131987) random",
5981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ugandan shilling random",
598259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Ugandan shillings (1966\\u20131987) random",
5983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ugandan shillings random",
5984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian Hryvnia random",
5985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian Karbovanets random",
5986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian hryvnia random",
5987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian hryvnias random",
5988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian karbovanets random",
5989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Ukrainian karbovantsiv random",
599027f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Colombian Real Value Unit random",
5991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 United Arab Emirates Dirham random",
599227f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Unknown Currency random",
599359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Uruguayan Peso (1975\\u20131993) random",
5994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Uruguayan Peso random",
599527f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Uruguayan Peso (Indexed Units) random",
599659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Uruguayan peso (1975\\u20131993) random",
599727f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Uruguayan peso (indexed units) random",
5998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Uruguayan peso random",
599959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Uruguayan pesos (1975\\u20131993) random",
600027f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Uruguayan pesos (indexed units) random",
60011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 Uzbekistani Som random",
60021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 Uzbekistani som random",
60031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "1.00 Uzbekistani som random",
6004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vanuatu Vatu random",
6005b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vanuatu vatu random",
6006b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vanuatu vatus random",
6007b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Venezuelan Bol\\u00edvar random",
600859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Venezuelan Bol\\u00edvar (1871\\u20132008) random",
6009b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Venezuelan bol\\u00edvar random",
6010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Venezuelan bol\\u00edvars random",
601159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Venezuelan bol\\u00edvar (1871\\u20132008) random",
601259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Venezuelan bol\\u00edvars (1871\\u20132008) random",
6013b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vietnamese Dong random",
6014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vietnamese dong random",
6015b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Vietnamese dong random",
6016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR Euro random",
6017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR Franc random",
6018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR euro random",
6019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR euros random",
6020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR franc random",
6021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 WIR francs random",
6022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Samoan Tala random",
6023b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Samoan tala random",
6024b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Samoan tala random",
6025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni Dinar random",
6026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni Rial random",
6027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni dinar random",
6028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni dinars random",
6029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni rial random",
6030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Yemeni rials random",
603159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian Convertible Dinar (1990\\u20131992) random",
603259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian Hard Dinar (1966\\u20131990) random",
603359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian New Dinar (1994\\u20132002) random",
603459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian convertible dinar (1990\\u20131992) random",
603559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian convertible dinars (1990\\u20131992) random",
603659d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian hard dinar (1966\\u20131990) random",
603759d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian hard dinars (1966\\u20131990) random",
603859d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian new dinar (1994\\u20132002) random",
603959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Yugoslavian new dinars (1994\\u20132002) random",
604059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean New Zaire (1993\\u20131998) random",
604159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean Zaire (1971\\u20131993) random",
604259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean new zaire (1993\\u20131998) random",
604359d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean new zaires (1993\\u20131998) random",
604459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean zaire (1971\\u20131993) random",
604559d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zairean zaires (1971\\u20131993) random",
6046b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Zambian Kwacha random",
6047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Zambian kwacha random",
6048b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Zambian kwachas random",
604959d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zimbabwean Dollar (1980\\u20132008) random",
605059d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zimbabwean dollar (1980\\u20132008) random",
605159d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Zimbabwean dollars (1980\\u20132008) random",
6052b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 euro random",
6053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 euros random",
605459d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.00 Turkish lira (1922\\u20132005) random",
6055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 special drawing rights random",
605627f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Colombian real value unit random",
605727f654740f2a26ad62a5c155af9199af9e69b889claireho        "1.00 Colombian real value units random",
6058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "1.00 unknown currency random",
6059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
6060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
6061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* WRONG_DATA[] = {
6062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // Following are missing one last char in the currency name
6063b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "usd1.00", // case sensitive
6064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nicaraguan Cordob",
6065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Namibian Dolla",
6066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Namibian dolla",
6067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nepalese Rupe",
6068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nepalese rupe",
6069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Netherlands Antillean Guilde",
6070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Netherlands Antillean guilde",
6071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dutch Guilde",
6072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Dutch guilde",
6073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Israeli New Sheqe",
6074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Zealand Dolla",
6075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 New Zealand dolla",
6076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nicaraguan cordob",
6077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nigerian Nair",
6078b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Nigerian nair",
6079b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 North Korean Wo",
6080b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 North Korean wo",
6081b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Norwegian Kron",
6082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 Norwegian kron",
6083b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00 US dolla",
6084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "1.00",
6085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "A1.00",
6086b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AD1.00",
6087b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AE1.00",
6088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AF1.00",
6089b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AL1.00",
6090b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AM1.00",
6091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AN1.00",
6092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AO1.00",
6093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AR1.00",
6094b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AT1.00",
6095b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AU1.00",
6096b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AW1.00",
6097b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "AZ1.00",
6098b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Afghan Afghan1.00",
609959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Afghan Afghani (1927\\u201320021.00",
6100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Afl1.00",
6101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Albanian Le1.00",
6102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Algerian Dina1.00",
6103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Andorran Peset1.00",
6104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Angolan Kwanz1.00",
610559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan Kwanza (1977\\u201319901.00",
610659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan Readjusted Kwanza (1995\\u201319991.00",
610759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Angolan New Kwanza (1990\\u201320001.00",
6108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine Austra1.00",
6109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Argentine Pes1.00",
611059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Argentine Peso (1983\\u201319851.00",
6111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Armenian Dra1.00",
6112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Aruban Flori1.00",
6113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Australian Dolla1.00",
6114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Austrian Schillin1.00",
6115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Azerbaijani Mana1.00",
611659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Azerbaijani Manat (1993\\u201320061.00",
6117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "B1.00",
6118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BA1.00",
6119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BB1.00",
6120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BE1.00",
6121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BG1.00",
6122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BH1.00",
6123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BI1.00",
6124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BM1.00",
6125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BN1.00",
6126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BO1.00",
6127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BR1.00",
6128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BS1.00",
6129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BT1.00",
6130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BU1.00",
6131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BW1.00",
6132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BY1.00",
6133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "BZ1.00",
6134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahamian Dolla1.00",
6135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bahraini Dina1.00",
6136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bangladeshi Tak1.00",
6137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Barbadian Dolla1.00",
6138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bds1.00",
613964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        "Belarusian Ruble (1994\\u201319991.00",
6140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belarusian Rubl1.00",
6141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Fran1.00",
6142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Franc (convertible1.00",
6143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belgian Franc (financial1.00",
6144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Belize Dolla1.00",
6145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bermudan Dolla1.00",
6146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bhutanese Ngultru1.00",
6147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Mvdo1.00",
6148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Pes1.00",
6149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bolivian Bolivian1.00",
6150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bosnia-Herzegovina Convertible Mar1.00",
6151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bosnia-Herzegovina Dina1.00",
6152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Botswanan Pul1.00",
6153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian Cruzad1.00",
6154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian Cruzado Nov1.00",
6155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian Cruzeir1.00",
615659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian Cruzeiro (1990\\u201319931.00",
615759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Brazilian New Cruzeiro (1967\\u201319861.00",
6158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brazilian Rea1.00",
6159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "British Pound Sterlin1.00",
6160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Brunei Dolla1.00",
6161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian Hard Le1.00",
6162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Bulgarian Le1.00",
6163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burmese Kya1.00",
6164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Burundian Fran1.00",
6165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "C1.00",
6166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CA1.00",
6167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CD1.00",
6168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFP Fran1.00",
6169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CFP1.00",
6170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CH1.00",
6171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CL1.00",
6172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CN1.00",
6173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CO1.00",
6174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CS1.00",
6175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CU1.00",
6176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CV1.00",
6177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CY1.00",
6178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "CZ1.00",
6179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cambodian Rie1.00",
6180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Canadian Dolla1.00",
6181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cape Verdean Escud1.00",
6182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cayman Islands Dolla1.00",
6183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Chilean Pes1.00",
618427f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chilean Unit of Accoun1.00",
618527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Chinese Yua1.00",
6186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Colombian Pes1.00",
6187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Comoro Fran1.00",
6188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Congolese Fran1.00",
6189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Costa Rican Col\\u00f31.00",
6190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian Dina1.00",
6191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Croatian Kun1.00",
6192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cuban Pes1.00",
6193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Cypriot Poun1.00",
6194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czech Republic Korun1.00",
6195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Czechoslovak Hard Korun1.00",
6196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "D1.00",
6197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DD1.00",
6198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DE1.00",
6199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DJ1.00",
6200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DK1.00",
6201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DO1.00",
6202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "DZ1.00",
6203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Danish Kron1.00",
6204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "German Mar1.00",
6205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Djiboutian Fran1.00",
6206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dk1.00",
6207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dominican Pes1.00",
6208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EC1.00",
6209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EE1.00",
6210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EG1.00",
6211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EQ1.00",
6212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ER1.00",
6213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ES1.00",
6214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ET1.00",
6215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "EU1.00",
6216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East Caribbean Dolla1.00",
6217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "East German Ostmar1.00",
6218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ecuadorian Sucr1.00",
621927f654740f2a26ad62a5c155af9199af9e69b889claireho        "Ecuadorian Unit of Constant Valu1.00",
6220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Egyptian Poun1.00",
6221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ekwel1.00",
6222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Salvadoran Col\\u00f31.00",
6223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Equatorial Guinean Ekwel1.00",
6224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Eritrean Nakf1.00",
6225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Es1.00",
6226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Estonian Kroo1.00",
6227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ethiopian Bir1.00",
6228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Eur1.00",
6229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Composite Uni1.00",
6230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Currency Uni1.00",
6231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Monetary Uni1.00",
6232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Unit of Account (XBC1.00",
6233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "European Unit of Account (XBD1.00",
6234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "F1.00",
6235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FB1.00",
6236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FI1.00",
6237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FJ1.00",
6238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FK1.00",
6239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "FR1.00",
6240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Falkland Islands Poun1.00",
6241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fd1.00",
6242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fijian Dolla1.00",
6243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Finnish Markk1.00",
6244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Fr1.00",
6245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French Fran1.00",
6246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French Gold Fran1.00",
6247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "French UIC-Fran1.00",
6248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "G1.00",
6249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GB1.00",
6250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GE1.00",
6251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GH1.00",
6252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GI1.00",
6253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GM1.00",
6254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GN1.00",
6255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GQ1.00",
6256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GR1.00",
6257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GT1.00",
6258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GW1.00",
6259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "GY1.00",
6260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gambian Dalas1.00",
6261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian Kupon Lari1.00",
6262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Georgian Lar1.00",
6263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ghanaian Ced1.00",
626459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ghanaian Cedi (1979\\u201320071.00",
6265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gibraltar Poun1.00",
6266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Gol1.00",
6267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Greek Drachm1.00",
6268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guatemalan Quetza1.00",
6269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean Fran1.00",
6270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinean Syl1.00",
6271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guinea-Bissau Pes1.00",
6272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Guyanaese Dolla1.00",
6273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HK1.00",
6274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HN1.00",
6275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HR1.00",
6276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HT1.00",
6277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "HU1.00",
6278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Haitian Gourd1.00",
6279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Honduran Lempir1.00",
6280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hong Kong Dolla1.00",
6281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Hungarian Forin1.00",
6282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "I1.00",
6283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IE1.00",
6284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IL1.00",
6285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IN1.00",
6286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IQ1.00",
6287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IR1.00",
6288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IS1.00",
6289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "IT1.00",
6290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Icelandic Kron1.00",
6291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indian Rupe1.00",
6292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Indonesian Rupia1.00",
6293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iranian Ria1.00",
6294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Iraqi Dina1.00",
6295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Irish Poun1.00",
6296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Israeli Poun1.00",
6297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Italian Lir1.00",
6298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "J1.00",
6299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JM1.00",
6300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JO1.00",
6301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "JP1.00",
6302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jamaican Dolla1.00",
6303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Japanese Ye1.00",
6304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Jordanian Dina1.00",
6305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "K S1.00",
6306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "K1.00",
6307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KE1.00",
6308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KG1.00",
6309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KH1.00",
6310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KP1.00",
6311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KR1.00",
6312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KW1.00",
6313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KY1.00",
6314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "KZ1.00",
631527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Kazakhstani Teng1.00",
6316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kenyan Shillin1.00",
6317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kuwaiti Dina1.00",
6318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Kyrgystani So1.00",
6319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LA1.00",
6320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LB1.00",
6321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LK1.00",
6322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LR1.00",
6323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LT1.00",
6324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LU1.00",
6325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LV1.00",
6326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "LY1.00",
6327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Laotian Ki1.00",
6328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian Lat1.00",
6329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Latvian Rubl1.00",
6330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lebanese Poun1.00",
6331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lesotho Lot1.00",
6332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Liberian Dolla1.00",
6333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Libyan Dina1.00",
6334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian Lit1.00",
6335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Lithuanian Talona1.00",
6336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian Convertible Fran1.00",
6337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourg Financial Fran1.00",
6338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Luxembourgian Fran1.00",
6339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MA1.00",
6340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MD1.00",
6341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MDe1.00",
6342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MEX1.00",
6343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MG1.00",
6344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ML1.00",
6345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MM1.00",
6346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MN1.00",
6347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MO1.00",
6348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MR1.00",
6349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MT1.00",
6350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MU1.00",
6351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MV1.00",
6352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MW1.00",
6353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MX1.00",
6354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MY1.00",
6355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "MZ1.00",
6356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macanese Patac1.00",
6357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Macedonian Dena1.00",
6358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Ariar1.00",
6359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malagasy Fran1.00",
6360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malawian Kwach1.00",
6361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malaysian Ringgi1.00",
6362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maldivian Rufiya1.00",
6363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malian Fran1.00",
6364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Malot1.00",
6365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese Lir1.00",
6366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Maltese Poun1.00",
6367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritanian Ouguiy1.00",
6368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mauritian Rupe1.00",
6369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mexican Pes1.00",
637059d709d503bab6e2b61931737e662dd293b40578ccornelius        "Mexican Silver Peso (1861\\u201319921.00",
637127f654740f2a26ad62a5c155af9199af9e69b889claireho        "Mexican Investment Uni1.00",
6372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moldovan Le1.00",
6373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mongolian Tugri1.00",
6374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan Dirha1.00",
6375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Moroccan Fran1.00",
6376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican Escud1.00",
6377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Mozambican Metica1.00",
637859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Myanmar Kya1.00",
6379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "N1.00",
6380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NA1.00",
6381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NAf1.00",
6382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NG1.00",
6383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NI1.00",
6384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NK1.00",
6385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NL1.00",
6386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NO1.00",
6387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NP1.00",
6388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "NT1.00",
6389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Namibian Dolla1.00",
6390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nepalese Rupe1.00",
6391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Netherlands Antillean Guilde1.00",
6392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Dutch Guilde1.00",
6393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Israeli New Sheqe1.00",
6394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Zealand Dolla1.00",
639559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Nicaraguan C\\u00f3rdoba (1988\\u201319911.00",
639627f654740f2a26ad62a5c155af9199af9e69b889claireho        "Nicaraguan C\\u00f3rdob1.00",
6397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nigerian Nair1.00",
6398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "North Korean Wo1.00",
6399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Norwegian Kron1.00",
6400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Nr1.00",
6401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "OM1.00",
6402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Old Mozambican Metica1.00",
640359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Romanian Leu (1952\\u201320061.00",
640459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Serbian Dinar (2002\\u201320061.00",
640559d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese Dinar (1992\\u201320071.00",
640659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Sudanese Pound (1957\\u201319981.00",
640759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Turkish Lira (1922\\u201320051.00",
6408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Omani Ria1.00",
6409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PA1.00",
6410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PE1.00",
6411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PG1.00",
6412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PH1.00",
6413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PK1.00",
6414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PL1.00",
6415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PT1.00",
6416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "PY1.00",
6417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Pakistani Rupe1.00",
6418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Palladiu1.00",
6419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Panamanian Balbo1.00",
6420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Papua New Guinean Kin1.00",
6421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Paraguayan Guaran1.00",
6422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Peruvian Int1.00",
642359d709d503bab6e2b61931737e662dd293b40578ccornelius        "Peruvian Sol (1863\\u201319651.00",
6424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Peruvian Sol Nuev1.00",
6425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Philippine Pes1.00",
6426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Platinu1.00",
6427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Polish Zlot1.00",
642859d709d503bab6e2b61931737e662dd293b40578ccornelius        "Polish Zloty (1950\\u201319951.00",
6429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Escud1.00",
6430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Portuguese Guinea Escud1.00",
6431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Pr1.00",
6432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "QA1.00",
6433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Qatari Ria1.00",
6434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RD1.00",
6435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RH1.00",
6436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RINET Fund1.00",
6437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RS1.00",
6438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RU1.00",
6439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "RW1.00",
6440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rb1.00",
6441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rhodesian Dolla1.00",
6442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Romanian Le1.00",
6443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Russian Rubl1.00",
644459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Russian Ruble (1991\\u201319981.00",
6445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Rwandan Fran1.00",
6446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "S1.00",
6447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SA1.00",
6448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SB1.00",
6449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SC1.00",
6450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SD1.00",
6451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SE1.00",
6452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SG1.00",
6453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SH1.00",
6454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SI1.00",
6455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SK1.00",
6456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SL R1.00",
6457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SL1.00",
6458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SO1.00",
6459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ST1.00",
6460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SU1.00",
6461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SV1.00",
6462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SY1.00",
6463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "SZ1.00",
6464f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "St. Helena Poun1.00",
6465f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe Dobr1.00",
6466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Saudi Riya1.00",
6467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Serbian Dina1.00",
6468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Seychellois Rupe1.00",
6469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sh1.00",
6470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sierra Leonean Leon1.00",
6471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Silve1.00",
6472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Singapore Dolla1.00",
6473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovak Korun1.00",
6474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Slovenian Tola1.00",
6475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Solomon Islands Dolla1.00",
6476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Somali Shillin1.00",
6477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African Ran1.00",
6478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South African Rand (financial1.00",
6479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "South Korean Wo1.00",
6480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Soviet Roubl1.00",
6481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peset1.00",
6482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peseta (A account1.00",
6483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Spanish Peseta (convertible account1.00",
6484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Special Drawing Right1.00",
648527f654740f2a26ad62a5c155af9199af9e69b889claireho        "Sri Lankan Rupe1.00",
6486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Sudanese Poun1.00",
6487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Surinamese Dolla1.00",
648827f654740f2a26ad62a5c155af9199af9e69b889claireho        "Surinamese Guilde1.00",
6489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swazi Lilangen1.00",
6490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swedish Kron1.00",
6491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Swiss Fran1.00",
6492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Syrian Poun1.00",
6493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "T S1.00",
6494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TH1.00",
6495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TJ1.00",
6496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TM1.00",
6497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TN1.00",
6498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TO1.00",
6499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TP1.00",
6500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TR1.00",
6501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TT1.00",
6502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TW1.00",
6503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "TZ1.00",
6504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "New Taiwan Dolla1.00",
6505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani Rubl1.00",
6506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tajikistani Somon1.00",
6507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tanzanian Shillin1.00",
6508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Testing Currency Cod1.00",
6509b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Thai Bah1.00",
6510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Timorese Escud1.00",
6511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tongan Pa\\u20bbang1.00",
6512f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "Trinidad & Tobago Dolla1.00",
6513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Tunisian Dina1.00",
6514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkish Lir1.00",
6515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Turkmenistani Mana1.00",
6516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "U S1.00",
6517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "U1.00",
6518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UA1.00",
6519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UG1.00",
6520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dolla1.00",
6521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dollar (Next day1.00",
6522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US Dollar (Same day1.00",
6523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "US1.00",
6524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UY1.00",
6525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UZ1.00",
6526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ugandan Shillin1.00",
652759d709d503bab6e2b61931737e662dd293b40578ccornelius        "Ugandan Shilling (1966\\u201319871.00",
6528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian Hryvni1.00",
6529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ukrainian Karbovanet1.00",
653027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Colombian Real Value Uni1.00",
6531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "United Arab Emirates Dirha1.00",
653227f654740f2a26ad62a5c155af9199af9e69b889claireho        "Unknown Currenc1.00",
6533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Ur1.00",
653459d709d503bab6e2b61931737e662dd293b40578ccornelius        "Uruguay Peso (1975\\u201319931.00",
6535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Uruguay Peso Uruguay1.00",
653627f654740f2a26ad62a5c155af9199af9e69b889claireho        "Uruguay Peso (Indexed Units1.00",
65371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Uzbekistani So1.00",
6538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "V1.00",
6539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VE1.00",
6540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VN1.00",
6541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "VU1.00",
6542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vanuatu Vat1.00",
6543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Venezuelan Bol\\u00edva1.00",
6544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Venezuelan Bol\\u00edvar Fuert1.00",
6545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Vietnamese Don1.00",
65461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "West African CFA Fran1.00",
65471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        "Central African CFA Fran1.00",
6548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR Eur1.00",
6549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WIR Fran1.00",
6550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "WS1.00",
6551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Samoa Tal1.00",
6552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XA1.00",
6553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XB1.00",
6554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XC1.00",
6555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XD1.00",
6556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XE1.00",
6557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XF1.00",
6558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XO1.00",
6559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XP1.00",
6560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XR1.00",
6561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XT1.00",
6562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "XX1.00",
6563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YD1.00",
6564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YE1.00",
6565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "YU1.00",
6566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni Dina1.00",
6567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yemeni Ria1.00",
6568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Yugoslavian Convertible Dina1.00",
656959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Yugoslavian Hard Dinar (1966\\u201319901.00",
657027f654740f2a26ad62a5c155af9199af9e69b889claireho        "Yugoslavian New Dina1.00",
6571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Z1.00",
6572b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZA1.00",
6573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZM1.00",
6574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZR1.00",
6575b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ZW1.00",
657659d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zairean New Zaire (1993\\u201319981.00",
6577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Zairean Zair1.00",
6578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Zambian Kwach1.00",
657959d709d503bab6e2b61931737e662dd293b40578ccornelius        "Zimbabwean Dollar (1980\\u201320081.00",
6580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "dra1.00",
6581b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "lar1.00",
6582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "le1.00",
6583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "man1.00",
6584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "so1.00",
6585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
6586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
6587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Locale locale("en_US");
65888de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i=0; i<UPRV_LENGTHOF(DATA); ++i) {
6589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      UnicodeString formatted = ctou(DATA[i]);
6590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      UErrorCode status = U_ZERO_ERROR;
6591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      NumberFormat* numFmt = NumberFormat::createInstance(locale, UNUM_CURRENCY, status);
65926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      if (numFmt != NULL && U_SUCCESS(status)) {
6593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          ParsePosition parsePos;
6594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          LocalPointer<CurrencyAmount> currAmt(numFmt->parseCurrency(formatted, parsePos));
6595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if (parsePos.getIndex() > 0) {
6596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              double doubleVal = currAmt->getNumber().getDouble(status);
6597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              if ( doubleVal != 1.0 ) {
6598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                  errln("Parsed as currency value other than 1.0: " + formatted + " -> " + doubleVal);
6599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              }
6600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          } else {
6601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              errln("Failed to parse as currency: " + formatted);
66026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          }
66036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      } else {
66046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          dataerrln("Unable to create NumberFormat. - %s", u_errorName(status));
66056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          delete numFmt;
66066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          break;
6607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      }
6608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      delete numFmt;
6609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
6610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
66118de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (uint32_t i=0; i<UPRV_LENGTHOF(WRONG_DATA); ++i) {
6612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      UnicodeString formatted = ctou(WRONG_DATA[i]);
6613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      UErrorCode status = U_ZERO_ERROR;
6614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      NumberFormat* numFmt = NumberFormat::createInstance(locale, UNUM_CURRENCY, status);
66156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      if (numFmt != NULL && U_SUCCESS(status)) {
6616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          ParsePosition parsePos;
6617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          LocalPointer<CurrencyAmount> currAmt(numFmt->parseCurrency(formatted, parsePos));
6618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if (parsePos.getIndex() > 0) {
6619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              double doubleVal = currAmt->getNumber().getDouble(status);
6620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius              errln("Parsed as currency, should not have: " + formatted + " -> " + doubleVal);
66216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          }
66226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      } else {
66236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          dataerrln("Unable to create NumberFormat. - %s", u_errorName(status));
66246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          delete numFmt;
66256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          break;
6626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      }
6627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      delete numFmt;
6628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
6629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
6630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
663150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst char* attrString(int32_t);
663250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
663350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// UnicodeString s;
663450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//  std::string ss;
663550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//  std::cout << s.toUTF8String(ss)
663650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid NumberFormatTest::expectPositions(FieldPositionIterator& iter, int32_t *values, int32_t tupleCount,
663750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                       const UnicodeString& str)  {
663850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UBool found[10];
663950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  FieldPosition fp;
664050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
664150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (tupleCount > 10) {
664250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue("internal error, tupleCount too large", FALSE);
664350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  } else {
664450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (int i = 0; i < tupleCount; ++i) {
664550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      found[i] = FALSE;
664650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
664750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
664850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
664950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  logln(str);
665050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  while (iter.next(fp)) {
665150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool ok = FALSE;
665250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t id = fp.getField();
665350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t start = fp.getBeginIndex();
665450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t limit = fp.getEndIndex();
665550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
665650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // is there a logln using printf?
665750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char buf[128];
665850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    sprintf(buf, "%24s %3d %3d %3d", attrString(id), id, start, limit);
665950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    logln(buf);
666050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
666150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (int i = 0; i < tupleCount; ++i) {
666250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      if (found[i]) {
666350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        continue;
666450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
666550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      if (values[i*3] == id &&
666650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          values[i*3+1] == start &&
666750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          values[i*3+2] == limit) {
666850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        found[i] = ok = TRUE;
666950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        break;
667050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
667150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
667250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
667350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    assertTrue((UnicodeString)"found [" + id + "," + start + "," + limit + "]", ok);
667450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
667550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
667650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  // check that all were found
667750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UBool ok = TRUE;
667850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  for (int i = 0; i < tupleCount; ++i) {
667950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (!found[i]) {
668050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ok = FALSE;
668150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      assertTrue((UnicodeString) "missing [" + values[i*3] + "," + values[i*3+1] + "," + values[i*3+2] + "]", found[i]);
668250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
668350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
668450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue("no expected values were missing", ok);
668550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
668650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
668750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid NumberFormatTest::expectPosition(FieldPosition& pos, int32_t id, int32_t start, int32_t limit,
668850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                       const UnicodeString& str)  {
668950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  logln(str);
669050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"id " + id + " == " + pos.getField(), id == pos.getField());
669150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"begin " + start + " == " + pos.getBeginIndex(), start == pos.getBeginIndex());
669250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"end " + limit + " == " + pos.getEndIndex(), limit == pos.getEndIndex());
669350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
669450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
669550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid NumberFormatTest::TestFieldPositionIterator() {
669650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  // bug 7372
669750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UErrorCode status = U_ZERO_ERROR;
669850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  FieldPositionIterator iter1;
669950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  FieldPositionIterator iter2;
670050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  FieldPosition pos;
670150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
670250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(status);
670350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (failure(status, "NumberFormat::createInstance", TRUE)) return;
670450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
670550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  double num = 1234.56;
670650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UnicodeString str1;
670750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UnicodeString str2;
670850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
670950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"self==", iter1 == iter1);
671050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"iter1==iter2", iter1 == iter2);
671150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
671250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  decFmt->format(num, str1, &iter1, status);
671350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"iter1 != iter2", iter1 != iter2);
671450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  decFmt->format(num, str2, &iter2, status);
671550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"iter1 == iter2 (2)", iter1 == iter2);
671650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  iter1.next(pos);
671750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"iter1 != iter2 (2)", iter1 != iter2);
671850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  iter2.next(pos);
671950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertTrue((UnicodeString)"iter1 == iter2 (3)", iter1 == iter2);
672050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
672150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  // should format ok with no iterator
672250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  str2.remove();
672350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  decFmt->format(num, str2, NULL, status);
672450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  assertEquals("null fpiter", str1, str2);
672550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
672650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  delete decFmt;
672750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
672850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
672950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid NumberFormatTest::TestFormatAttributes() {
673050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  Locale locale("en_US");
673150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UErrorCode status = U_ZERO_ERROR;
6732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, UNUM_CURRENCY, status);
673350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "NumberFormat::createInstance", TRUE)) return;
673450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  double val = 12345.67;
673550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
673650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
673750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t expected[] = {
6738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_CURRENCY_FIELD, 0, 1,
6739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_GROUPING_SEPARATOR_FIELD, 3, 4,
6740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_INTEGER_FIELD, 1, 7,
6741103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8,
6742103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_FRACTION_FIELD, 8, 10,
674350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
67448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t tupleCount = UPRV_LENGTHOF(expected)/3;
674550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
674650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    FieldPositionIterator posIter;
674750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
674850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, &posIter, status);
674950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expectPositions(posIter, expected, tupleCount, result);
675050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
675150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
6752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    FieldPosition fp(UNUM_INTEGER_FIELD);
675350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
675450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, fp);
6755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectPosition(fp, UNUM_INTEGER_FIELD, 1, 7, result);
675650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
675750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
6758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    FieldPosition fp(UNUM_FRACTION_FIELD);
675950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
676050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, fp);
6761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectPosition(fp, UNUM_FRACTION_FIELD, 8, 10, result);
676250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
676350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  delete decFmt;
676450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, UNUM_SCIENTIFIC, status);
676650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  val = -0.0000123;
676750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
676850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t expected[] = {
6769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_SIGN_FIELD, 0, 1,
6770103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_INTEGER_FIELD, 1, 2,
6771103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3,
6772103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_FRACTION_FIELD, 3, 5,
6773103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_EXPONENT_SYMBOL_FIELD, 5, 6,
6774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_EXPONENT_SIGN_FIELD, 6, 7,
6775103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      UNUM_EXPONENT_FIELD, 7, 8
677650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
67778de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t tupleCount = UPRV_LENGTHOF(expected)/3;
677850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
677950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    FieldPositionIterator posIter;
678050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
678150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, &posIter, status);
678250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expectPositions(posIter, expected, tupleCount, result);
678350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
678450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
6785103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    FieldPosition fp(UNUM_INTEGER_FIELD);
678650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
678750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, fp);
6788103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectPosition(fp, UNUM_INTEGER_FIELD, 1, 2, result);
678950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
679050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  {
6791103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    FieldPosition fp(UNUM_FRACTION_FIELD);
679250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString result;
679350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decFmt->format(val, result, fp);
6794103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectPosition(fp, UNUM_FRACTION_FIELD, 3, 5, result);
679550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
679650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  delete decFmt;
679750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
679850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  fflush(stderr);
679950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
680050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
680150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst char* attrString(int32_t attrId) {
680250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  switch (attrId) {
6803103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_INTEGER_FIELD: return "integer";
6804103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_FRACTION_FIELD: return "fraction";
6805103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_DECIMAL_SEPARATOR_FIELD: return "decimal separator";
6806103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_EXPONENT_SYMBOL_FIELD: return "exponent symbol";
6807103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_EXPONENT_SIGN_FIELD: return "exponent sign";
6808103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_EXPONENT_FIELD: return "exponent";
6809103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_GROUPING_SEPARATOR_FIELD: return "grouping separator";
6810103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_CURRENCY_FIELD: return "currency";
6811103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_PERCENT_FIELD: return "percent";
6812103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_PERMILL_FIELD: return "permille";
6813103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    case UNUM_SIGN_FIELD: return "sign";
681450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    default: return "";
681550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
681650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
681750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
681850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
681950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//   Test formatting & parsing of big decimals.
682050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//      API test, not a comprehensive test.
682150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//      See DecimalFormatTest/DataDrivenTests
682250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
682350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) errln("file %s, line %d: status: %s", \
682450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                                __FILE__, __LINE__, u_errorName(status));}
682550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define ASSERT_EQUALS(expected, actual) {if ((expected) != (actual)) \
682650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                  errln("file %s, line %d: %s != %s", __FILE__, __LINE__, #expected, #actual);}
682750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
682850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool operator != (const char *s1, UnicodeString &s2) {
682950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // This function lets ASSERT_EQUALS("literal", UnicodeString) work.
683050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString us1(s1);
683150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return us1 != s2;
683250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
683350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
683450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid NumberFormatTest::TestDecimal() {
683550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
683650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode  status = U_ZERO_ERROR;
683750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        Formattable f("12.345678999987654321E666", status);
683850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
683950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        StringPiece s = f.getDecimalNumber(status);
684050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
684150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS("1.2345678999987654321E+667", s);
684250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        //printf("%s\n", s.data());
684350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
684450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
684550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
684650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
684750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        Formattable f1("this is not a number", status);
684850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(U_DECIMAL_NUMBER_SYNTAX_ERROR, status);
684950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
685050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
685150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
685250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
685350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        Formattable f;
685450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        f.setDecimalNumber("123.45", status);
685550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
685650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS( Formattable::kDouble, f.getType());
685750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(123.45, f.getDouble());
685850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(123.45, f.getDouble(status));
685950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
686050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS("123.45", f.getDecimalNumber(status));
686150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
686250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
686350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        f.setDecimalNumber("4.5678E7", status);
686450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t n;
686550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        n = f.getLong();
686650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(45678000, n);
686750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
686850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
686950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        f.setDecimalNumber("-123", status);
687050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
687150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS( Formattable::kLong, f.getType());
687250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(-123, f.getLong());
687350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(-123, f.getLong(status));
687450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
687550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS("-123", f.getDecimalNumber(status));
687650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
687750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
687850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
687950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        f.setDecimalNumber("1234567890123", status);  // Number too big for 32 bits
688050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
688150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS( Formattable::kInt64, f.getType());
688250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(1234567890123LL, f.getInt64());
688350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS(1234567890123LL, f.getInt64(status));
688450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
688550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_EQUALS("1234567890123", f.getDecimalNumber(status));
688650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ASSERT_SUCCESS(status);
688750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
688850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
688950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
689050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
6891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status);
689227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status) || fmtr == NULL) {
689327f654740f2a26ad62a5c155af9199af9e69b889claireho            dataerrln("Unable to create NumberFormat");
689427f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
689527f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString formattedResult;
689627f654740f2a26ad62a5c155af9199af9e69b889claireho            StringPiece num("244444444444444444444444444444444444446.4");
689727f654740f2a26ad62a5c155af9199af9e69b889claireho            fmtr->format(num, formattedResult, NULL, status);
689827f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
689927f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult);
690027f654740f2a26ad62a5c155af9199af9e69b889claireho            //std::string ss; std::cout << formattedResult.toUTF8String(ss);
690127f654740f2a26ad62a5c155af9199af9e69b889claireho            delete fmtr;
690227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
690350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
690450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
690550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
690650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // Check formatting a DigitList.  DigitList is internal, but this is
690750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // a critical interface that must work.
690850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
6909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status);
691027f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status) || fmtr == NULL) {
691127f654740f2a26ad62a5c155af9199af9e69b889claireho            dataerrln("Unable to create NumberFormat");
691227f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
691327f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString formattedResult;
691427f654740f2a26ad62a5c155af9199af9e69b889claireho            DigitList dl;
691527f654740f2a26ad62a5c155af9199af9e69b889claireho            StringPiece num("123.4566666666666666666666666666666666621E+40");
691627f654740f2a26ad62a5c155af9199af9e69b889claireho            dl.set(num, status);
691727f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
691827f654740f2a26ad62a5c155af9199af9e69b889claireho            fmtr->format(dl, formattedResult, NULL, status);
691927f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
692027f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult);
692127f654740f2a26ad62a5c155af9199af9e69b889claireho
692227f654740f2a26ad62a5c155af9199af9e69b889claireho            status = U_ZERO_ERROR;
692327f654740f2a26ad62a5c155af9199af9e69b889claireho            num.set("666.666");
692427f654740f2a26ad62a5c155af9199af9e69b889claireho            dl.set(num, status);
692527f654740f2a26ad62a5c155af9199af9e69b889claireho            FieldPosition pos(NumberFormat::FRACTION_FIELD);
692627f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
692727f654740f2a26ad62a5c155af9199af9e69b889claireho            formattedResult.remove();
692827f654740f2a26ad62a5c155af9199af9e69b889claireho            fmtr->format(dl, formattedResult, pos, status);
692927f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
693027f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS("666.666", formattedResult);
693127f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS(4, pos.getBeginIndex());
693227f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS(7, pos.getEndIndex());
693327f654740f2a26ad62a5c155af9199af9e69b889claireho            delete fmtr;
693427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
693550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
693650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
693750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
693850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // Check a parse with a formatter with a multiplier.
693950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
6940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_PERCENT, status);
694127f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status) || fmtr == NULL) {
694227f654740f2a26ad62a5c155af9199af9e69b889claireho            dataerrln("Unable to create NumberFormat");
694327f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
694427f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString input = "1.84%";
694527f654740f2a26ad62a5c155af9199af9e69b889claireho            Formattable result;
694627f654740f2a26ad62a5c155af9199af9e69b889claireho            fmtr->parse(input, result, status);
694727f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
694827f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS(0, strcmp("0.0184", result.getDecimalNumber(status).data()));
694927f654740f2a26ad62a5c155af9199af9e69b889claireho            //std::cout << result.getDecimalNumber(status).data();
695027f654740f2a26ad62a5c155af9199af9e69b889claireho            delete fmtr;
695127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
695250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
695350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
695454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if U_PLATFORM != U_PF_CYGWIN || defined(CYGWINMSVC)
695554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /*
695654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * This test fails on Cygwin (1.7.16) using GCC because of a rounding issue with strtod().
695754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * See #9463
695854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
695950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
696050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // Check that a parse returns a decimal number with full accuracy
696150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
6962b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NumberFormat *fmtr = NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, status);
696327f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status) || fmtr == NULL) {
696427f654740f2a26ad62a5c155af9199af9e69b889claireho            dataerrln("Unable to create NumberFormat");
696527f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
696627f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString input = "1.002200044400088880000070000";
696727f654740f2a26ad62a5c155af9199af9e69b889claireho            Formattable result;
696827f654740f2a26ad62a5c155af9199af9e69b889claireho            fmtr->parse(input, result, status);
696927f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_SUCCESS(status);
697027f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS(0, strcmp("1.00220004440008888000007", result.getDecimalNumber(status).data()));
697127f654740f2a26ad62a5c155af9199af9e69b889claireho            ASSERT_EQUALS(1.00220004440008888,   result.getDouble());
697227f654740f2a26ad62a5c155af9199af9e69b889claireho            //std::cout << result.getDecimalNumber(status).data();
697327f654740f2a26ad62a5c155af9199af9e69b889claireho            delete fmtr;
697427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
697550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
697654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
697750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
697850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
697950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
698027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid NumberFormatTest::TestCurrencyFractionDigits() {
698127f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
698227f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString text1, text2;
698327f654740f2a26ad62a5c155af9199af9e69b889claireho    double value = 99.12345;
698427f654740f2a26ad62a5c155af9199af9e69b889claireho
698527f654740f2a26ad62a5c155af9199af9e69b889claireho    // Create currenct instance
698627f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* fmt = NumberFormat::createCurrencyInstance("ja_JP", status);
698727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(status) || fmt == NULL) {
698827f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("Unable to create NumberFormat");
698927f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
699027f654740f2a26ad62a5c155af9199af9e69b889claireho        fmt->format(value, text1);
699127f654740f2a26ad62a5c155af9199af9e69b889claireho
699227f654740f2a26ad62a5c155af9199af9e69b889claireho        // Reset the same currency and format the test value again
699327f654740f2a26ad62a5c155af9199af9e69b889claireho        fmt->setCurrency(fmt->getCurrency(), status);
699427f654740f2a26ad62a5c155af9199af9e69b889claireho        ASSERT_SUCCESS(status);
699527f654740f2a26ad62a5c155af9199af9e69b889claireho        fmt->format(value, text2);
699627f654740f2a26ad62a5c155af9199af9e69b889claireho
699727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (text1 != text2) {
699827f654740f2a26ad62a5c155af9199af9e69b889claireho            errln((UnicodeString)"NumberFormat::format() should return the same result - text1="
699927f654740f2a26ad62a5c155af9199af9e69b889claireho                + text1 + " text2=" + text2);
700027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
700127f654740f2a26ad62a5c155af9199af9e69b889claireho        delete fmt;
700227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
700327f654740f2a26ad62a5c155af9199af9e69b889claireho}
700427f654740f2a26ad62a5c155af9199af9e69b889claireho
700527f654740f2a26ad62a5c155af9199af9e69b889clairehovoid NumberFormatTest::TestExponentParse() {
700627f654740f2a26ad62a5c155af9199af9e69b889claireho
700727f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
700827f654740f2a26ad62a5c155af9199af9e69b889claireho    Formattable result;
700927f654740f2a26ad62a5c155af9199af9e69b889claireho    ParsePosition parsePos(0);
701027f654740f2a26ad62a5c155af9199af9e69b889claireho
701127f654740f2a26ad62a5c155af9199af9e69b889claireho    // set the exponent symbol
701227f654740f2a26ad62a5c155af9199af9e69b889claireho    status = U_ZERO_ERROR;
701327f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(), status);
701427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
701527f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Default)");
701627f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
701727f654740f2a26ad62a5c155af9199af9e69b889claireho    }
7018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
701927f654740f2a26ad62a5c155af9199af9e69b889claireho    // create format instance
702027f654740f2a26ad62a5c155af9199af9e69b889claireho    status = U_ZERO_ERROR;
702127f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat fmt("#####", symbols, status);
7022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(status)) {
702327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, symbols*)");
702427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
7025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
702627f654740f2a26ad62a5c155af9199af9e69b889claireho    // parse the text
7027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    fmt.parse("5.06e-27", result, parsePos);
702827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(result.getType() != Formattable::kDouble &&
7029b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       result.getDouble() != 5.06E-27 &&
7030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       parsePos.getIndex() != 8
703127f654740f2a26ad62a5c155af9199af9e69b889claireho       )
703227f654740f2a26ad62a5c155af9199af9e69b889claireho    {
7033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("ERROR: parse failed - expected 5.06E-27, 8  - returned %d, %i",
7034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho              result.getDouble(), parsePos.getIndex());
703527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
703627f654740f2a26ad62a5c155af9199af9e69b889claireho}
703727f654740f2a26ad62a5c155af9199af9e69b889claireho
7038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid NumberFormatTest::TestExplicitParents() {
7039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Test that number formats are properly inherited from es_419 */
7041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* These could be subject to change if the CLDR data changes */
7042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const char* parentLocaleTests[][2]= {
7043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* locale ID */  /* expected */
7044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"es_CO", "1.250,75" },
7045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"es_ES", "1.250,75" },
7046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"es_GQ", "1.250,75" },
7047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"es_MX", "1,250.75" },
7048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"es_US", "1,250.75" },
7049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"es_VE", "1.250,75" },
7050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
7051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString s;
7053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
70548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(int i=0; i < UPRV_LENGTHOF(parentLocaleTests); i++){
7055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
7056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *localeID = parentLocaleTests[i][0];
7057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString expected(parentLocaleTests[i][1], -1, US_INV);
7058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        expected = expected.unescape();
7059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        char loc[256]={0};
7060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uloc_canonicalize(localeID, loc, 256, &status);
7061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NumberFormat *fmt= NumberFormat::createInstance(Locale(loc), status);
7062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(U_FAILURE(status)){
7063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dataerrln("Could not create number formatter for locale %s - %s",localeID, u_errorName(status));
7064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
7065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
7066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        s.remove();
7067b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        fmt->format(1250.75, s);
7068b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(s!=expected){
7069b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln(UnicodeString("FAIL: Expected: ")+expected
7070b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    + UnicodeString(" Got: ") + s
7071b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    + UnicodeString( " for locale: ")+ UnicodeString(localeID) );
7072b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
7073b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)){
7074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln((UnicodeString)"FAIL: Status " + (int32_t)status);
7075b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
7076b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete fmt;
7077b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
7078b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7079b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
7080103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7081103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
7082103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Test available numbering systems API.
7083103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
7084103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid NumberFormatTest::TestAvailableNumberingSystems() {
7085103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
7086103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    StringEnumeration *availableNumberingSystems = NumberingSystem::getAvailableNames(status);
7087103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    CHECK_DATA(status, "NumberingSystem::getAvailableNames()")
7088103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7089103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t nsCount = availableNumberingSystems->count(status);
7090c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if ( nsCount < 74 ) {
7091c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 74, got %d",nsCount);
7092103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
7093103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7094103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* A relatively simple test of the API.  We call getAvailableNames() and cycle through */
7095103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* each name returned, attempting to create a numbering system based on that name and  */
7096103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* verifying that the name returned from the resulting numbering system is the same    */
7097103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* one that we initially thought.                                                      */
7098103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7099103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t len;
7100103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for ( int32_t i = 0 ; i < nsCount ; i++ ) {
7101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        const char *nsname = availableNumberingSystems->next(&len,status);
7102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status);
7103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        logln("OK for ns = %s",nsname);
7104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if ( uprv_strcmp(nsname,ns->getName()) ) {
7105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln("FAIL: Numbering system name didn't match for name = %s\n",nsname);
7106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
7107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        delete ns;
7109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
7110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    delete availableNumberingSystems;
7112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
7113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid
7115103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNumberFormatTest::Test9087(void)
7116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
7117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_DECL(pattern,"#",1);
7118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_INIT(pattern,"#",1);
7119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_DECL(infstr,"INF",3);
7121103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_INIT(infstr,"INF",3);
7122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_DECL(nanstr,"NAN",3);
7124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_STRING_INIT(nanstr,"NAN",3);
7125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar outputbuf[50] = {0};
7127103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
7128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UNumberFormat* fmt = unum_open(UNUM_PATTERN_DECIMAL,pattern,1,NULL,NULL,&status);
7129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if ( U_FAILURE(status) ) {
7130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        dataerrln("FAIL: error in unum_open() - %s", u_errorName(status));
7131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
7132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
7133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_setSymbol(fmt,UNUM_INFINITY_SYMBOL,infstr,3,&status);
7135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_setSymbol(fmt,UNUM_NAN_SYMBOL,nanstr,3,&status);
7136103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if ( U_FAILURE(status) ) {
7137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: error setting symbols");
7138103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
7139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    double inf = uprv_getInfinity();
7141103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7142103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_setAttribute(fmt,UNUM_ROUNDING_MODE,UNUM_ROUND_HALFEVEN);
7143103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_setDoubleAttribute(fmt,UNUM_ROUNDING_INCREMENT,0);
7144103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UFieldPosition position = { 0, 0, 0};
7146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_formatDouble(fmt,inf,outputbuf,50,&position,&status);
7147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if ( u_strcmp(infstr, outputbuf)) {
7149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln((UnicodeString)"FAIL: unexpected result for infinity - expected " + infstr + " got " + outputbuf);
7150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
7151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_close(fmt);
7153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
7154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "dcfmtimp.h"
7156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid NumberFormatTest::TestFormatFastpaths() {
7158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49
715954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    logln("Sizeof DecimalFormat = %d, Sizeof DecimalFormatInternal=%d, UNUM_DECIMALFORMAT_INTERNAL_SIZE=%d\n",
7160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        sizeof(DecimalFormat), sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE);
716154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(UNUM_DECIMALFORMAT_INTERNAL_SIZE < sizeof(DecimalFormatInternal)) {
716254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        errln("Error: sizeof(DecimalFormatInternal)=%d but UNUM_DECIMALFORMAT_INTERNAL_SIZE is only %d. Increase the #define?\n", sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE);
716354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(UNUM_DECIMALFORMAT_INTERNAL_SIZE > (sizeof(DecimalFormatInternal)+16)) {
716454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        infoln("Note: sizeof(DecimalFormatInternal)=%d but UNUM_DECIMALFORMAT_INTERNAL_SIZE is %d. Decrease the #define? sizeof(DecimalFormat)=%d\n", sizeof(DecimalFormatInternal), UNUM_DECIMALFORMAT_INTERNAL_SIZE, sizeof(DecimalFormat));
716554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
7166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
716754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    infoln("NOTE: UCONFIG_FORMAT_FASTPATHS not set, test skipped.");
7168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
7169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
717054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    // get some additional case
717154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {
717254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UErrorCode status=U_ZERO_ERROR;
717354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        DecimalFormat df(UnicodeString("0000",""),status);
7174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
7175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
717654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        } else {
7177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t long_number = 1;
7178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString expect = "0001";
7179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
7180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPosition pos;
7181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            df.format(long_number, result, pos);
7182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if(U_FAILURE(status)||expect!=result) {
7183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),""));
7184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            } else {
7185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                logln("OK:  got expected '"+result+"' status "+UnicodeString(u_errorName(status),""));
7186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
718754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
7188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
718954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {
719054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UErrorCode status=U_ZERO_ERROR;
719154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        DecimalFormat df(UnicodeString("0000000000000000000",""),status);
7192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
7193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
719454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        } else {
7195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t long_number = U_INT64_MIN; // -9223372036854775808L;
7196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // uint8_t bits[8];
7197c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // memcpy(bits,&long_number,8);
7198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // for(int i=0;i<8;i++) {
7199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            //   logln("bits: %02X", (unsigned int)bits[i]);
7200c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // }
7201c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString expect = "-9223372036854775808";
7202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
7203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPosition pos;
7204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            df.format(long_number, result, pos);
7205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if(U_FAILURE(status)||expect!=result) {
7206c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
7207c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            } else {
7208c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                logln("OK:  got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
7209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
721054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
7211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
721254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {
721354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UErrorCode status=U_ZERO_ERROR;
721454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        DecimalFormat df(UnicodeString("0000000000000000000",""),status);
7215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
7216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
721754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        } else {
7218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t long_number = U_INT64_MAX; // -9223372036854775808L;
7219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // uint8_t bits[8];
7220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // memcpy(bits,&long_number,8);
7221c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // for(int i=0;i<8;i++) {
7222c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            //   logln("bits: %02X", (unsigned int)bits[i]);
7223c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // }
7224c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString expect = "9223372036854775807";
7225c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
7226c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPosition pos;
7227c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            df.format(long_number, result, pos);
7228c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if(U_FAILURE(status)||expect!=result) {
7229c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
7230c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            } else {
7231c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                logln("OK:  got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
7232c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
723354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
7234103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
723554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {
723654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UErrorCode status=U_ZERO_ERROR;
723754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        DecimalFormat df(UnicodeString("0000000000000000000",""),status);
7238c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
7239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
724054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        } else {
7241c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t long_number = 0;
7242c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // uint8_t bits[8];
7243c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // memcpy(bits,&long_number,8);
7244c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // for(int i=0;i<8;i++) {
7245c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            //   logln("bits: %02X", (unsigned int)bits[i]);
7246c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            // }
7247c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString expect = "0000000000000000000";
7248c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
7249c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPosition pos;
7250c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            df.format(long_number, result, pos);
7251c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if(U_FAILURE(status)||expect!=result) {
7252c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
7253c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            } else {
7254c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                logln("OK:  got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
7255c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
725654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
7257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
725854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {
725954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UErrorCode status=U_ZERO_ERROR;
726054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        DecimalFormat df(UnicodeString("0000000000000000000",""),status);
7261c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
7262c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
726354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        } else {
7264c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t long_number = U_INT64_MIN + 1;
7265c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString expect = "-9223372036854775807";
7266c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
7267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPosition pos;
7268c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            df.format(long_number, result, pos);
7269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            if(U_FAILURE(status)||expect!=result) {
7270c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
7271c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            } else {
7272c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                logln("OK:  got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
7273c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            }
727454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
7275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
727654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
727754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
727854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
727954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid NumberFormatTest::TestFormattableSize(void) {
728054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(sizeof(FmtStackData) > UNUM_INTERNAL_STACKARRAY_SIZE) {
728154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errln("Error: sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n",
728254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE);
728354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  } else if(sizeof(FmtStackData) < UNUM_INTERNAL_STACKARRAY_SIZE) {
728454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    logln("Warning: sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n",
728554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE);
728654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  } else {
728754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    logln("sizeof(FmtStackData)=%d, UNUM_INTERNAL_STACKARRAY_SIZE=%d\n",
728854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        sizeof(FmtStackData), UNUM_INTERNAL_STACKARRAY_SIZE);
7289103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  }
7290103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
7291103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
729259d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool NumberFormatTest::testFormattableAsUFormattable(const char *file, int line, Formattable &f) {
729359d709d503bab6e2b61931737e662dd293b40578ccornelius  UnicodeString fileLine = UnicodeString(file)+UnicodeString(":")+line+UnicodeString(": ");
729459d709d503bab6e2b61931737e662dd293b40578ccornelius
729559d709d503bab6e2b61931737e662dd293b40578ccornelius  UFormattable *u = f.toUFormattable();
729659d709d503bab6e2b61931737e662dd293b40578ccornelius  logln();
729759d709d503bab6e2b61931737e662dd293b40578ccornelius  if (u == NULL) {
729859d709d503bab6e2b61931737e662dd293b40578ccornelius    errln("%s:%d: Error: f.toUFormattable() retuned NULL.");
729959d709d503bab6e2b61931737e662dd293b40578ccornelius    return FALSE;
730059d709d503bab6e2b61931737e662dd293b40578ccornelius  }
730159d709d503bab6e2b61931737e662dd293b40578ccornelius  logln("%s:%d: comparing Formattable with UFormattable", file, line);
730259d709d503bab6e2b61931737e662dd293b40578ccornelius  logln(fileLine + toString(f));
730359d709d503bab6e2b61931737e662dd293b40578ccornelius
730459d709d503bab6e2b61931737e662dd293b40578ccornelius  UErrorCode status = U_ZERO_ERROR;
730559d709d503bab6e2b61931737e662dd293b40578ccornelius  UErrorCode valueStatus = U_ZERO_ERROR;
730659d709d503bab6e2b61931737e662dd293b40578ccornelius  UFormattableType expectUType = UFMT_COUNT; // invalid
730759d709d503bab6e2b61931737e662dd293b40578ccornelius
730859d709d503bab6e2b61931737e662dd293b40578ccornelius  UBool triedExact = FALSE; // did we attempt an exact comparison?
730959d709d503bab6e2b61931737e662dd293b40578ccornelius  UBool exactMatch = FALSE; // was the exact comparison true?
731059d709d503bab6e2b61931737e662dd293b40578ccornelius
731159d709d503bab6e2b61931737e662dd293b40578ccornelius  switch( f.getType() ) {
731259d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kDate:
731359d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_DATE;
731459d709d503bab6e2b61931737e662dd293b40578ccornelius    exactMatch = (f.getDate()==ufmt_getDate(u, &valueStatus));
731559d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
731659d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
731759d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kDouble:
731859d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_DOUBLE;
731959d709d503bab6e2b61931737e662dd293b40578ccornelius    exactMatch = (f.getDouble()==ufmt_getDouble(u, &valueStatus));
732059d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
732159d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
732259d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kLong:
732359d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_LONG;
732459d709d503bab6e2b61931737e662dd293b40578ccornelius    exactMatch = (f.getLong()==ufmt_getLong(u, &valueStatus));
732559d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
732659d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
732759d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kString:
732859d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_STRING;
732959d709d503bab6e2b61931737e662dd293b40578ccornelius    {
733059d709d503bab6e2b61931737e662dd293b40578ccornelius      UnicodeString str;
733159d709d503bab6e2b61931737e662dd293b40578ccornelius      f.getString(str);
733259d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t len;
733359d709d503bab6e2b61931737e662dd293b40578ccornelius      const UChar* uch = ufmt_getUChars(u, &len, &valueStatus);
733459d709d503bab6e2b61931737e662dd293b40578ccornelius      if(U_SUCCESS(valueStatus)) {
733559d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString str2(uch, len);
733659d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("UChar* NULL-terminated", uch[len]==0);
733759d709d503bab6e2b61931737e662dd293b40578ccornelius        exactMatch = (str == str2);
733859d709d503bab6e2b61931737e662dd293b40578ccornelius      }
733959d709d503bab6e2b61931737e662dd293b40578ccornelius      triedExact = TRUE;
734059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
734159d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
734259d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kArray:
734359d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_ARRAY;
734459d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
734559d709d503bab6e2b61931737e662dd293b40578ccornelius    {
734659d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t count = ufmt_getArrayLength(u, &valueStatus);
734759d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t count2;
734859d709d503bab6e2b61931737e662dd293b40578ccornelius      const Formattable *array2 = f.getArray(count2);
734959d709d503bab6e2b61931737e662dd293b40578ccornelius      exactMatch = assertEquals(fileLine + " array count", count, count2);
735059d709d503bab6e2b61931737e662dd293b40578ccornelius
735159d709d503bab6e2b61931737e662dd293b40578ccornelius      if(exactMatch) {
735259d709d503bab6e2b61931737e662dd293b40578ccornelius        for(int i=0;U_SUCCESS(valueStatus) && i<count;i++) {
735359d709d503bab6e2b61931737e662dd293b40578ccornelius          UFormattable *uu = ufmt_getArrayItemByIndex(u, i, &valueStatus);
735459d709d503bab6e2b61931737e662dd293b40578ccornelius          if(*Formattable::fromUFormattable(uu) != (array2[i])) {
735559d709d503bab6e2b61931737e662dd293b40578ccornelius            errln("%s:%d: operator== did not match at index[%d] - %p vs %p", file, line, i,
735659d709d503bab6e2b61931737e662dd293b40578ccornelius                  (const void*)Formattable::fromUFormattable(uu), (const void*)&(array2[i]));
735759d709d503bab6e2b61931737e662dd293b40578ccornelius            exactMatch = FALSE;
735859d709d503bab6e2b61931737e662dd293b40578ccornelius          } else {
735959d709d503bab6e2b61931737e662dd293b40578ccornelius            if(!testFormattableAsUFormattable("(sub item)",i,*Formattable::fromUFormattable(uu))) {
736059d709d503bab6e2b61931737e662dd293b40578ccornelius              exactMatch = FALSE;
736159d709d503bab6e2b61931737e662dd293b40578ccornelius            }
736259d709d503bab6e2b61931737e662dd293b40578ccornelius          }
736359d709d503bab6e2b61931737e662dd293b40578ccornelius        }
736459d709d503bab6e2b61931737e662dd293b40578ccornelius      }
736559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
736659d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
736759d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kInt64:
736859d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_INT64;
736959d709d503bab6e2b61931737e662dd293b40578ccornelius    exactMatch = (f.getInt64()==ufmt_getInt64(u, &valueStatus));
737059d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
737159d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
737259d709d503bab6e2b61931737e662dd293b40578ccornelius  case Formattable::kObject:
737359d709d503bab6e2b61931737e662dd293b40578ccornelius    expectUType = UFMT_OBJECT;
737459d709d503bab6e2b61931737e662dd293b40578ccornelius    exactMatch = (f.getObject()==ufmt_getObject(u, &valueStatus));
737559d709d503bab6e2b61931737e662dd293b40578ccornelius    triedExact = TRUE;
737659d709d503bab6e2b61931737e662dd293b40578ccornelius    break;
737759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
737859d709d503bab6e2b61931737e662dd293b40578ccornelius  UFormattableType uType = ufmt_getType(u, &status);
737959d709d503bab6e2b61931737e662dd293b40578ccornelius
738059d709d503bab6e2b61931737e662dd293b40578ccornelius  if(U_FAILURE(status)) {
738159d709d503bab6e2b61931737e662dd293b40578ccornelius    errln("%s:%d: Error calling ufmt_getType - %s", file, line, u_errorName(status));
738259d709d503bab6e2b61931737e662dd293b40578ccornelius    return FALSE;
738359d709d503bab6e2b61931737e662dd293b40578ccornelius  }
738459d709d503bab6e2b61931737e662dd293b40578ccornelius
738559d709d503bab6e2b61931737e662dd293b40578ccornelius  if(uType != expectUType) {
738659d709d503bab6e2b61931737e662dd293b40578ccornelius    errln("%s:%d: got type (%d) expected (%d) from ufmt_getType", file, line, (int) uType, (int) expectUType);
738759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
738859d709d503bab6e2b61931737e662dd293b40578ccornelius
738959d709d503bab6e2b61931737e662dd293b40578ccornelius  if(triedExact) {
739059d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(valueStatus)) {
739159d709d503bab6e2b61931737e662dd293b40578ccornelius      errln("%s:%d: got err %s trying to ufmt_get...() for exact match check", file, line, u_errorName(valueStatus));
739259d709d503bab6e2b61931737e662dd293b40578ccornelius    } else if(!exactMatch) {
739359d709d503bab6e2b61931737e662dd293b40578ccornelius     errln("%s:%d: failed exact match for the Formattable type", file, line);
739459d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
739559d709d503bab6e2b61931737e662dd293b40578ccornelius      logln("%s:%d: exact match OK", file, line);
739659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
739759d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
739859d709d503bab6e2b61931737e662dd293b40578ccornelius    logln("%s:%d: note, did not attempt exact match for this formattable type", file, line);
739959d709d503bab6e2b61931737e662dd293b40578ccornelius  }
740059d709d503bab6e2b61931737e662dd293b40578ccornelius
740159d709d503bab6e2b61931737e662dd293b40578ccornelius  if( assertEquals(fileLine + " isNumeric()", f.isNumeric(), ufmt_isNumeric(u))
740259d709d503bab6e2b61931737e662dd293b40578ccornelius      && f.isNumeric()) {
740359d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode convStatus = U_ZERO_ERROR;
740459d709d503bab6e2b61931737e662dd293b40578ccornelius
740559d709d503bab6e2b61931737e662dd293b40578ccornelius    if(uType != UFMT_INT64) { // may fail to compare
740659d709d503bab6e2b61931737e662dd293b40578ccornelius      assertTrue(fileLine + " as doubles ==", f.getDouble(convStatus)==ufmt_getDouble(u, &convStatus));
740759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
740859d709d503bab6e2b61931737e662dd293b40578ccornelius
740959d709d503bab6e2b61931737e662dd293b40578ccornelius    if( assertSuccess(fileLine + " (numeric conversion status)", convStatus) ) {
741059d709d503bab6e2b61931737e662dd293b40578ccornelius      StringPiece fDecNum = f.getDecimalNumber(convStatus);
741159d709d503bab6e2b61931737e662dd293b40578ccornelius#if 1
741259d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t len;
741359d709d503bab6e2b61931737e662dd293b40578ccornelius      const char *decNumChars = ufmt_getDecNumChars(u, &len, &convStatus);
741459d709d503bab6e2b61931737e662dd293b40578ccornelius#else
741559d709d503bab6e2b61931737e662dd293b40578ccornelius      // copy version
741659d709d503bab6e2b61931737e662dd293b40578ccornelius      char decNumChars[200];
741759d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t len = ufmt_getDecNumChars(u, decNumChars, 200, &convStatus);
741859d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
741959d709d503bab6e2b61931737e662dd293b40578ccornelius
742059d709d503bab6e2b61931737e662dd293b40578ccornelius      if( assertSuccess(fileLine + " (decNumbers conversion)", convStatus) ) {
742159d709d503bab6e2b61931737e662dd293b40578ccornelius        logln(fileLine + decNumChars);
742259d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals(fileLine + " decNumChars length==", len, fDecNum.length());
742359d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals(fileLine + " decNumChars digits", decNumChars, fDecNum.data());
742459d709d503bab6e2b61931737e662dd293b40578ccornelius      }
742559d709d503bab6e2b61931737e662dd293b40578ccornelius
742659d709d503bab6e2b61931737e662dd293b40578ccornelius      UErrorCode int64ConversionF = U_ZERO_ERROR;
742759d709d503bab6e2b61931737e662dd293b40578ccornelius      int64_t l = f.getInt64(int64ConversionF);
742859d709d503bab6e2b61931737e662dd293b40578ccornelius      UErrorCode int64ConversionU = U_ZERO_ERROR;
742959d709d503bab6e2b61931737e662dd293b40578ccornelius      int64_t r = ufmt_getInt64(u, &int64ConversionU);
743059d709d503bab6e2b61931737e662dd293b40578ccornelius
743159d709d503bab6e2b61931737e662dd293b40578ccornelius      if( (l==r)
743259d709d503bab6e2b61931737e662dd293b40578ccornelius          && ( uType != UFMT_INT64 ) // int64 better not overflow
743359d709d503bab6e2b61931737e662dd293b40578ccornelius          && (U_INVALID_FORMAT_ERROR==int64ConversionU)
743459d709d503bab6e2b61931737e662dd293b40578ccornelius          && (U_INVALID_FORMAT_ERROR==int64ConversionF) ) {
743559d709d503bab6e2b61931737e662dd293b40578ccornelius        logln("%s:%d: OK: 64 bit overflow", file, line);
743659d709d503bab6e2b61931737e662dd293b40578ccornelius      } else {
743759d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals(fileLine + " as int64 ==", l, r);
743859d709d503bab6e2b61931737e662dd293b40578ccornelius        assertSuccess(fileLine + " Formattable.getnt64()", int64ConversionF);
743959d709d503bab6e2b61931737e662dd293b40578ccornelius        assertSuccess(fileLine + " ufmt_getInt64()", int64ConversionU);
744059d709d503bab6e2b61931737e662dd293b40578ccornelius      }
744159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
744259d709d503bab6e2b61931737e662dd293b40578ccornelius  }
744359d709d503bab6e2b61931737e662dd293b40578ccornelius  return exactMatch || !triedExact;
744459d709d503bab6e2b61931737e662dd293b40578ccornelius}
744559d709d503bab6e2b61931737e662dd293b40578ccornelius
744659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestUFormattable(void) {
744759d709d503bab6e2b61931737e662dd293b40578ccornelius  {
744859d709d503bab6e2b61931737e662dd293b40578ccornelius    // test that a default formattable is equal to Formattable()
744959d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
745059d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalUFormattablePointer defaultUFormattable(ufmt_open(&status));
745159d709d503bab6e2b61931737e662dd293b40578ccornelius    assertSuccess("calling umt_open", status);
745259d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable defaultFormattable;
745359d709d503bab6e2b61931737e662dd293b40578ccornelius    assertTrue((UnicodeString)"comparing ufmt_open() with Formattable()",
745459d709d503bab6e2b61931737e662dd293b40578ccornelius               (defaultFormattable
745559d709d503bab6e2b61931737e662dd293b40578ccornelius                == *(Formattable::fromUFormattable(defaultUFormattable.getAlias()))));
745659d709d503bab6e2b61931737e662dd293b40578ccornelius    assertTrue((UnicodeString)"comparing ufmt_open() with Formattable()",
745759d709d503bab6e2b61931737e662dd293b40578ccornelius               (defaultFormattable
745859d709d503bab6e2b61931737e662dd293b40578ccornelius                == *(Formattable::fromUFormattable(defaultUFormattable.getAlias()))));
745959d709d503bab6e2b61931737e662dd293b40578ccornelius    assertTrue((UnicodeString)"comparing Formattable() round tripped through UFormattable",
746059d709d503bab6e2b61931737e662dd293b40578ccornelius               (defaultFormattable
746159d709d503bab6e2b61931737e662dd293b40578ccornelius                == *(Formattable::fromUFormattable(defaultFormattable.toUFormattable()))));
746259d709d503bab6e2b61931737e662dd293b40578ccornelius    assertTrue((UnicodeString)"comparing &Formattable() round tripped through UFormattable",
746359d709d503bab6e2b61931737e662dd293b40578ccornelius               ((&defaultFormattable)
746459d709d503bab6e2b61931737e662dd293b40578ccornelius                == Formattable::fromUFormattable(defaultFormattable.toUFormattable())));
746559d709d503bab6e2b61931737e662dd293b40578ccornelius    assertFalse((UnicodeString)"comparing &Formattable() with ufmt_open()",
746659d709d503bab6e2b61931737e662dd293b40578ccornelius               ((&defaultFormattable)
746759d709d503bab6e2b61931737e662dd293b40578ccornelius                == Formattable::fromUFormattable(defaultUFormattable.getAlias())));
746859d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__, defaultFormattable);
746959d709d503bab6e2b61931737e662dd293b40578ccornelius  }
747059d709d503bab6e2b61931737e662dd293b40578ccornelius  // test some random Formattables
747159d709d503bab6e2b61931737e662dd293b40578ccornelius  {
747259d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f(ucal_getNow(), Formattable::kIsDate);
747359d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
747459d709d503bab6e2b61931737e662dd293b40578ccornelius  }
747559d709d503bab6e2b61931737e662dd293b40578ccornelius  {
747659d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f((double)1.61803398874989484820); // golden ratio
747759d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
747859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
747959d709d503bab6e2b61931737e662dd293b40578ccornelius  {
748059d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f((int64_t)80994231587905127LL); // weight of the moon, in kilotons http://solarsystem.nasa.gov/planets/profile.cfm?Display=Facts&Object=Moon
748159d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
748259d709d503bab6e2b61931737e662dd293b40578ccornelius  }
748359d709d503bab6e2b61931737e662dd293b40578ccornelius  {
748459d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f((int32_t)4); // random number, source: http://www.xkcd.com/221/
748559d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
748659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
748759d709d503bab6e2b61931737e662dd293b40578ccornelius  {
748859d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f("Hello world."); // should be invariant?
748959d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
749059d709d503bab6e2b61931737e662dd293b40578ccornelius  }
749159d709d503bab6e2b61931737e662dd293b40578ccornelius  {
749259d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status2 = U_ZERO_ERROR;
749359d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f(StringPiece("73476730924573500000000.0"), status2); // weight of the moon, kg
749459d709d503bab6e2b61931737e662dd293b40578ccornelius    assertSuccess("Constructing a StringPiece", status2);
749559d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
749659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
749759d709d503bab6e2b61931737e662dd293b40578ccornelius  {
749859d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status2 = U_ZERO_ERROR;
749959d709d503bab6e2b61931737e662dd293b40578ccornelius    UObject *obj = new Locale();
750059d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable f(obj);
750159d709d503bab6e2b61931737e662dd293b40578ccornelius    assertSuccess("Constructing a Formattable from a default constructed Locale()", status2);
750259d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__,  f);
750359d709d503bab6e2b61931737e662dd293b40578ccornelius  }
750459d709d503bab6e2b61931737e662dd293b40578ccornelius  {
750559d709d503bab6e2b61931737e662dd293b40578ccornelius    const Formattable array[] = {
750659d709d503bab6e2b61931737e662dd293b40578ccornelius      Formattable(ucal_getNow(), Formattable::kIsDate),
750759d709d503bab6e2b61931737e662dd293b40578ccornelius      Formattable((int32_t)4),
750859d709d503bab6e2b61931737e662dd293b40578ccornelius      Formattable((double)1.234),
750959d709d503bab6e2b61931737e662dd293b40578ccornelius    };
751059d709d503bab6e2b61931737e662dd293b40578ccornelius
751159d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable fa(array, 3);
751259d709d503bab6e2b61931737e662dd293b40578ccornelius    testFormattableAsUFormattable(__FILE__, __LINE__, fa);
751359d709d503bab6e2b61931737e662dd293b40578ccornelius  }
751459d709d503bab6e2b61931737e662dd293b40578ccornelius}
751559d709d503bab6e2b61931737e662dd293b40578ccornelius
751659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestSignificantDigits(void) {
751759d709d503bab6e2b61931737e662dd293b40578ccornelius  double input[] = {
751859d709d503bab6e2b61931737e662dd293b40578ccornelius        0, 0,
751959d709d503bab6e2b61931737e662dd293b40578ccornelius        0.1, -0.1,
752059d709d503bab6e2b61931737e662dd293b40578ccornelius        123, -123,
752159d709d503bab6e2b61931737e662dd293b40578ccornelius        12345, -12345,
752259d709d503bab6e2b61931737e662dd293b40578ccornelius        123.45, -123.45,
752359d709d503bab6e2b61931737e662dd293b40578ccornelius        123.44501, -123.44501,
752459d709d503bab6e2b61931737e662dd293b40578ccornelius        0.001234, -0.001234,
752559d709d503bab6e2b61931737e662dd293b40578ccornelius        0.00000000123, -0.00000000123,
752659d709d503bab6e2b61931737e662dd293b40578ccornelius        0.0000000000000000000123, -0.0000000000000000000123,
752759d709d503bab6e2b61931737e662dd293b40578ccornelius        1.2, -1.2,
752859d709d503bab6e2b61931737e662dd293b40578ccornelius        0.0000000012344501, -0.0000000012344501,
752959d709d503bab6e2b61931737e662dd293b40578ccornelius        123445.01, -123445.01,
753059d709d503bab6e2b61931737e662dd293b40578ccornelius        12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0,
753159d709d503bab6e2b61931737e662dd293b40578ccornelius    };
753259d709d503bab6e2b61931737e662dd293b40578ccornelius    const char* expected[] = {
753359d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.00", "0.00",
753459d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.100", "-0.100",
753559d709d503bab6e2b61931737e662dd293b40578ccornelius        "123", "-123",
753659d709d503bab6e2b61931737e662dd293b40578ccornelius        "12345", "-12345",
753759d709d503bab6e2b61931737e662dd293b40578ccornelius        "123.45", "-123.45",
753859d709d503bab6e2b61931737e662dd293b40578ccornelius        "123.45", "-123.45",
753959d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.001234", "-0.001234",
754059d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.00000000123", "-0.00000000123",
754159d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.0000000000000000000123", "-0.0000000000000000000123",
754259d709d503bab6e2b61931737e662dd293b40578ccornelius        "1.20", "-1.20",
754359d709d503bab6e2b61931737e662dd293b40578ccornelius        "0.0000000012345", "-0.0000000012345",
754459d709d503bab6e2b61931737e662dd293b40578ccornelius        "123450", "-123450",
754559d709d503bab6e2b61931737e662dd293b40578ccornelius        "12345000000000000000000000000000000", "-12345000000000000000000000000000000",
754659d709d503bab6e2b61931737e662dd293b40578ccornelius    };
754759d709d503bab6e2b61931737e662dd293b40578ccornelius
754859d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
754959d709d503bab6e2b61931737e662dd293b40578ccornelius    Locale locale("en_US");
755059d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>(
755159d709d503bab6e2b61931737e662dd293b40578ccornelius            NumberFormat::createInstance(locale, status)));
755259d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK_DATA(status,"NumberFormat::createInstance")
755359d709d503bab6e2b61931737e662dd293b40578ccornelius
755459d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setSignificantDigitsUsed(TRUE);
755559d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setMinimumSignificantDigits(3);
755659d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setMaximumSignificantDigits(5);
755759d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setGroupingUsed(false);
755859d709d503bab6e2b61931737e662dd293b40578ccornelius
755959d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString result;
756059d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString expectedResult;
75618de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (unsigned int i = 0; i < UPRV_LENGTHOF(input); ++i) {
756259d709d503bab6e2b61931737e662dd293b40578ccornelius        numberFormat->format(input[i], result);
756359d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString expectedResult(expected[i]);
756459d709d503bab6e2b61931737e662dd293b40578ccornelius        if (result != expectedResult) {
756559d709d503bab6e2b61931737e662dd293b40578ccornelius          errln((UnicodeString)"Expected: '" + expectedResult + "' got '" + result);
756659d709d503bab6e2b61931737e662dd293b40578ccornelius        }
756759d709d503bab6e2b61931737e662dd293b40578ccornelius        result.remove();
756859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
756959d709d503bab6e2b61931737e662dd293b40578ccornelius}
757059d709d503bab6e2b61931737e662dd293b40578ccornelius
757159d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestShowZero() {
757259d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
757359d709d503bab6e2b61931737e662dd293b40578ccornelius    Locale locale("en_US");
757459d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>(
757559d709d503bab6e2b61931737e662dd293b40578ccornelius            NumberFormat::createInstance(locale, status)));
757659d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK_DATA(status, "NumberFormat::createInstance")
757759d709d503bab6e2b61931737e662dd293b40578ccornelius
757859d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setSignificantDigitsUsed(TRUE);
757959d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setMaximumSignificantDigits(3);
758059d709d503bab6e2b61931737e662dd293b40578ccornelius
758159d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString result;
758259d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->format(0.0, result);
758359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (result != "0") {
758459d709d503bab6e2b61931737e662dd293b40578ccornelius        errln((UnicodeString)"Expected: 0, got " + result);
758559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
758659d709d503bab6e2b61931737e662dd293b40578ccornelius}
758759d709d503bab6e2b61931737e662dd293b40578ccornelius
758859d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestBug9936() {
758959d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
759059d709d503bab6e2b61931737e662dd293b40578ccornelius    Locale locale("en_US");
759159d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>(
759259d709d503bab6e2b61931737e662dd293b40578ccornelius            NumberFormat::createInstance(locale, status)));
759359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(status)) {
759459d709d503bab6e2b61931737e662dd293b40578ccornelius        dataerrln("File %s, Line %d: status = %s.\n", __FILE__, __LINE__, u_errorName(status));
759559d709d503bab6e2b61931737e662dd293b40578ccornelius        return;
759659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
759759d709d503bab6e2b61931737e662dd293b40578ccornelius
759859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (numberFormat->areSignificantDigitsUsed() == TRUE) {
759959d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("File %s, Line %d: areSignificantDigitsUsed() was TRUE, expected FALSE.\n", __FILE__, __LINE__);
760059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
760159d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setSignificantDigitsUsed(TRUE);
760259d709d503bab6e2b61931737e662dd293b40578ccornelius    if (numberFormat->areSignificantDigitsUsed() == FALSE) {
760359d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__);
760459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
760559d709d503bab6e2b61931737e662dd293b40578ccornelius
760659d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setSignificantDigitsUsed(FALSE);
760759d709d503bab6e2b61931737e662dd293b40578ccornelius    if (numberFormat->areSignificantDigitsUsed() == TRUE) {
760859d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("File %s, Line %d: areSignificantDigitsUsed() was TRUE, expected FALSE.\n", __FILE__, __LINE__);
760959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
761059d709d503bab6e2b61931737e662dd293b40578ccornelius
761159d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setMinimumSignificantDigits(3);
761259d709d503bab6e2b61931737e662dd293b40578ccornelius    if (numberFormat->areSignificantDigitsUsed() == FALSE) {
761359d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__);
761459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
761559d709d503bab6e2b61931737e662dd293b40578ccornelius
761659d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setSignificantDigitsUsed(FALSE);
761759d709d503bab6e2b61931737e662dd293b40578ccornelius    numberFormat->setMaximumSignificantDigits(6);
761859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (numberFormat->areSignificantDigitsUsed() == FALSE) {
761959d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__);
762059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
762159d709d503bab6e2b61931737e662dd293b40578ccornelius
762259d709d503bab6e2b61931737e662dd293b40578ccornelius}
762359d709d503bab6e2b61931737e662dd293b40578ccornelius
762459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestParseNegativeWithFaLocale() {
762559d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
762659d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("fa", status);
762759d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK_DATA(status, "NumberFormat::createInstance")
762859d709d503bab6e2b61931737e662dd293b40578ccornelius    test->setLenient(TRUE);
762959d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable af;
763059d709d503bab6e2b61931737e662dd293b40578ccornelius    ParsePosition ppos;
763159d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString value("\\u200e-0,5");
763259d709d503bab6e2b61931737e662dd293b40578ccornelius    value = value.unescape();
763359d709d503bab6e2b61931737e662dd293b40578ccornelius    test->parse(value, af, ppos);
763459d709d503bab6e2b61931737e662dd293b40578ccornelius    if (ppos.getIndex() == 0) {
763559d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("Expected -0,5 to parse for Farsi.");
763659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
763759d709d503bab6e2b61931737e662dd293b40578ccornelius    delete test;
763859d709d503bab6e2b61931737e662dd293b40578ccornelius}
763959d709d503bab6e2b61931737e662dd293b40578ccornelius
764059d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestParseNegativeWithAlternateMinusSign() {
764159d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
764259d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("en", status);
764359d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK_DATA(status, "NumberFormat::createInstance")
764459d709d503bab6e2b61931737e662dd293b40578ccornelius    test->setLenient(TRUE);
764559d709d503bab6e2b61931737e662dd293b40578ccornelius    Formattable af;
764659d709d503bab6e2b61931737e662dd293b40578ccornelius    ParsePosition ppos;
764759d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString value("\\u208B0.5");
764859d709d503bab6e2b61931737e662dd293b40578ccornelius    value = value.unescape();
764959d709d503bab6e2b61931737e662dd293b40578ccornelius    test->parse(value, af, ppos);
765059d709d503bab6e2b61931737e662dd293b40578ccornelius    if (ppos.getIndex() == 0) {
765159d709d503bab6e2b61931737e662dd293b40578ccornelius        errln(UnicodeString("Expected ") + value + UnicodeString(" to parse."));
765259d709d503bab6e2b61931737e662dd293b40578ccornelius    }
765359d709d503bab6e2b61931737e662dd293b40578ccornelius    delete test;
765459d709d503bab6e2b61931737e662dd293b40578ccornelius}
765559d709d503bab6e2b61931737e662dd293b40578ccornelius
765659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestCustomCurrencySignAndSeparator() {
765759d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
765859d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormatSymbols custom(Locale::getUS(), status);
765959d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK(status, "DecimalFormatSymbols constructor");
766059d709d503bab6e2b61931737e662dd293b40578ccornelius
766159d709d503bab6e2b61931737e662dd293b40578ccornelius    custom.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "*");
766259d709d503bab6e2b61931737e662dd293b40578ccornelius    custom.setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, "^");
766359d709d503bab6e2b61931737e662dd293b40578ccornelius    custom.setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, ":");
766459d709d503bab6e2b61931737e662dd293b40578ccornelius
766559d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString pat(" #,##0.00");
766659d709d503bab6e2b61931737e662dd293b40578ccornelius    pat.insert(0, (UChar)0x00A4);
766759d709d503bab6e2b61931737e662dd293b40578ccornelius
766859d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormat fmt(pat, custom, status);
766959d709d503bab6e2b61931737e662dd293b40578ccornelius    CHECK(status, "DecimalFormat constructor");
767059d709d503bab6e2b61931737e662dd293b40578ccornelius
767159d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString numstr("* 1^234:56");
767259d709d503bab6e2b61931737e662dd293b40578ccornelius    expect2(fmt, (Formattable)((double)1234.56), numstr);
767359d709d503bab6e2b61931737e662dd293b40578ccornelius}
767459d709d503bab6e2b61931737e662dd293b40578ccornelius
767559d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef struct {
767659d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *   locale;
767759d709d503bab6e2b61931737e662dd293b40578ccornelius    UBool          lenient;
767859d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString  numString;
767959d709d503bab6e2b61931737e662dd293b40578ccornelius    double         value;
768059d709d503bab6e2b61931737e662dd293b40578ccornelius} SignsAndMarksItem;
768159d709d503bab6e2b61931737e662dd293b40578ccornelius
768259d709d503bab6e2b61931737e662dd293b40578ccornelius
768359d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatTest::TestParseSignsAndMarks() {
768459d709d503bab6e2b61931737e662dd293b40578ccornelius    const SignsAndMarksItem items[] = {
768559d709d503bab6e2b61931737e662dd293b40578ccornelius        // locale               lenient numString                                                       value
768659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 FALSE,  CharsToUnicodeString("12"),                                      12 },
768759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 TRUE,   CharsToUnicodeString("12"),                                      12 },
768859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 FALSE,  CharsToUnicodeString("-23"),                                    -23 },
768959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 TRUE,   CharsToUnicodeString("-23"),                                    -23 },
769059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 TRUE,   CharsToUnicodeString("- 23"),                                   -23 },
769159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 FALSE,  CharsToUnicodeString("\\u200E-23"),                             -23 },
769259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 TRUE,   CharsToUnicodeString("\\u200E-23"),                             -23 },
769359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en",                 TRUE,   CharsToUnicodeString("\\u200E- 23"),                            -23 },
769459d709d503bab6e2b61931737e662dd293b40578ccornelius
769559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    FALSE,  CharsToUnicodeString("\\u0663\\u0664"),                          34 },
769659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    TRUE,   CharsToUnicodeString("\\u0663\\u0664"),                          34 },
769759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    FALSE,  CharsToUnicodeString("-\\u0664\\u0665"),                        -45 },
769859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    TRUE,   CharsToUnicodeString("-\\u0664\\u0665"),                        -45 },
769959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    TRUE,   CharsToUnicodeString("- \\u0664\\u0665"),                       -45 },
770059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    FALSE,  CharsToUnicodeString("\\u200F-\\u0664\\u0665"),                 -45 },
770159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    TRUE,   CharsToUnicodeString("\\u200F-\\u0664\\u0665"),                 -45 },
770259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arab",    TRUE,   CharsToUnicodeString("\\u200F- \\u0664\\u0665"),                -45 },
770359d709d503bab6e2b61931737e662dd293b40578ccornelius
770459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", FALSE,  CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
770559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", TRUE,   CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
770659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", FALSE,  CharsToUnicodeString("-\\u06F6\\u06F7"),                        -67 },
770759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", TRUE,   CharsToUnicodeString("-\\u06F6\\u06F7"),                        -67 },
770859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", TRUE,   CharsToUnicodeString("- \\u06F6\\u06F7"),                       -67 },
770959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", FALSE,  CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
771059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", TRUE,   CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
771159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "en@numbers=arabext", TRUE,   CharsToUnicodeString("\\u200E-\\u200E \\u06F6\\u06F7"),         -67 },
771259d709d503bab6e2b61931737e662dd293b40578ccornelius
771359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 FALSE,  CharsToUnicodeString("12"),                                      12 },
771459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 TRUE,   CharsToUnicodeString("12"),                                      12 },
771559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 FALSE,  CharsToUnicodeString("-23"),                                    -23 },
771659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 TRUE,   CharsToUnicodeString("-23"),                                    -23 },
771759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 TRUE,   CharsToUnicodeString("- 23"),                                   -23 },
771859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 FALSE,  CharsToUnicodeString("\\u200E-23"),                             -23 },
771959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 TRUE,   CharsToUnicodeString("\\u200E-23"),                             -23 },
772059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "he",                 TRUE,   CharsToUnicodeString("\\u200E- 23"),                            -23 },
772159d709d503bab6e2b61931737e662dd293b40578ccornelius
772259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 FALSE,  CharsToUnicodeString("\\u0663\\u0664"),                          34 },
772359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 TRUE,   CharsToUnicodeString("\\u0663\\u0664"),                          34 },
772459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 FALSE,  CharsToUnicodeString("-\\u0664\\u0665"),                        -45 },
772559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 TRUE,   CharsToUnicodeString("-\\u0664\\u0665"),                        -45 },
772659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 TRUE,   CharsToUnicodeString("- \\u0664\\u0665"),                       -45 },
772759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 FALSE,  CharsToUnicodeString("\\u200F-\\u0664\\u0665"),                 -45 },
772859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 TRUE,   CharsToUnicodeString("\\u200F-\\u0664\\u0665"),                 -45 },
772959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar",                 TRUE,   CharsToUnicodeString("\\u200F- \\u0664\\u0665"),                -45 },
773059d709d503bab6e2b61931737e662dd293b40578ccornelius
773159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              FALSE,  CharsToUnicodeString("12"),                                      12 },
773259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              TRUE,   CharsToUnicodeString("12"),                                      12 },
773359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              FALSE,  CharsToUnicodeString("-23"),                                    -23 },
773459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              TRUE,   CharsToUnicodeString("-23"),                                    -23 },
773559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              TRUE,   CharsToUnicodeString("- 23"),                                   -23 },
773659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              FALSE,  CharsToUnicodeString("\\u200E-23"),                             -23 },
773759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              TRUE,   CharsToUnicodeString("\\u200E-23"),                             -23 },
773859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ar_MA",              TRUE,   CharsToUnicodeString("\\u200E- 23"),                            -23 },
773959d709d503bab6e2b61931737e662dd293b40578ccornelius
774059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 FALSE,  CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
774159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 TRUE,   CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
774259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 FALSE,  CharsToUnicodeString("\\u2212\\u06F6\\u06F7"),                  -67 },
774359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 TRUE,   CharsToUnicodeString("\\u2212\\u06F6\\u06F7"),                  -67 },
774459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 TRUE,   CharsToUnicodeString("\\u2212 \\u06F6\\u06F7"),                 -67 },
774559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 FALSE,  CharsToUnicodeString("\\u200E\\u2212\\u200E\\u06F6\\u06F7"),    -67 },
774659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 TRUE,   CharsToUnicodeString("\\u200E\\u2212\\u200E\\u06F6\\u06F7"),    -67 },
774759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "fa",                 TRUE,   CharsToUnicodeString("\\u200E\\u2212\\u200E \\u06F6\\u06F7"),   -67 },
774859d709d503bab6e2b61931737e662dd293b40578ccornelius
774959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 FALSE,  CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
775059d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("\\u06F5\\u06F6"),                          56 },
775159d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 FALSE,  CharsToUnicodeString("-\\u06F6\\u06F7"),                        -67 },
775259d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("-\\u06F6\\u06F7"),                        -67 },
775359d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("- \\u06F6\\u06F7"),                       -67 },
775459d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 FALSE,  CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
775559d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
775659d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("\\u200E-\\u200E \\u06F6\\u06F7"),         -67 },
775759d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 FALSE,  CharsToUnicodeString("-\\u200E\\u06F6\\u06F7"),                 -67 },
775859d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("-\\u200E\\u06F6\\u06F7"),                 -67 },
775959d709d503bab6e2b61931737e662dd293b40578ccornelius        { "ps",                 TRUE,   CharsToUnicodeString("-\\u200E \\u06F6\\u06F7"),                -67 },
776059d709d503bab6e2b61931737e662dd293b40578ccornelius        // terminator
776159d709d503bab6e2b61931737e662dd293b40578ccornelius        { NULL,                 0,      UnicodeString(""),                                                0 },
776259d709d503bab6e2b61931737e662dd293b40578ccornelius    };
776359d709d503bab6e2b61931737e662dd293b40578ccornelius
776459d709d503bab6e2b61931737e662dd293b40578ccornelius    const SignsAndMarksItem * itemPtr;
776559d709d503bab6e2b61931737e662dd293b40578ccornelius    for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) {
776659d709d503bab6e2b61931737e662dd293b40578ccornelius        UErrorCode status = U_ZERO_ERROR;
776759d709d503bab6e2b61931737e662dd293b40578ccornelius        NumberFormat *numfmt = NumberFormat::createInstance(Locale(itemPtr->locale), status);
776859d709d503bab6e2b61931737e662dd293b40578ccornelius        if (U_SUCCESS(status)) {
776959d709d503bab6e2b61931737e662dd293b40578ccornelius            numfmt->setLenient(itemPtr->lenient);
777059d709d503bab6e2b61931737e662dd293b40578ccornelius            Formattable fmtobj;
777159d709d503bab6e2b61931737e662dd293b40578ccornelius            ParsePosition ppos;
777259d709d503bab6e2b61931737e662dd293b40578ccornelius            numfmt->parse(itemPtr->numString, fmtobj, ppos);
777359d709d503bab6e2b61931737e662dd293b40578ccornelius            if (ppos.getIndex() == itemPtr->numString.length()) {
777459d709d503bab6e2b61931737e662dd293b40578ccornelius                double parsedValue = fmtobj.getDouble(status);
777559d709d503bab6e2b61931737e662dd293b40578ccornelius                if (U_FAILURE(status) || parsedValue != itemPtr->value) {
777659d709d503bab6e2b61931737e662dd293b40578ccornelius                    errln((UnicodeString)"FAIL: locale " + itemPtr->locale + ", lenient " + itemPtr->lenient + ", parse of \"" + itemPtr->numString + "\" gives value " + parsedValue);
777759d709d503bab6e2b61931737e662dd293b40578ccornelius                }
777859d709d503bab6e2b61931737e662dd293b40578ccornelius            } else {
777959d709d503bab6e2b61931737e662dd293b40578ccornelius                errln((UnicodeString)"FAIL: locale " + itemPtr->locale + ", lenient " + itemPtr->lenient + ", parse of \"" + itemPtr->numString + "\" gives position " + ppos.getIndex());
778059d709d503bab6e2b61931737e662dd293b40578ccornelius            }
778159d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
778259d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln("FAIL: NumberFormat::createInstance for locale % gives error %s", itemPtr->locale, u_errorName(status));
778359d709d503bab6e2b61931737e662dd293b40578ccornelius        }
778459d709d503bab6e2b61931737e662dd293b40578ccornelius        delete numfmt;
778559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
778659d709d503bab6e2b61931737e662dd293b40578ccornelius}
778759d709d503bab6e2b61931737e662dd293b40578ccornelius
7788fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliustypedef struct {
7789fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  DecimalFormat::ERoundingMode mode;
7790fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  double value;
7791fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  UnicodeString expected;
7792fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} Test10419Data;
7793fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7794fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7795fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// Tests that rounding works right when fractional digits is set to 0.
7796fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::Test10419RoundingWith0FractionDigits() {
7797fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const Test10419Data items[] = {
7798fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundCeiling, 1.488,  "2"},
7799fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundDown, 1.588,  "1"},
7800fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundFloor, 1.888,  "1"},
7801fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundHalfDown, 1.5,  "1"},
7802fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundHalfEven, 2.5,  "2"},
7803fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundHalfUp, 2.5,  "3"},
7804fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { DecimalFormat::kRoundUp, 1.5,  "2"},
7805fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    };
7806fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
7807fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createInstance(Locale("en_US"), status));
7808fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
7809fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        dataerrln("Failure creating DecimalFormat %s", u_errorName(status));
7810fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
7811fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
78128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (int32_t i = 0; i < UPRV_LENGTHOF(items); ++i) {
7813fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        decfmt->setRoundingMode(items[i].mode);
7814fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        decfmt->setMaximumFractionDigits(0);
7815fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UnicodeString actual;
7816fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (items[i].expected != decfmt->format(items[i].value, actual)) {
7817fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            errln("Expected " + items[i].expected + ", got " + actual);
7818fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
7819fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7820fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
7821fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7822fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::Test10468ApplyPattern() {
7823fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Padding char of fmt is now 'a'
7824fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
7825fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat fmt("'I''ll'*a###.##", status);
7826fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7827fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
7828fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errcheckln(status, "DecimalFormat constructor failed - %s", u_errorName(status));
7829fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
7830fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7831fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7832fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (fmt.getPadCharacterString() != UnicodeString("a")) {
7833fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Padding character should be 'a'.");
7834fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
7835fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7836fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7837fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Padding char of fmt ought to be '*' since that is the default and no
7838fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // explicit padding char is specified in the new pattern.
7839fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fmt.applyPattern("AA#,##0.00ZZ", status);
7840fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7841fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Oops this still prints 'a' even though we changed the pattern.
7842c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (fmt.getPadCharacterString() != UnicodeString(" ")) {
7843fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("applyPattern did not clear padding character.");
7844fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7845fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
7846fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7847fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::TestRoundingScientific10542() {
7848fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
7849fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat format("0.00E0", status);
7850fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
7851fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errcheckln(status, "DecimalFormat constructor failed - %s", u_errorName(status));
7852fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
7853fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7854fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7855fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat::ERoundingMode roundingModes[] = {
7856fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundCeiling,
7857fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundDown,
7858fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundFloor,
7859fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundHalfDown,
7860fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundHalfEven,
7861fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundHalfUp,
7862fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            DecimalFormat::kRoundUp};
7863fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char *descriptions[] = {
7864fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round Ceiling",
7865fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round Down",
7866fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round Floor",
7867fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round half down",
7868fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round half even",
7869fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round half up",
7870fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            "Round up"};
7871fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7872fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7873fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {-0.003006, -0.003005, -0.003004, 0.003014, 0.003015, 0.003016};
7874fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7875fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7876fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.00E-3", "-3.00E-3", "-3.00E-3", "3.02E-3", "3.02E-3", "3.02E-3",
7877fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.00E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.01E-3",
7878fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E-3", "-3.01E-3", "-3.01E-3", "3.01E-3", "3.01E-3", "3.01E-3",
7879fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.02E-3",
7880fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3",
7881fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E-3", "-3.01E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3",
7882fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E-3", "-3.01E-3", "-3.01E-3", "3.02E-3", "3.02E-3", "3.02E-3"};
7883fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7884fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7885fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7886fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7887fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7888fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
78898de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
78908de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7891fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7892fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7893fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {-3006.0, -3005, -3004, 3014, 3015, 3016};
7894fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7895fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7896fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.00E3", "-3.00E3", "-3.00E3", "3.02E3", "3.02E3", "3.02E3",
7897fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.00E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.01E3",
7898fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E3", "-3.01E3", "-3.01E3", "3.01E3", "3.01E3", "3.01E3",
7899fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.02E3",
7900fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3",
7901fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E3", "-3.01E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3",
7902fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-3.01E3", "-3.01E3", "-3.01E3", "3.02E3", "3.02E3", "3.02E3"};
7903fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7904fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7905fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7906fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7907fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7908fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
79098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
79108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7911fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7912fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/* Commented out for now until we decide how rounding to zero should work, +0 vs. -0
7913fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7914fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {0.0, -0.0};
7915fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7916fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7917fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7918fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7919fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7920fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7921fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7922fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0",
7923fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "0.00E0", "-0.00E0"};
7924fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7925fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7926fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7927fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7928fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7929fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
79308de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
79318de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7932fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
7933fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*/
7934fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7935fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
7936fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {1e25, 1e25 + 1e15, 1e25 - 1e15};
7937fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7938fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7939fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.01E25", "1.00E25",
7940fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.00E25", "9.99E24",
7941fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.00E25", "9.99E24",
7942fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.00E25", "1.00E25",
7943fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.00E25", "1.00E25",
7944fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.00E25", "1.00E25",
7945fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E25", "1.01E25", "1.00E25"};
7946fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7947fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7948fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7949fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7950fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7951fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
79528de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
79538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7954fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
7955fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7956fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {-1e25, -1e25 + 1e15, -1e25 - 1e15};
7957fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7958fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7959fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-9.99E24", "-1.00E25",
7960fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-9.99E24", "-1.00E25",
7961fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-1.00E25", "-1.01E25",
7962fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-1.00E25", "-1.00E25",
7963fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-1.00E25", "-1.00E25",
7964fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-1.00E25", "-1.00E25",
7965fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E25", "-1.00E25", "-1.01E25"};
7966fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7967fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7968fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7969fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7970fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7971fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
79728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
79738de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7974fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
7975fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7976fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {1e-25, 1e-25 + 1e-35, 1e-25 - 1e-35};
7977fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7978fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7979fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.01E-25", "1.00E-25",
7980fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.00E-25", "9.99E-26",
7981fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.00E-25", "9.99E-26",
7982fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.00E-25", "1.00E-25",
7983fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.00E-25", "1.00E-25",
7984fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.00E-25", "1.00E-25",
7985fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "1.00E-25", "1.01E-25", "1.00E-25"};
7986fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
7987fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
7988fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
7989fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
7990fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
7991fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
79928de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
79938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
7994fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
7995fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {
7996fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        double values[] = {-1e-25, -1e-25 + 1e-35, -1e-25 - 1e-35};
7997fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // The order of these expected values correspond to the order of roundingModes and the order of values.
7998fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char *expected[] = {
7999fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-9.99E-26", "-1.00E-25",
8000fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-9.99E-26", "-1.00E-25",
8001fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-1.00E-25", "-1.01E-25",
8002fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-1.00E-25", "-1.00E-25",
8003fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-1.00E-25", "-1.00E-25",
8004fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-1.00E-25", "-1.00E-25",
8005fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "-1.00E-25", "-1.00E-25", "-1.01E-25"};
8006fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        verifyRounding(
8007fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                format,
8008fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                values,
8009fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                expected,
8010fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                roundingModes,
8011fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                descriptions,
80128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(values),
80138de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                UPRV_LENGTHOF(roundingModes));
8014fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8015fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
8016fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8017fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::TestZeroScientific10547() {
8018fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
8019fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat fmt("0.00E0", status);
8020fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (!assertSuccess("Formt creation", status)) {
8021fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
8022fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8023fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString out;
8024fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fmt.format(-0.0, out);
8025fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    assertEquals("format", "-0.00E0", out);
8026fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
8027fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8028fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::verifyRounding(
8029fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        DecimalFormat& format,
8030fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const double *values,
8031fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char * const *expected,
8032fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const DecimalFormat::ERoundingMode *roundingModes,
8033fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        const char * const *descriptions,
8034fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t valueSize,
8035fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t roundingModeSize) {
8036fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (int32_t i = 0; i < roundingModeSize; ++i) {
8037fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        format.setRoundingMode(roundingModes[i]);
8038fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        for (int32_t j = 0; j < valueSize; j++) {
8039fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UnicodeString currentExpected(expected[i * valueSize + j]);
8040fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            currentExpected = currentExpected.unescape();
8041fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UnicodeString actual;
8042fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            format.format(values[j], actual);
8043fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if (currentExpected != actual) {
8044fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                char buffer[256];
8045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                sprintf(
8046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        buffer,
8047fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        "For %s value %f, expected ",
8048fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        descriptions[i],
8049fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        values[j]);
8050fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                errln(UnicodeString(buffer) + currentExpected + ", got " + actual);
8051fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            }
8052fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
8053fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8054fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
8055fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8056fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::TestAccountingCurrency() {
8057fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
8058fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UNumberFormatStyle style = UNUM_CURRENCY_ACCOUNTING;
8059fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8060fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("en_US", style, status),
806164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)1234.5, "$1,234.50", TRUE, status);
8062fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("en_US", style, status),
806364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)-1234.5, "($1,234.50)", TRUE, status);
8064fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("en_US", style, status),
806564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)0, "$0.00", TRUE, status);
8066fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("en_US", style, status),
806764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)-0.2, "($0.20)", TRUE, status);
8068fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("ja_JP", style, status),
806964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)10000, UnicodeString("\\uFFE510,000").unescape(), TRUE, status);
8070fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("ja_JP", style, status),
807164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)-1000.5, UnicodeString("(\\uFFE51,000)").unescape(), FALSE, status);
8072fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    expect(NumberFormat::createInstance("de_DE", style, status),
807364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        (Formattable)(double)-23456.7, UnicodeString("-23.456,70\\u00A0\\u20AC").unescape(), TRUE, status);
8074fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
8075fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8076fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// for #5186
8077fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid NumberFormatTest::TestEquality() {
8078fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
8079fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormatSymbols* symbols = new DecimalFormatSymbols(Locale("root"), status);
8080fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
8081fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    	dataerrln("Fail: can't create DecimalFormatSymbols for root");
8082fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    	return;
8083fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8084fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString pattern("#,##0.###");
8085fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat* fmtBase = new DecimalFormat(pattern, symbols, status);
8086fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
8087fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    	dataerrln("Fail: can't create DecimalFormat using root symbols");
8088fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    	return;
8089fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8090fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8091fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    DecimalFormat* fmtClone = (DecimalFormat*)fmtBase->clone();
8092fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fmtClone->setFormatWidth(fmtBase->getFormatWidth() + 32);
8093fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (*fmtClone == *fmtBase) {
8094fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: DecimalFormat == does not distinguish objects that differ only in FormatWidth");
8095fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
8096fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete fmtClone;
8097fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8098fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete fmtBase;
8099fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
8100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid NumberFormatTest::TestCurrencyUsage() {
8102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    double agent = 123.567;
8103f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8104f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UErrorCode status;
8105f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    DecimalFormat *fmt;
8106f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8107f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // compare the Currency and Currency Cash Digits
8108f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // Note that as of CLDR 26:
8109f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that
81108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // * CAD rounds to .05 in cash mode only
8111f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // 1st time for getter/setter, 2nd time for factory method
8112f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    Locale enUS_PKR("en_US@currency=PKR");
8113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8114f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for(int i=0; i<2; i++){
8115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        status = U_ZERO_ERROR;
8116f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(i == 0){
8117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_PKR, UNUM_CURRENCY, status);
8118f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=PKR/CURRENCY", status, TRUE) == FALSE) {
8119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8121f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            UnicodeString original;
8123f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt->format(agent,original);
8124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            assertEquals("Test Currency Usage 1", UnicodeString("PKR124"), original);
8125f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8126f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            // test the getter here
8127f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            UCurrencyUsage curUsage = fmt->getCurrencyUsage();
812864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert            assertEquals("Test usage getter - standard", (int32_t)curUsage, (int32_t)UCURR_USAGE_STANDARD);
8129f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8130f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status);
8131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }else{
8132f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_PKR, UNUM_CASH_CURRENCY, status);
8133f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=PKR/CASH", status, TRUE) == FALSE) {
8134f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8135f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8136f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
8137f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8138f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        // must be usage = cash
8139f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UCurrencyUsage curUsage = fmt->getCurrencyUsage();
814064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        assertEquals("Test usage getter - cash", (int32_t)curUsage, (int32_t)UCURR_USAGE_CASH);
8141f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8142f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString cash_currency;
8143f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fmt->format(agent,cash_currency);
8144f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        assertEquals("Test Currency Usage 2", UnicodeString("PKR124"), cash_currency);
8145f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        delete fmt;
8146f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
8147f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8148f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // compare the Currency and Currency Cash Rounding
8149f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // 1st time for getter/setter, 2nd time for factory method
8150f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    Locale enUS_CAD("en_US@currency=CAD");
8151f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for(int i=0; i<2; i++){
8152f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        status = U_ZERO_ERROR;
8153f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(i == 0){
8154f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CURRENCY, status);
8155f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=CAD/CURRENCY", status, TRUE) == FALSE) {
8156f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8157f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8158f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8159f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            UnicodeString original_rounding;
8160f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt->format(agent, original_rounding);
8161f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            assertEquals("Test Currency Usage 3", UnicodeString("CA$123.57"), original_rounding);
8162f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status);
8163f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }else{
8164f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status);
8165f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=CAD/CASH", status, TRUE) == FALSE) {
8166f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8167f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8168f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
8169f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8170f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString cash_rounding_currency;
8171f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fmt->format(agent, cash_rounding_currency);
81728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        assertEquals("Test Currency Usage 4", UnicodeString("CA$123.55"), cash_rounding_currency);
8173f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        delete fmt;
8174f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
8175f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8176f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // Test the currency change
8177f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // 1st time for getter/setter, 2nd time for factory method
8178f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const UChar CUR_PKR[] = {0x50, 0x4B, 0x52, 0};
8179f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for(int i=0; i<2; i++){
8180f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        status = U_ZERO_ERROR;
8181f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(i == 0){
8182f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CURRENCY, status);
8183f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=CAD/CURRENCY", status, TRUE) == FALSE) {
8184f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8185f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8186f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status);
8187f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }else{
8188f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status);
8189f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (assertSuccess("en_US@currency=CAD/CASH", status, TRUE) == FALSE) {
8190f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                continue;
8191f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
8192f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
8193f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8194f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString cur_original;
81958de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        fmt->setCurrencyUsage(UCURR_USAGE_STANDARD, &status);
8196f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fmt->format(agent, cur_original);
8197f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        assertEquals("Test Currency Usage 5", UnicodeString("CA$123.57"), cur_original);
8198f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8199f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fmt->setCurrency(CUR_PKR, status);
8200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        assertSuccess("Set currency to PKR", status);
8201f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
8202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString PKR_changed;
8203f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fmt->format(agent, PKR_changed);
8204f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        assertEquals("Test Currency Usage 6", UnicodeString("PKR124"), PKR_changed);
8205f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        delete fmt;
8206f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
8207f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
82081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
8209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestNumberFormatTestTuple() {
8210c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    NumberFormatTestTuple tuple;
8211c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8212c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8213c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.setField(
8214c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTestTuple::getFieldByName("locale"),
8215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "en",
8216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
8217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.setField(
8218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTestTuple::getFieldByName("pattern"),
8219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "#,##0.00",
8220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
8221c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.setField(
8222c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTestTuple::getFieldByName("minIntegerDigits"),
8223c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "-10",
8224c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
8225c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8226c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8227c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8228c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8229c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // only what we set should be set.
8230c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "en", tuple.locale.getName());
8231c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "#,##0.00", tuple.pattern);
8232c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", -10, tuple.minIntegerDigits);
8233c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertTrue("", tuple.localeFlag);
8234c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertTrue("", tuple.patternFlag);
8235c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertTrue("", tuple.minIntegerDigitsFlag);
8236c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertFalse("", tuple.formatFlag);
8237c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8238c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString appendTo;
8239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals(
8240c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "",
8241c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "{locale: en, pattern: #,##0.00, minIntegerDigits: -10}",
8242c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            tuple.toString(appendTo));
8243c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8244c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.clear();
8245c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    appendTo.remove();
8246c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals(
8247c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "",
8248c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "{}",
8249c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            tuple.toString(appendTo));
8250c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.setField(
8251c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTestTuple::getFieldByName("aBadFieldName"),
8252c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "someValue",
8253c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
8254c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
8255c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("Expected U_ILLEGAL_ARGUMENT_ERROR");
8256c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8257c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    status = U_ZERO_ERROR;
8258c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    tuple.setField(
8259c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTestTuple::getFieldByName("minIntegerDigits"),
8260c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "someBadValue",
8261c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            status);
8262c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
8263c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("Expected U_ILLEGAL_ARGUMENT_ERROR");
8264c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8265c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8266c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid
8268c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertNumberFormatTest::TestDataDriven() {
8269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    NumberFormatTestDataDriven dd;
8270c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    dd.setCaller(this);
8271c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    dd.run("numberformattestspecification.txt", FALSE);
8272c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8273c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
82741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
82751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// Check the constant MAX_INT64_IN_DOUBLE.
82761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// The value should convert to a double with no loss of precision.
82771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// A failure may indicate a platform with a different double format, requiring
82781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// a revision to the constant.
82791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//
82801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// Note that this is actually hard to test, because the language standard gives
82811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  compilers considerable flexibility to do unexpected things with rounding and
82821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  with overflow in simple int to/from float conversions. Some compilers will completely optimize
82831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  away a simple round-trip conversion from int64_t -> double -> int64_t.
82841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
82851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid NumberFormatTest::TestDoubleLimit11439() {
82861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    char  buf[50];
82871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for (int64_t num = MAX_INT64_IN_DOUBLE-10; num<=MAX_INT64_IN_DOUBLE; num++) {
82881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        sprintf(buf, "%lld", (long long)num);
82891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        double fNum = 0.0;
82901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        sscanf(buf, "%lf", &fNum);
82911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int64_t rtNum = fNum;
82921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (num != rtNum) {
82931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum);
82941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            return;
82951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
82961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
82971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for (int64_t num = -MAX_INT64_IN_DOUBLE+10; num>=-MAX_INT64_IN_DOUBLE; num--) {
82981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        sprintf(buf, "%lld", (long long)num);
82991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        double fNum = 0.0;
83001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        sscanf(buf, "%lf", &fNum);
83011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int64_t rtNum = fNum;
83021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (num != rtNum) {
83031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum);
83041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            return;
83051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
83061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
83071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
83081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
83091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid NumberFormatTest::TestFastPathConsistent11524() {
83101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
83111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    NumberFormat *fmt = NumberFormat::createInstance("en", status);
83121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (U_FAILURE(status) || fmt == NULL) {
83131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        dataerrln("Failed call to NumberFormat::createInstance() - %s", u_errorName(status));
83141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return;
83151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
83161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    fmt->setMaximumIntegerDigits(INT32_MIN);
83171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UnicodeString appendTo;
831864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    assertEquals("", "0", fmt->format((int32_t)123, appendTo));
83191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    appendTo.remove();
832064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    assertEquals("", "0", fmt->format((int32_t)12345, appendTo));
83211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    delete fmt;
83221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
83231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
8324c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestGetAffixes() {
8325c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8326c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols sym("en_US", status);
8327c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00 %\\u00a4\\u00a4");
8328c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    pattern = pattern.unescape();
8329c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt(pattern, sym, status);
8330c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
8331c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
8332c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8333c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8334c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString affixStr;
8335c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "US dollars ", fmt.getPositivePrefix(affixStr));
8336c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", " %USD", fmt.getPositiveSuffix(affixStr));
8337c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "-US dollars ", fmt.getNegativePrefix(affixStr));
8338c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", " %USD", fmt.getNegativeSuffix(affixStr));
8339c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8340c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // Test equality with affixes. set affix methods can't capture special
8341c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // characters which is why equality should fail.
8342c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8343c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmtCopy(fmt);
8344c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt == fmtCopy);
8345c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString someAffix;
8346c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtCopy.setPositivePrefix(fmtCopy.getPositivePrefix(someAffix));
8347c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt != fmtCopy);
8348c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8349c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8350c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmtCopy(fmt);
8351c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt == fmtCopy);
8352c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString someAffix;
8353c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtCopy.setPositiveSuffix(fmtCopy.getPositiveSuffix(someAffix));
8354c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt != fmtCopy);
8355c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8356c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8357c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmtCopy(fmt);
8358c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt == fmtCopy);
8359c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString someAffix;
8360c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtCopy.setNegativePrefix(fmtCopy.getNegativePrefix(someAffix));
8361c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt != fmtCopy);
8362c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8364c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmtCopy(fmt);
8365c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt == fmtCopy);
8366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString someAffix;
8367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmtCopy.setNegativeSuffix(fmtCopy.getNegativeSuffix(someAffix));
8368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertTrue("", fmt != fmtCopy);
8369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setPositivePrefix("Don't");
8371c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setPositiveSuffix("do");
8372c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString someAffix("be''eet\\u00a4\\u00a4\\u00a4 it.");
8373c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    someAffix = someAffix.unescape();
8374c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setNegativePrefix(someAffix);
8375c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setNegativeSuffix("%");
8376c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "Don't", fmt.getPositivePrefix(affixStr));
8377c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "do", fmt.getPositiveSuffix(affixStr));
8378c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", someAffix, fmt.getNegativePrefix(affixStr));
8379c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "%", fmt.getNegativeSuffix(affixStr));
8380c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8381c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8382c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestToPatternScientific11648() {
8383c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8384c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale en("en");
8385c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols sym(en, status);
8386c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt("0.00", sym, status);
8387c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
8388c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
8389c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8390c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8391c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setScientificNotation(TRUE);
8392c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString pattern;
8393c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "0.00E0", fmt.toPattern(pattern));
8394c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt2(pattern, sym, status);
8395c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertSuccess("", status);
8396c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8397c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8398c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestBenchmark() {
8399c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/*
8400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8401c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale en("en");
8402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols sym(en, status);
8403c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(sym), status);
8404c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//    DecimalFormat fmt("0.00000E0", new DecimalFormatSymbols(sym), status);
8405c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//    DecimalFormat fmt("0", new DecimalFormatSymbols(sym), status);
840664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
8407c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    clock_t start = clock();
8408c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    for (int32_t i = 0; i < 1000000; ++i) {
8409c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString append;
8410c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.format(3.0, append, fpos, status);
8411c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//        fmt.format(4.6692016, append, fpos, status);
8412c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//        fmt.format(1234567.8901, append, fpos, status);
8413c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//        fmt.format(2.99792458E8, append, fpos, status);
8414c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert//        fmt.format(31, append);
8415c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8416c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
8417c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertSuccess("", status);
8418c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8419c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8420c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    MessageFormat fmt("{0, plural, one {I have # friend.} other {I have # friends.}}", status);
842164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
8422c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Formattable one(1.0);
8423c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Formattable three(3.0);
8424c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    clock_t start = clock();
8425c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    for (int32_t i = 0; i < 500000; ++i) {
8426c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString append;
8427c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.format(&one, 1, append, fpos, status);
8428c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString append2;
8429c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.format(&three, 1, append2, fpos, status);
8430c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8431c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
8432c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertSuccess("", status);
8433c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8434c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale en("en");
8436c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Measure measureC(23, MeasureUnit::createCelsius(status), status);
8437c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    MeasureFormat fmt(en, UMEASFMT_WIDTH_WIDE, status);
843864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
8439c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    clock_t start = clock();
8440c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    for (int32_t i = 0; i < 1000000; ++i) {
8441c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString appendTo;
8442c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.formatMeasures(
8443c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                &measureC, 1, appendTo, fpos, status);
8444c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8445c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
8446c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertSuccess("", status);
8447c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*/
8448c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8449c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8450c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestFractionalDigitsForCurrency() {
8451c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8452c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<NumberFormat> fmt(NumberFormat::createCurrencyInstance("en", status));
8453c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
8454c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating NumberFormat - %s", u_errorName(status));
8455c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8456c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8457c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UChar JPY[] = {0x4A, 0x50, 0x59, 0x0};
8458c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt->setCurrency(JPY, status);
8459c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8460c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8461c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8462c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", 0, fmt->getMaximumFractionDigits());
8463c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8464c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8465c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8466c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestFormatCurrencyPlural() {
8467c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8468c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale locale = Locale::createCanonical("en_US");
8469c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    NumberFormat *fmt = NumberFormat::createInstance(locale, UNUM_CURRENCY_PLURAL, status);
8470c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
8471c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating NumberFormat - %s", u_errorName(status));
8472c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8473c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8474c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   UnicodeString formattedNum;
8475c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   fmt->format(11234.567, formattedNum, NULL, status);
8476c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   assertEquals("", "11,234.57 US dollars", formattedNum);
8477c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   delete fmt;
8478c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8479c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8480c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::TestCtorApplyPatternDifference() {
8481c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8482c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols sym("en_US", status);
8483c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString pattern("\\u00a40");
8484c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt(pattern.unescape(), sym, status);
8485c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
8486c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
8487c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8488c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8489c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString result;
8490c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals(
8491c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "ctor favors precision of currency",
8492c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "$5.00",
849364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert            fmt.format((double)5, result));
8494c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    result.remove();
8495c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.applyPattern(pattern.unescape(), status);
8496c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals(
8497c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "applyPattern favors precision of pattern",
8498c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "$5",
849964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert            fmt.format((double)5, result));
8500c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8501c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8502c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test11868() {
8503c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    double posAmt = 34.567;
8504c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    double negAmt = -9876.543;
8505c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8506c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    Locale selectedLocale("en_US");
8507c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8508c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8509c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString result;
8510c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FieldPosition fpCurr(UNUM_CURRENCY_FIELD);
8511c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<NumberFormat> fmt(
8512c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormat::createInstance(
8513c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    selectedLocale, UNUM_CURRENCY_PLURAL, status));
8514c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("Format creation", status)) {
8515c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8516c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8517c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt->format(posAmt, result, fpCurr, status);
8518c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "34.57 US dollars", result);
8519c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("begin index", 6, fpCurr.getBeginIndex());
8520c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("end index", 16, fpCurr.getEndIndex());
8521c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8522c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // Test field position iterator
8523c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8524c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        NumberFormatTest_Attributes attributes[] = {
8525c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_INTEGER_FIELD, 0, 2},
8526c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
8527c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_FRACTION_FIELD, 3, 5},
8528c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_CURRENCY_FIELD, 6, 16},
8529c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {0, -1, 0}};
8530c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString result;
8531c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        FieldPositionIterator iter;
8532c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt->format(posAmt, result, &iter, status);
8533c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "34.57 US dollars", result);
8534c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        verifyFieldPositionIterator(attributes, iter);
8535c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8536c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8537c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    result.remove();
8538c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt->format(negAmt, result, fpCurr, status);
8539c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "-9,876.54 US dollars", result);
8540c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("begin index", 10, fpCurr.getBeginIndex());
8541c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("end index", 20, fpCurr.getEndIndex());
8542c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8543c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // Test field position iterator
8544c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8545c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        NumberFormatTest_Attributes attributes[] = {
8546c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_SIGN_FIELD, 0, 1},
8547c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_GROUPING_SEPARATOR_FIELD, 2, 3},
8548c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_INTEGER_FIELD, 1, 6},
8549c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_DECIMAL_SEPARATOR_FIELD, 6, 7},
8550c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_FRACTION_FIELD, 7, 9},
8551c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_CURRENCY_FIELD, 10, 20},
8552c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {0, -1, 0}};
8553c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString result;
8554c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        FieldPositionIterator iter;
8555c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt->format(negAmt, result, &iter, status);
8556c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "-9,876.54 US dollars", result);
8557c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        verifyFieldPositionIterator(attributes, iter);
8558c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8559c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8560c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8561c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test10727_RoundingZero() {
8562c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   DigitList d;
8563c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   d.set(-0.0);
8564c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   assertFalse("", d.isPositive());
8565c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   d.round(3);
8566c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert   assertFalse("", d.isPositive());
8567c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8568c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8569c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test11376_getAndSetPositivePrefix() {
8570c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8571c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UChar USD[] = {0x55, 0x53, 0x44, 0x0};
8572c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
8573c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        LocalPointer<NumberFormat> fmt(
8574c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                NumberFormat::createCurrencyInstance("en", status));
8575c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (!assertSuccess("", status)) {
8576c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return;
8577c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8578c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat *dfmt = (DecimalFormat *) fmt.getAlias();
8579c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dfmt->setCurrency(USD);
8580c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString result;
8581c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8582c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        // This line should be a no-op. I am setting the positive prefix
8583c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        // to be the same thing it was before.
8584c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dfmt->setPositivePrefix(dfmt->getPositivePrefix(result));
8585c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8586c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString appendTo;
8587c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "$3.78", dfmt->format(3.78, appendTo, status));
8588c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertSuccess("", status);
8589c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8590c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8591c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UChar USD[] = {0x55, 0x53, 0x44, 0x0};
8592c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
8593c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        LocalPointer<NumberFormat> fmt(
8594c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                NumberFormat::createInstance("en", UNUM_CURRENCY_PLURAL, status));
8595c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (!assertSuccess("", status)) {
8596c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return;
8597c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8598c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat *dfmt = (DecimalFormat *) fmt.getAlias();
8599c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString result;
8600c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString tripleIntlCurrency(" \\u00a4\\u00a4\\u00a4");
8601c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        tripleIntlCurrency = tripleIntlCurrency.unescape();
8602c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", tripleIntlCurrency, dfmt->getPositiveSuffix(result));
8603c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dfmt->setCurrency(USD);
8604c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8605c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        // getPositiveSuffix() always returns the suffix for the
8606c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        // "other" plural category
8607c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", " US dollars", dfmt->getPositiveSuffix(result));
8608c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString appendTo;
8609c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "3.78 US dollars", dfmt->format(3.78, appendTo, status));
8610c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", " US dollars", dfmt->getPositiveSuffix(result));
8611c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dfmt->setPositiveSuffix("booya");
8612c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        appendTo.remove();
8613c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "3.78booya", dfmt->format(3.78, appendTo, status));
8614c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "booya", dfmt->getPositiveSuffix(result));
8615c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8616c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8617c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8618c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test11475_signRecognition() {
8619c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8620c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols sym("en", status);
8621c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString result;
8622c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8623c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmt("+0.00", sym, status);
8624c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (!assertSuccess("", status)) {
8625c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return;
8626c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8627c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        NumberFormatTest_Attributes attributes[] = {
8628c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_SIGN_FIELD, 0, 1},
8629c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_INTEGER_FIELD, 1, 2},
8630c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
8631c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {UNUM_FRACTION_FIELD, 3, 5},
8632c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                {0, -1, 0}};
8633c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString result;
8634c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        FieldPositionIterator iter;
8635c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        fmt.format(2.3, result, &iter, status);
8636c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("", "+2.30", result);
8637c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        verifyFieldPositionIterator(attributes, iter);
8638c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8639c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    {
8640c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DecimalFormat fmt("++0.00+;-(#)--", sym, status);
8641c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (!assertSuccess("", status)) {
8642c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return;
8643c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8644c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {
8645c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTest_Attributes attributes[] = {
8646c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_SIGN_FIELD, 0, 2},
8647c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_INTEGER_FIELD, 2, 3},
8648c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
8649c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_FRACTION_FIELD, 4, 6},
8650c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_SIGN_FIELD, 6, 7},
8651c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {0, -1, 0}};
8652c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
8653c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPositionIterator iter;
8654c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            fmt.format(2.3, result, &iter, status);
8655c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            assertEquals("", "++2.30+", result);
8656c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            verifyFieldPositionIterator(attributes, iter);
8657c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8658c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        {
8659c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            NumberFormatTest_Attributes attributes[] = {
8660c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_SIGN_FIELD, 0, 1},
8661c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_INTEGER_FIELD, 2, 3},
8662c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
8663c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_FRACTION_FIELD, 4, 6},
8664c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {UNUM_SIGN_FIELD, 7, 9},
8665c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    {0, -1, 0}};
8666c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString result;
8667c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            FieldPositionIterator iter;
8668c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            fmt.format(-2.3, result, &iter, status);
8669c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            assertEquals("", "-(2.30)--", result);
8670c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            verifyFieldPositionIterator(attributes, iter);
8671c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8672c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8673c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8674c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8675c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test11640_getAffixes() {
8676c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8677c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols symbols("en_US", status);
8678c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8679c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8680c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8681c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00 %\\u00a4\\u00a4");
8682c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    pattern = pattern.unescape();
8683c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt(pattern, symbols, status);
8684c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8685c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8686c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8687c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString affixStr;
8688c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "US dollars ", fmt.getPositivePrefix(affixStr));
8689c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", " %USD", fmt.getPositiveSuffix(affixStr));
8690c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "-US dollars ", fmt.getNegativePrefix(affixStr));
8691c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", " %USD", fmt.getNegativeSuffix(affixStr));
8692c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8693c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8694c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::Test11649_toPatternWithMultiCurrency() {
8695c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00");
8696c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    pattern = pattern.unescape();
8697c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
8698c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt(pattern, status);
8699c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8700c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8701c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8702c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
8703c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.setCurrency(USD);
8704c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString appendTo;
8705c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8706c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "US dollars 12.34", fmt.format(12.34, appendTo));
8707c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8708c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString topattern;
8709c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt.toPattern(topattern);
8710c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat fmt2(topattern, status);
8711c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (!assertSuccess("", status)) {
8712c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
8713c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8714c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    fmt2.setCurrency(USD);
8715c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8716c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    appendTo.remove();
8717c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    assertEquals("", "US dollars 12.34", fmt2.format(12.34, appendTo));
8718c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8719c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8720c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
8721c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid NumberFormatTest::verifyFieldPositionIterator(
8722c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        NumberFormatTest_Attributes *expected, FieldPositionIterator &iter) {
8723c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    int32_t idx = 0;
8724c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FieldPosition fp;
8725c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    while (iter.next(fp)) {
8726c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (expected[idx].spos == -1) {
8727c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            errln("Iterator should have ended. got %d", fp.getField());
8728c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return;
8729c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
8730c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("id", expected[idx].id, fp.getField());
8731c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("start", expected[idx].spos, fp.getBeginIndex());
8732c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        assertEquals("end", expected[idx].epos, fp.getEndIndex());
8733c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        ++idx;
8734c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8735c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (expected[idx].spos != -1) {
8736c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("Premature end of iterator. expected %d", expected[idx].id);
8737c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
8738c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
8739c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
87408de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertvoid NumberFormatTest::checkExceptionIssue11735() {
87418de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    UErrorCode status;
87428de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    Locale enLocale("en");
87438de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    DecimalFormatSymbols symbols(enLocale, status);
87448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
87458de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    if (U_FAILURE(status)) {
87468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert      errln((UnicodeString)
87478de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            "Fail: Construct DecimalFormatSymbols");
87488de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
8749c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
87508de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    DecimalFormat fmt("0", symbols, status);
87518de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    if (U_FAILURE(status)) {
87528de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert      errln((UnicodeString)
87538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            "Fail: Construct DecimalFormat formatter");
87548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
87558de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
87568de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    ParsePosition ppos(0);
87578de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    fmt.parseCurrency("53.45", ppos);  // NPE thrown here in ICU4J.
87588de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    assertEquals("Issue11735 ppos", 0, ppos.getIndex());
87598de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
87601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
8761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
8762