1/*
2**********************************************************************
3* Copyright (c) 2002-2015, International Business Machines
4* Corporation and others.  All Rights Reserved.
5**********************************************************************
6*/
7#ifndef _UCURR_H_
8#define _UCURR_H_
9
10#include "unicode/utypes.h"
11#include "unicode/uenum.h"
12
13/**
14 * \file
15 * \brief C API: Encapsulates information about a currency.
16 */
17
18#if !UCONFIG_NO_FORMATTING
19
20/**
21 * Currency Usage used for Decimal Format
22 * @stable ICU 54
23 */
24enum UCurrencyUsage {
25    /**
26     * a setting to specify currency usage which determines currency digit
27     * and rounding for standard usage, for example: "50.00 NT$"
28     * used as DEFAULT value
29     * @stable ICU 54
30     */
31    UCURR_USAGE_STANDARD=0,
32    /**
33     * a setting to specify currency usage which determines currency digit
34     * and rounding for cash usage, for example: "50 NT$"
35     * @stable ICU 54
36     */
37    UCURR_USAGE_CASH=1,
38    /**
39     * One higher than the last enum UCurrencyUsage constant.
40     * @stable ICU 54
41     */
42    UCURR_USAGE_COUNT=2
43};
44typedef enum UCurrencyUsage UCurrencyUsage;
45
46/**
47 * The ucurr API encapsulates information about a currency, as defined by
48 * ISO 4217.  A currency is represented by a 3-character string
49 * containing its ISO 4217 code.  This API can return various data
50 * necessary the proper display of a currency:
51 *
52 * <ul><li>A display symbol, for a specific locale
53 * <li>The number of fraction digits to display
54 * <li>A rounding increment
55 * </ul>
56 *
57 * The <tt>DecimalFormat</tt> class uses these data to display
58 * currencies.
59 * @author Alan Liu
60 * @since ICU 2.2
61 */
62
63/**
64 * Finds a currency code for the given locale.
65 * @param locale the locale for which to retrieve a currency code.
66 *               Currency can be specified by the "currency" keyword
67 *               in which case it overrides the default currency code
68 * @param buff   fill in buffer. Can be NULL for preflighting.
69 * @param buffCapacity capacity of the fill in buffer. Can be 0 for
70 *               preflighting. If it is non-zero, the buff parameter
71 *               must not be NULL.
72 * @param ec error code
73 * @return length of the currency string. It should always be 3. If 0,
74 *                currency couldn't be found or the input values are
75 *                invalid.
76 * @stable ICU 2.8
77 */
78U_STABLE int32_t U_EXPORT2
79ucurr_forLocale(const char* locale,
80                UChar* buff,
81                int32_t buffCapacity,
82                UErrorCode* ec);
83
84/**
85 * Selector constants for ucurr_getName().
86 *
87 * @see ucurr_getName
88 * @stable ICU 2.6
89 */
90typedef enum UCurrNameStyle {
91    /**
92     * Selector for ucurr_getName indicating a symbolic name for a
93     * currency, such as "$" for USD.
94     * @stable ICU 2.6
95     */
96    UCURR_SYMBOL_NAME,
97
98    /**
99     * Selector for ucurr_getName indicating the long name for a
100     * currency, such as "US Dollar" for USD.
101     * @stable ICU 2.6
102     */
103    UCURR_LONG_NAME
104} UCurrNameStyle;
105
106#if !UCONFIG_NO_SERVICE
107/**
108 * @stable ICU 2.6
109 */
110typedef const void* UCurrRegistryKey;
111
112/**
113 * Register an (existing) ISO 4217 currency code for the given locale.
114 * Only the country code and the two variants EURO and PRE_EURO are
115 * recognized.
116 * @param isoCode the three-letter ISO 4217 currency code
117 * @param locale  the locale for which to register this currency code
118 * @param status the in/out status code
119 * @return a registry key that can be used to unregister this currency code, or NULL
120 * if there was an error.
121 * @stable ICU 2.6
122 */
123U_STABLE UCurrRegistryKey U_EXPORT2
124ucurr_register(const UChar* isoCode,
125                   const char* locale,
126                   UErrorCode* status);
127/**
128 * Unregister the previously-registered currency definitions using the
129 * URegistryKey returned from ucurr_register.  Key becomes invalid after
130 * a successful call and should not be used again.  Any currency
131 * that might have been hidden by the original ucurr_register call is
132 * restored.
133 * @param key the registry key returned by a previous call to ucurr_register
134 * @param status the in/out status code, no special meanings are assigned
135 * @return TRUE if the currency for this key was successfully unregistered
136 * @stable ICU 2.6
137 */
138U_STABLE UBool U_EXPORT2
139ucurr_unregister(UCurrRegistryKey key, UErrorCode* status);
140#endif /* UCONFIG_NO_SERVICE */
141
142/**
143 * Returns the display name for the given currency in the
144 * given locale.  For example, the display name for the USD
145 * currency object in the en_US locale is "$".
146 * @param currency null-terminated 3-letter ISO 4217 code
147 * @param locale locale in which to display currency
148 * @param nameStyle selector for which kind of name to return
149 * @param isChoiceFormat fill-in set to TRUE if the returned value
150 * is a ChoiceFormat pattern; otherwise it is a static string
151 * @param len fill-in parameter to receive length of result
152 * @param ec error code
153 * @return pointer to display string of 'len' UChars.  If the resource
154 * data contains no entry for 'currency', then 'currency' itself is
155 * returned.  If *isChoiceFormat is TRUE, then the result is a
156 * ChoiceFormat pattern.  Otherwise it is a static string.
157 * @stable ICU 2.6
158 */
159U_STABLE const UChar* U_EXPORT2
160ucurr_getName(const UChar* currency,
161              const char* locale,
162              UCurrNameStyle nameStyle,
163              UBool* isChoiceFormat,
164              int32_t* len,
165              UErrorCode* ec);
166
167/**
168 * Returns the plural name for the given currency in the
169 * given locale.  For example, the plural name for the USD
170 * currency object in the en_US locale is "US dollar" or "US dollars".
171 * @param currency null-terminated 3-letter ISO 4217 code
172 * @param locale locale in which to display currency
173 * @param isChoiceFormat fill-in set to TRUE if the returned value
174 * is a ChoiceFormat pattern; otherwise it is a static string
175 * @param pluralCount plural count
176 * @param len fill-in parameter to receive length of result
177 * @param ec error code
178 * @return pointer to display string of 'len' UChars.  If the resource
179 * data contains no entry for 'currency', then 'currency' itself is
180 * returned.
181 * @stable ICU 4.2
182 */
183U_STABLE const UChar* U_EXPORT2
184ucurr_getPluralName(const UChar* currency,
185                    const char* locale,
186                    UBool* isChoiceFormat,
187                    const char* pluralCount,
188                    int32_t* len,
189                    UErrorCode* ec);
190
191/**
192 * Returns the number of the number of fraction digits that should
193 * be displayed for the given currency.
194 * This is equivalent to ucurr_getDefaultFractionDigitsForUsage(currency,UCURR_USAGE_STANDARD,ec);
195 * @param currency null-terminated 3-letter ISO 4217 code
196 * @param ec input-output error code
197 * @return a non-negative number of fraction digits to be
198 * displayed, or 0 if there is an error
199 * @stable ICU 3.0
200 */
201U_STABLE int32_t U_EXPORT2
202ucurr_getDefaultFractionDigits(const UChar* currency,
203                               UErrorCode* ec);
204
205/**
206 * Returns the number of the number of fraction digits that should
207 * be displayed for the given currency with usage.
208 * @param currency null-terminated 3-letter ISO 4217 code
209 * @param usage enum usage for the currency
210 * @param ec input-output error code
211 * @return a non-negative number of fraction digits to be
212 * displayed, or 0 if there is an error
213 * @stable ICU 54
214 */
215U_STABLE int32_t U_EXPORT2
216ucurr_getDefaultFractionDigitsForUsage(const UChar* currency,
217                                       const UCurrencyUsage usage,
218                                       UErrorCode* ec);
219
220/**
221 * Returns the rounding increment for the given currency, or 0.0 if no
222 * rounding is done by the currency.
223 * This is equivalent to ucurr_getRoundingIncrementForUsage(currency,UCURR_USAGE_STANDARD,ec);
224 * @param currency null-terminated 3-letter ISO 4217 code
225 * @param ec input-output error code
226 * @return the non-negative rounding increment, or 0.0 if none,
227 * or 0.0 if there is an error
228 * @stable ICU 3.0
229 */
230U_STABLE double U_EXPORT2
231ucurr_getRoundingIncrement(const UChar* currency,
232                           UErrorCode* ec);
233
234/**
235 * Returns the rounding increment for the given currency, or 0.0 if no
236 * rounding is done by the currency given usage.
237 * @param currency null-terminated 3-letter ISO 4217 code
238 * @param usage enum usage for the currency
239 * @param ec input-output error code
240 * @return the non-negative rounding increment, or 0.0 if none,
241 * or 0.0 if there is an error
242 * @stable ICU 54
243 */
244U_STABLE double U_EXPORT2
245ucurr_getRoundingIncrementForUsage(const UChar* currency,
246                                   const UCurrencyUsage usage,
247                                   UErrorCode* ec);
248
249/**
250 * Selector constants for ucurr_openCurrencies().
251 *
252 * @see ucurr_openCurrencies
253 * @stable ICU 3.2
254 */
255typedef enum UCurrCurrencyType {
256    /**
257     * Select all ISO-4217 currency codes.
258     * @stable ICU 3.2
259     */
260    UCURR_ALL = INT32_MAX,
261    /**
262     * Select only ISO-4217 commonly used currency codes.
263     * These currencies can be found in common use, and they usually have
264     * bank notes or coins associated with the currency code.
265     * This does not include fund codes, precious metals and other
266     * various ISO-4217 codes limited to special financial products.
267     * @stable ICU 3.2
268     */
269    UCURR_COMMON = 1,
270    /**
271     * Select ISO-4217 uncommon currency codes.
272     * These codes respresent fund codes, precious metals and other
273     * various ISO-4217 codes limited to special financial products.
274     * A fund code is a monetary resource associated with a currency.
275     * @stable ICU 3.2
276     */
277    UCURR_UNCOMMON = 2,
278    /**
279     * Select only deprecated ISO-4217 codes.
280     * These codes are no longer in general public use.
281     * @stable ICU 3.2
282     */
283    UCURR_DEPRECATED = 4,
284    /**
285     * Select only non-deprecated ISO-4217 codes.
286     * These codes are in general public use.
287     * @stable ICU 3.2
288     */
289    UCURR_NON_DEPRECATED = 8
290} UCurrCurrencyType;
291
292/**
293 * Provides a UEnumeration object for listing ISO-4217 codes.
294 * @param currType You can use one of several UCurrCurrencyType values for this
295 *      variable. You can also | (or) them together to get a specific list of
296 *      currencies. Most people will want to use the (UCURR_CURRENCY|UCURR_NON_DEPRECATED) value to
297 *      get a list of current currencies.
298 * @param pErrorCode Error code
299 * @stable ICU 3.2
300 */
301U_STABLE UEnumeration * U_EXPORT2
302ucurr_openISOCurrencies(uint32_t currType, UErrorCode *pErrorCode);
303
304/**
305  * Queries if the given ISO 4217 3-letter code is available on the specified date range.
306  *
307  * Note: For checking availability of a currency on a specific date, specify the date on both 'from' and 'to'
308  *
309  * When 'from' is U_DATE_MIN and 'to' is U_DATE_MAX, this method checks if the specified currency is available any time.
310  * If 'from' and 'to' are same UDate value, this method checks if the specified currency is available on that date.
311  *
312  * @param isoCode
313  *            The ISO 4217 3-letter code.
314  *
315  * @param from
316  *            The lower bound of the date range, inclusive. When 'from' is U_DATE_MIN, check the availability
317  *            of the currency any date before 'to'
318  *
319  * @param to
320  *            The upper bound of the date range, inclusive. When 'to' is U_DATE_MAX, check the availability of
321  *            the currency any date after 'from'
322  *
323  * @param errorCode
324  *            ICU error code
325   *
326  * @return TRUE if the given ISO 4217 3-letter code is supported on the specified date range.
327  *
328  * @stable ICU 4.8
329  */
330U_STABLE UBool U_EXPORT2
331ucurr_isAvailable(const UChar* isoCode,
332             UDate from,
333             UDate to,
334             UErrorCode* errorCode);
335
336/**
337 * Finds the number of valid currency codes for the
338 * given locale and date.
339 * @param locale the locale for which to retrieve the
340 *               currency count.
341 * @param date   the date for which to retrieve the
342 *               currency count for the given locale.
343 * @param ec     error code
344 * @return       the number of currency codes for the
345 *               given locale and date.  If 0, currency
346 *               codes couldn't be found for the input
347 *               values are invalid.
348 * @stable ICU 4.0
349 */
350U_STABLE int32_t U_EXPORT2
351ucurr_countCurrencies(const char* locale,
352                 UDate date,
353                 UErrorCode* ec);
354
355/**
356 * Finds a currency code for the given locale and date
357 * @param locale the locale for which to retrieve a currency code.
358 *               Currency can be specified by the "currency" keyword
359 *               in which case it overrides the default currency code
360 * @param date   the date for which to retrieve a currency code for
361 *               the given locale.
362 * @param index  the index within the available list of currency codes
363 *               for the given locale on the given date.
364 * @param buff   fill in buffer. Can be NULL for preflighting.
365 * @param buffCapacity capacity of the fill in buffer. Can be 0 for
366 *               preflighting. If it is non-zero, the buff parameter
367 *               must not be NULL.
368 * @param ec     error code
369 * @return       length of the currency string. It should always be 3.
370 *               If 0, currency couldn't be found or the input values are
371 *               invalid.
372 * @stable ICU 4.0
373 */
374U_STABLE int32_t U_EXPORT2
375ucurr_forLocaleAndDate(const char* locale,
376                UDate date,
377                int32_t index,
378                UChar* buff,
379                int32_t buffCapacity,
380                UErrorCode* ec);
381
382/**
383 * Given a key and a locale, returns an array of string values in a preferred
384 * order that would make a difference. These are all and only those values where
385 * the open (creation) of the service with the locale formed from the input locale
386 * plus input keyword and that value has different behavior than creation with the
387 * input locale alone.
388 * @param key           one of the keys supported by this service.  For now, only
389 *                      "currency" is supported.
390 * @param locale        the locale
391 * @param commonlyUsed  if set to true it will return only commonly used values
392 *                      with the given locale in preferred order.  Otherwise,
393 *                      it will return all the available values for the locale.
394 * @param status error status
395 * @return a string enumeration over keyword values for the given key and the locale.
396 * @stable ICU 4.2
397 */
398U_STABLE UEnumeration* U_EXPORT2
399ucurr_getKeywordValuesForLocale(const char* key,
400                                const char* locale,
401                                UBool commonlyUsed,
402                                UErrorCode* status);
403
404/**
405 * Returns the ISO 4217 numeric code for the currency.
406 * <p>Note: If the ISO 4217 numeric code is not assigned for the currency or
407 * the currency is unknown, this function returns 0.
408 *
409 * @param currency null-terminated 3-letter ISO 4217 code
410 * @return The ISO 4217 numeric code of the currency
411 * @stable ICU 49
412 */
413U_STABLE int32_t U_EXPORT2
414ucurr_getNumericCode(const UChar* currency);
415
416#endif /* #if !UCONFIG_NO_FORMATTING */
417
418#endif
419