1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
327f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (c) 1999-2010, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h"
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/numfmt.h"
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/dcfmtsym.h"
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/decimfmt.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/locid.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uclean.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "util.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h>
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern "C" void capi();
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid cppapi();
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerushowCurrencyFormatting(UBool useICU26API);
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv) {
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("%s output is in UTF-8\n", argv[0]);
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("C++ API\n");
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cppapi();
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("C API\n");
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    capi();
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    showCurrencyFormatting(FALSE);
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    showCurrencyFormatting(TRUE);
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_cleanup();    // Release any additional storage held by ICU.
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("Exiting successfully\n");
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Sample code for the C++ API to NumberFormat.
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid cppapi() {
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Locale us("en", "US");
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Create a number formatter for the US locale
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NumberFormat *fmt = NumberFormat::createInstance(us, status);
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    check(status, "NumberFormat::createInstance");
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Parse a string.  The string uses the digits '0' through '9'
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // and the decimal separator '.', standard in the US locale
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString str("9876543210.123");
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Formattable result;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fmt->parse(str, result, status);
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    check(status, "NumberFormat::parse");
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("NumberFormat::parse(\""); // Display the result
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprintf(str);
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("\") => ");
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprintf(formattableToString(result));
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("\n");
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Take the number parsed above, and use the formatter to
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // format it.
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    str.remove(); // format() will APPEND to this string
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fmt->format(result, str, status);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    check(status, "NumberFormat::format");
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("NumberFormat::format("); // Display the result
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprintf(formattableToString(result));
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf(") => \"");
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprintf(str);
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printf("\"\n");
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete fmt; // Release the storage used by the formatter
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// currency formatting ----------------------------------------------------- ***
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set a currency on a NumberFormat with pre-ICU 2.6 APIs.
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This is a "hack" that will not work properly for all cases because
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * only ICU 2.6 introduced a more complete framework and data for this.
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param nf The NumberFormat on which to set the currency; takes effect on
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           currency-formatting NumberFormat instances.
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           This must actually be a DecimalFormat instance.
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           The display style of the output is controlled by nf (its pattern,
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           usually from the display locale ID used to create this instance)
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           while the currency symbol and number of decimals are set for
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           the currency.
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param currency The 3-letter ISO 4217 currency code, NUL-terminated.
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param errorCode ICU error code, must pass U_SUCCESS() on input.
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerusetNumberFormatCurrency_2_4(NumberFormat &nf, const char *currency, UErrorCode &errorCode) {
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // argument checking
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(currency==NULL || strlen(currency)!=3) {
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // check that the formatter is a DecimalFormat instance
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // necessary because we will cast to the DecimalFormat subclass to set
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // the currency symbol
11627f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *dnf=dynamic_cast<DecimalFormat *>(&nf);
11727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(dnf==NULL) {
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // map the currency code to a locale ID
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // only the currencies in this array are supported
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // it would be possible to map to a locale ID, instantiate a currency
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // formatter for that and copy its values, but that would be slower,
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // and we have to hardcode something here anyway
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const struct {
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // ISO currency ID
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *currency;
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // fractionDigits==minimumFractionDigits==maximumFractionDigits
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // for these currencies
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t fractionDigits;
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * Set the rounding increment to 0 if it is implied with the number of
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * fraction digits. Setting an explicit rounding increment makes
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * number formatting slower.
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * In other words, set it to something other than 0 only for unusual
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * cases like "nickel rounding" (0.05) when the increment differs from
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * 10^(-maximumFractionDigits).
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        double roundingIncrement;
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // Unicode string with the desired currency display symbol or name
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar symbol[16];
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } currencyMap[]={
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "USD", 2, 0.0, { 0x24, 0 } },
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "GBP", 2, 0.0, { 0xa3, 0 } },
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "EUR", 2, 0.0, { 0x20ac, 0 } },
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "JPY", 0, 0.0, { 0xa5, 0 } }
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0; i<LENGTHOF(currencyMap); ++i) {
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(strcmp(currency, currencyMap[i].currency)==0) {
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(i==LENGTHOF(currencyMap)) {
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // a more specific error code would be useful in a real application
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorCode=U_UNSUPPORTED_ERROR;
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // set the currency-related data into the caller's formatter
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.setMinimumFractionDigits(currencyMap[i].fractionDigits);
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.setMaximumFractionDigits(currencyMap[i].fractionDigits);
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17227f654740f2a26ad62a5c155af9199af9e69b889claireho    dnf->setRoundingIncrement(currencyMap[i].roundingIncrement);
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17427f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormatSymbols symbols(*dnf->getDecimalFormatSymbols());
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    symbols.setSymbol(DecimalFormatSymbols::kCurrencySymbol, currencyMap[i].symbol);
17627f654740f2a26ad62a5c155af9199af9e69b889claireho    dnf->setDecimalFormatSymbols(symbols); // do not adopt symbols: Jitterbug 2889
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set a currency on a NumberFormat with ICU 2.6 APIs.
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param nf The NumberFormat on which to set the currency; takes effect on
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           currency-formatting NumberFormat instances.
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           The display style of the output is controlled by nf (its pattern,
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           usually from the display locale ID used to create this instance)
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           while the currency symbol and number of decimals are set for
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           the currency.
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param currency The 3-letter ISO 4217 currency code, NUL-terminated.
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param errorCode ICU error code, must pass U_SUCCESS() on input.
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerusetNumberFormatCurrency_2_6(NumberFormat &nf, const char *currency, UErrorCode &errorCode) {
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(currency==NULL || strlen(currency)!=3) {
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // invariant-character conversion to UChars (see utypes.h and putil.h)
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar uCurrency[4];
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_charsToUChars(currency, uCurrency, 4);
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // set the currency
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // in ICU 3.0 this API (which was @draft ICU 2.6) gained a UErrorCode& argument
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if (U_ICU_VERSION_MAJOR_NUM < 3)
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.setCurrency(uCurrency);
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nf.setCurrency(uCurrency, errorCode);
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *const
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerusampleLocaleIDs[]={
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // use locale IDs complete with country code to be sure to
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // pick up number/currency format patterns
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "en_US", "en_GB", "de_DE", "ja_JP", "fr_FR", "hi_IN"
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *const
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerusampleCurrencies[]={
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "USD", "GBP", "EUR", "JPY"
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerushowCurrencyFormatting(UBool useICU26API) {
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NumberFormat *nf;
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i, j;
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString output;
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode;
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // TODO: Using printf() here assumes that the runtime encoding is ASCII-friendly
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // and can therefore be mixed with UTF-8
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0; i<LENGTHOF(sampleLocaleIDs); ++i) {
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printf("show currency formatting (method for %s) in the locale \"%s\"\n",
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                useICU26API ? "ICU 2.6" : "before ICU 2.6",
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                sampleLocaleIDs[i]);
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // get a currency formatter for this locale ID
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        nf=NumberFormat::createCurrencyInstance(sampleLocaleIDs[i], errorCode);
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            printf("NumberFormat::createCurrencyInstance(%s) failed - %s\n",
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    sampleLocaleIDs[i], u_errorName(errorCode));
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(j=0; j<LENGTHOF(sampleCurrencies); ++j) {
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            printf("  - format currency \"%s\": ", sampleCurrencies[j]);
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            // set the actual currency to be formatted
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(useICU26API) {
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                setNumberFormatCurrency_2_6(*nf, sampleCurrencies[j], errorCode);
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                setNumberFormatCurrency_2_4(*nf, sampleCurrencies[j], errorCode);
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)) {
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                printf("setNumberFormatCurrency(%s) failed - %s\n",
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        sampleCurrencies[j], u_errorName(errorCode));
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            // output=formatted currency value
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            output.remove();
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            nf->format(12345678.93, output);
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            output+=(UChar)0x0a; // '\n'
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprintf(output);
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
275