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