• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 *******************************************************************************
3 * Copyright (C) 1997-2010, International Business Machines Corporation and others.
4 * All Rights Reserved.
5 * Modification History:
6 *
7 *   Date        Name        Description
8 *   06/24/99    helena      Integrated Alan's NF enhancements and Java2 bug fixes
9 *******************************************************************************
10 */
11 
12 #ifndef _UNUM
13 #define _UNUM
14 
15 #include "unicode/utypes.h"
16 
17 #if !UCONFIG_NO_FORMATTING
18 
19 #include "unicode/localpointer.h"
20 #include "unicode/uloc.h"
21 #include "unicode/umisc.h"
22 #include "unicode/parseerr.h"
23 /**
24  * \file
25  * \brief C API: NumberFormat
26  *
27  * <h2> Number Format C API </h2>
28  *
29  * Number Format C API  Provides functions for
30  * formatting and parsing a number.  Also provides methods for
31  * determining which locales have number formats, and what their names
32  * are.
33  * <P>
34  * UNumberFormat helps you to format and parse numbers for any locale.
35  * Your code can be completely independent of the locale conventions
36  * for decimal points, thousands-separators, or even the particular
37  * decimal digits used, or whether the number format is even decimal.
38  * There are different number format styles like decimal, currency,
39  * percent and spellout.
40  * <P>
41  * To format a number for the current Locale, use one of the static
42  * factory methods:
43  * <pre>
44  * \code
45  *    UChar myString[20];
46  *    double myNumber = 7.0;
47  *    UErrorCode status = U_ZERO_ERROR;
48  *    UNumberFormat* nf = unum_open(UNUM_DEFAULT, NULL, -1, NULL, NULL, &status);
49  *    unum_formatDouble(nf, myNumber, myString, 20, NULL, &status);
50  *    printf(" Example 1: %s\n", austrdup(myString) ); //austrdup( a function used to convert UChar* to char*)
51  * \endcode
52  * </pre>
53  * If you are formatting multiple numbers, it is more efficient to get
54  * the format and use it multiple times so that the system doesn't
55  * have to fetch the information about the local language and country
56  * conventions multiple times.
57  * <pre>
58  * \code
59  * uint32_t i, resultlength, reslenneeded;
60  * UErrorCode status = U_ZERO_ERROR;
61  * UFieldPosition pos;
62  * uint32_t a[] = { 123, 3333, -1234567 };
63  * const uint32_t a_len = sizeof(a) / sizeof(a[0]);
64  * UNumberFormat* nf;
65  * UChar* result = NULL;
66  *
67  * nf = unum_open(UNUM_DEFAULT, NULL, -1, NULL, NULL, &status);
68  * for (i = 0; i < a_len; i++) {
69  *    resultlength=0;
70  *    reslenneeded=unum_format(nf, a[i], NULL, resultlength, &pos, &status);
71  *    result = NULL;
72  *    if(status==U_BUFFER_OVERFLOW_ERROR){
73  *       status=U_ZERO_ERROR;
74  *       resultlength=reslenneeded+1;
75  *       result=(UChar*)malloc(sizeof(UChar) * resultlength);
76  *       unum_format(nf, a[i], result, resultlength, &pos, &status);
77  *    }
78  *    printf( " Example 2: %s\n", austrdup(result));
79  *    free(result);
80  * }
81  * \endcode
82  * </pre>
83  * To format a number for a different Locale, specify it in the
84  * call to unum_open().
85  * <pre>
86  * \code
87  *     UNumberFormat* nf = unum_open(UNUM_DEFAULT, NULL, -1, "fr_FR", NULL, &success)
88  * \endcode
89  * </pre>
90  * You can use a NumberFormat API unum_parse() to parse.
91  * <pre>
92  * \code
93  *    UErrorCode status = U_ZERO_ERROR;
94  *    int32_t pos=0;
95  *    int32_t num;
96  *    num = unum_parse(nf, str, u_strlen(str), &pos, &status);
97  * \endcode
98  * </pre>
99  * Use UNUM_DECIMAL to get the normal number format for that country.
100  * There are other static options available.  Use UNUM_CURRENCY
101  * to get the currency number format for that country.  Use UNUM_PERCENT
102  * to get a format for displaying percentages. With this format, a
103  * fraction from 0.53 is displayed as 53%.
104  * <P>
105  * Use a pattern to create either a DecimalFormat or a RuleBasedNumberFormat
106  * formatter.  The pattern must conform to the syntax defined for those
107  * formatters.
108  * <P>
109  * You can also control the display of numbers with such function as
110  * unum_getAttribues() and unum_setAtributes(), which let you set the
111  * miminum fraction digits, grouping, etc.
112  * @see UNumberFormatAttributes for more details
113  * <P>
114  * You can also use forms of the parse and format methods with
115  * ParsePosition and UFieldPosition to allow you to:
116  * <ul type=round>
117  *   <li>(a) progressively parse through pieces of a string.
118  *   <li>(b) align the decimal point and other areas.
119  * </ul>
120  * <p>
121  * It is also possible to change or set the symbols used for a particular
122  * locale like the currency symbol, the grouping seperator , monetary seperator
123  * etc by making use of functions unum_setSymbols() and unum_getSymbols().
124  */
125 
126 /** A number formatter.
127  *  For usage in C programs.
128  *  @stable ICU 2.0
129  */
130 typedef void* UNumberFormat;
131 
132 /** The possible number format styles.
133  *  @stable ICU 2.0
134  */
135 typedef enum UNumberFormatStyle {
136     /**
137      * Decimal format defined by pattern
138      * @stable ICU 3.0
139      */
140     UNUM_PATTERN_DECIMAL=0,
141     /** Decimal format */
142     UNUM_DECIMAL=1,
143     /** Currency format */
144     UNUM_CURRENCY,
145     /** Percent format */
146     UNUM_PERCENT,
147     /** Scientific format */
148     UNUM_SCIENTIFIC,
149     /** Spellout rule-based format */
150     UNUM_SPELLOUT,
151     /**
152      * Ordinal rule-based format
153      * @stable ICU 3.0
154      */
155     UNUM_ORDINAL,
156     /**
157      * Duration rule-based format
158      * @stable ICU 3.0
159      */
160     UNUM_DURATION,
161     /**
162      * Numbering system rule-based format
163      * @draft ICU 4.2
164      */
165     UNUM_NUMBERING_SYSTEM,
166     /**
167      * Rule-based format defined by pattern
168      * @stable ICU 3.0
169      */
170     UNUM_PATTERN_RULEBASED,
171     /** Default format */
172     UNUM_DEFAULT = UNUM_DECIMAL,
173     /** (Alias for UNUM_PATTERN_DECIMAL) */
174     UNUM_IGNORE = UNUM_PATTERN_DECIMAL
175 } UNumberFormatStyle;
176 
177 /** The possible number format rounding modes.
178  *  @stable ICU 2.0
179  */
180 typedef enum UNumberFormatRoundingMode {
181     UNUM_ROUND_CEILING,
182     UNUM_ROUND_FLOOR,
183     UNUM_ROUND_DOWN,
184     UNUM_ROUND_UP,
185     /**
186      * Half-even rounding, misspelled name
187      * @deprecated, ICU 3.8
188      */
189     UNUM_FOUND_HALFEVEN,
190     UNUM_ROUND_HALFDOWN,
191     UNUM_ROUND_HALFUP,
192     /**
193      * Half-even rounding
194      * @stable, ICU 3.8
195      */
196     UNUM_ROUND_HALFEVEN = UNUM_FOUND_HALFEVEN
197 } UNumberFormatRoundingMode;
198 
199 /** The possible number format pad positions.
200  *  @stable ICU 2.0
201  */
202 typedef enum UNumberFormatPadPosition {
203     UNUM_PAD_BEFORE_PREFIX,
204     UNUM_PAD_AFTER_PREFIX,
205     UNUM_PAD_BEFORE_SUFFIX,
206     UNUM_PAD_AFTER_SUFFIX
207 } UNumberFormatPadPosition;
208 
209 /**
210  * Create and return a new UNumberFormat for formatting and parsing
211  * numbers.  A UNumberFormat may be used to format numbers by calling
212  * {@link #unum_format }, and to parse numbers by calling {@link #unum_parse }.
213  * The caller must call {@link #unum_close } when done to release resources
214  * used by this object.
215  * @param style The type of number format to open: one of
216  * UNUM_DECIMAL, UNUM_CURRENCY, UNUM_PERCENT, UNUM_SCIENTIFIC, UNUM_SPELLOUT,
217  * UNUM_PATTERN_DECIMAL, UNUM_PATTERN_RULEBASED, or UNUM_DEFAULT.
218  * If UNUM_PATTERN_DECIMAL or UNUM_PATTERN_RULEBASED is passed then the
219  * number format is opened using the given pattern, which must conform
220  * to the syntax described in DecimalFormat or RuleBasedNumberFormat,
221  * respectively.
222  * @param pattern A pattern specifying the format to use.
223  * This parameter is ignored unless the style is
224  * UNUM_PATTERN_DECIMAL or UNUM_PATTERN_RULEBASED.
225  * @param patternLength The number of characters in the pattern, or -1
226  * if null-terminated. This parameter is ignored unless the style is
227  * UNUM_PATTERN.
228  * @param locale A locale identifier to use to determine formatting
229  * and parsing conventions, or NULL to use the default locale.
230  * @param parseErr A pointer to a UParseError struct to receive the
231  * details of any parsing errors, or NULL if no parsing error details
232  * are desired.
233  * @param status A pointer to an input-output UErrorCode.
234  * @return A pointer to a newly created UNumberFormat, or NULL if an
235  * error occurred.
236  * @see unum_close
237  * @see DecimalFormat
238  * @stable ICU 2.0
239  */
240 U_STABLE UNumberFormat* U_EXPORT2
241 unum_open(  UNumberFormatStyle    style,
242             const    UChar*    pattern,
243             int32_t            patternLength,
244             const    char*     locale,
245             UParseError*       parseErr,
246             UErrorCode*        status);
247 
248 
249 /**
250 * Close a UNumberFormat.
251 * Once closed, a UNumberFormat may no longer be used.
252 * @param fmt The formatter to close.
253 * @stable ICU 2.0
254 */
255 U_STABLE void U_EXPORT2
256 unum_close(UNumberFormat* fmt);
257 
258 #if U_SHOW_CPLUSPLUS_API
259 
260 U_NAMESPACE_BEGIN
261 
262 /**
263  * \class LocalUNumberFormatPointer
264  * "Smart pointer" class, closes a UNumberFormat via unum_close().
265  * For most methods see the LocalPointerBase base class.
266  *
267  * @see LocalPointerBase
268  * @see LocalPointer
269  * @draft ICU 4.4
270  */
271 U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatPointer, UNumberFormat, unum_close);
272 
273 U_NAMESPACE_END
274 
275 #endif
276 
277 /**
278  * Open a copy of a UNumberFormat.
279  * This function performs a deep copy.
280  * @param fmt The format to copy
281  * @param status A pointer to an UErrorCode to receive any errors.
282  * @return A pointer to a UNumberFormat identical to fmt.
283  * @stable ICU 2.0
284  */
285 U_STABLE UNumberFormat* U_EXPORT2
286 unum_clone(const UNumberFormat *fmt,
287        UErrorCode *status);
288 
289 /**
290 * Format an integer using a UNumberFormat.
291 * The integer will be formatted according to the UNumberFormat's locale.
292 * @param fmt The formatter to use.
293 * @param number The number to format.
294 * @param result A pointer to a buffer to receive the formatted number.
295 * @param resultLength The maximum size of result.
296 * @param pos    A pointer to a UFieldPosition.  On input, position->field
297 * is read.  On output, position->beginIndex and position->endIndex indicate
298 * the beginning and ending indices of field number position->field, if such
299 * a field exists.  This parameter may be NULL, in which case no field
300 * @param status A pointer to an UErrorCode to receive any errors
301 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
302 * @see unum_formatInt64
303 * @see unum_formatDouble
304 * @see unum_parse
305 * @see unum_parseInt64
306 * @see unum_parseDouble
307 * @see UFieldPosition
308 * @stable ICU 2.0
309 */
310 U_STABLE int32_t U_EXPORT2
311 unum_format(    const    UNumberFormat*    fmt,
312         int32_t            number,
313         UChar*            result,
314         int32_t            resultLength,
315         UFieldPosition    *pos,
316         UErrorCode*        status);
317 
318 /**
319 * Format an int64 using a UNumberFormat.
320 * The int64 will be formatted according to the UNumberFormat's locale.
321 * @param fmt The formatter to use.
322 * @param number The number to format.
323 * @param result A pointer to a buffer to receive the formatted number.
324 * @param resultLength The maximum size of result.
325 * @param pos    A pointer to a UFieldPosition.  On input, position->field
326 * is read.  On output, position->beginIndex and position->endIndex indicate
327 * the beginning and ending indices of field number position->field, if such
328 * a field exists.  This parameter may be NULL, in which case no field
329 * @param status A pointer to an UErrorCode to receive any errors
330 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
331 * @see unum_format
332 * @see unum_formatDouble
333 * @see unum_parse
334 * @see unum_parseInt64
335 * @see unum_parseDouble
336 * @see UFieldPosition
337 * @stable ICU 2.0
338 */
339 U_STABLE int32_t U_EXPORT2
340 unum_formatInt64(const UNumberFormat *fmt,
341         int64_t         number,
342         UChar*          result,
343         int32_t         resultLength,
344         UFieldPosition *pos,
345         UErrorCode*     status);
346 
347 /**
348 * Format a double using a UNumberFormat.
349 * The double will be formatted according to the UNumberFormat's locale.
350 * @param fmt The formatter to use.
351 * @param number The number to format.
352 * @param result A pointer to a buffer to receive the formatted number.
353 * @param resultLength The maximum size of result.
354 * @param pos    A pointer to a UFieldPosition.  On input, position->field
355 * is read.  On output, position->beginIndex and position->endIndex indicate
356 * the beginning and ending indices of field number position->field, if such
357 * a field exists.  This parameter may be NULL, in which case no field
358 * @param status A pointer to an UErrorCode to receive any errors
359 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
360 * @see unum_format
361 * @see unum_formatInt64
362 * @see unum_parse
363 * @see unum_parseInt64
364 * @see unum_parseDouble
365 * @see UFieldPosition
366 * @stable ICU 2.0
367 */
368 U_STABLE int32_t U_EXPORT2
369 unum_formatDouble(    const    UNumberFormat*  fmt,
370             double          number,
371             UChar*          result,
372             int32_t         resultLength,
373             UFieldPosition  *pos, /* 0 if ignore */
374             UErrorCode*     status);
375 
376 /**
377 * Format a decimal number using a UNumberFormat.
378 * The number will be formatted according to the UNumberFormat's locale.
379 * The syntax of the input number is a "numeric string"
380 * as defined in the Decimal Arithmetic Specification, available at
381 * http://speleotrove.com/decimal
382 * @param fmt The formatter to use.
383 * @param number The number to format.
384 * @param length The length of the input number, or -1 if the input is nul-terminated.
385 * @param result A pointer to a buffer to receive the formatted number.
386 * @param resultLength The maximum size of result.
387 * @param pos    A pointer to a UFieldPosition.  On input, position->field
388 *               is read.  On output, position->beginIndex and position->endIndex indicate
389 *               the beginning and ending indices of field number position->field, if such
390 *               a field exists.  This parameter may be NULL, in which case it is ignored.
391 * @param status A pointer to an UErrorCode to receive any errors
392 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
393 * @see unum_format
394 * @see unum_formatInt64
395 * @see unum_parse
396 * @see unum_parseInt64
397 * @see unum_parseDouble
398 * @see UFieldPosition
399 * @draft ICU 4.4
400 */
401 U_DRAFT int32_t U_EXPORT2
402 unum_formatDecimal(    const    UNumberFormat*  fmt,
403             const char *    number,
404             int32_t         length,
405             UChar*          result,
406             int32_t         resultLength,
407             UFieldPosition  *pos, /* 0 if ignore */
408             UErrorCode*     status);
409 
410 /**
411  * Format a double currency amount using a UNumberFormat.
412  * The double will be formatted according to the UNumberFormat's locale.
413  * @param fmt the formatter to use
414  * @param number the number to format
415  * @param currency the 3-letter null-terminated ISO 4217 currency code
416  * @param result a pointer to the buffer to receive the formatted number
417  * @param resultLength the maximum number of UChars to write to result
418  * @param pos a pointer to a UFieldPosition.  On input,
419  * position->field is read.  On output, position->beginIndex and
420  * position->endIndex indicate the beginning and ending indices of
421  * field number position->field, if such a field exists.  This
422  * parameter may be NULL, in which case it is ignored.
423  * @param status a pointer to an input-output UErrorCode
424  * @return the total buffer size needed; if greater than resultLength,
425  * the output was truncated.
426  * @see unum_formatDouble
427  * @see unum_parseDoubleCurrency
428  * @see UFieldPosition
429  * @stable ICU 3.0
430  */
431 U_STABLE int32_t U_EXPORT2
432 unum_formatDoubleCurrency(const UNumberFormat* fmt,
433                           double number,
434                           UChar* currency,
435                           UChar* result,
436                           int32_t resultLength,
437                           UFieldPosition* pos, /* ignored if 0 */
438                           UErrorCode* status);
439 
440 /**
441 * Parse a string into an integer using a UNumberFormat.
442 * The string will be parsed according to the UNumberFormat's locale.
443 * @param fmt The formatter to use.
444 * @param text The text to parse.
445 * @param textLength The length of text, or -1 if null-terminated.
446 * @param parsePos If not 0, on input a pointer to an integer specifying the offset at which
447 * to begin parsing.  If not 0, on output the offset at which parsing ended.
448 * @param status A pointer to an UErrorCode to receive any errors
449 * @return The value of the parsed integer
450 * @see unum_parseInt64
451 * @see unum_parseDouble
452 * @see unum_format
453 * @see unum_formatInt64
454 * @see unum_formatDouble
455 * @stable ICU 2.0
456 */
457 U_STABLE int32_t U_EXPORT2
458 unum_parse(    const   UNumberFormat*  fmt,
459         const   UChar*          text,
460         int32_t         textLength,
461         int32_t         *parsePos /* 0 = start */,
462         UErrorCode      *status);
463 
464 /**
465 * Parse a string into an int64 using a UNumberFormat.
466 * The string will be parsed according to the UNumberFormat's locale.
467 * @param fmt The formatter to use.
468 * @param text The text to parse.
469 * @param textLength The length of text, or -1 if null-terminated.
470 * @param parsePos If not 0, on input a pointer to an integer specifying the offset at which
471 * to begin parsing.  If not 0, on output the offset at which parsing ended.
472 * @param status A pointer to an UErrorCode to receive any errors
473 * @return The value of the parsed integer
474 * @see unum_parse
475 * @see unum_parseDouble
476 * @see unum_format
477 * @see unum_formatInt64
478 * @see unum_formatDouble
479 * @stable ICU 2.8
480 */
481 U_STABLE int64_t U_EXPORT2
482 unum_parseInt64(const UNumberFormat*  fmt,
483         const UChar*  text,
484         int32_t       textLength,
485         int32_t       *parsePos /* 0 = start */,
486         UErrorCode    *status);
487 
488 /**
489 * Parse a string into a double using a UNumberFormat.
490 * The string will be parsed according to the UNumberFormat's locale.
491 * @param fmt The formatter to use.
492 * @param text The text to parse.
493 * @param textLength The length of text, or -1 if null-terminated.
494 * @param parsePos If not 0, on input a pointer to an integer specifying the offset at which
495 * to begin parsing.  If not 0, on output the offset at which parsing ended.
496 * @param status A pointer to an UErrorCode to receive any errors
497 * @return The value of the parsed double
498 * @see unum_parse
499 * @see unum_parseInt64
500 * @see unum_format
501 * @see unum_formatInt64
502 * @see unum_formatDouble
503 * @stable ICU 2.0
504 */
505 U_STABLE double U_EXPORT2
506 unum_parseDouble(    const   UNumberFormat*  fmt,
507             const   UChar*          text,
508             int32_t         textLength,
509             int32_t         *parsePos /* 0 = start */,
510             UErrorCode      *status);
511 
512 
513 /**
514 * Parse a number from a string into an unformatted numeric string using a UNumberFormat.
515 * The input string will be parsed according to the UNumberFormat's locale.
516 * The syntax of the output is a "numeric string"
517 * as defined in the Decimal Arithmetic Specification, available at
518 * http://speleotrove.com/decimal
519 * @param fmt The formatter to use.
520 * @param text The text to parse.
521 * @param textLength The length of text, or -1 if null-terminated.
522 * @param parsePos If not 0, on input a pointer to an integer specifying the offset at which
523 *                 to begin parsing.  If not 0, on output the offset at which parsing ended.
524 * @param outBuf A (char *) buffer to receive the parsed number as a string.  The output string
525 *               will be nul-terminated if there is sufficient space.
526 * @param outBufLength The size of the output buffer.  May be zero, in which case
527 *               the outBuf pointer may be NULL, and the function will return the
528 *               size of the output string.
529 * @param status A pointer to an UErrorCode to receive any errors
530 * @return the length of the output string, not including any terminating nul.
531 * @see unum_parse
532 * @see unum_parseInt64
533 * @see unum_format
534 * @see unum_formatInt64
535 * @see unum_formatDouble
536 * @draft ICU 4.4
537 */
538 U_DRAFT int32_t U_EXPORT2
539 unum_parseDecimal(const   UNumberFormat*  fmt,
540                  const   UChar*          text,
541                          int32_t         textLength,
542                          int32_t         *parsePos /* 0 = start */,
543                          char            *outBuf,
544                          int32_t         outBufLength,
545                          UErrorCode      *status);
546 
547 /**
548  * Parse a string into a double and a currency using a UNumberFormat.
549  * The string will be parsed according to the UNumberFormat's locale.
550  * @param fmt the formatter to use
551  * @param text the text to parse
552  * @param textLength the length of text, or -1 if null-terminated
553  * @param parsePos a pointer to an offset index into text at which to
554  * begin parsing. On output, *parsePos will point after the last
555  * parsed character.  This parameter may be 0, in which case parsing
556  * begins at offset 0.
557  * @param currency a pointer to the buffer to receive the parsed null-
558  * terminated currency.  This buffer must have a capacity of at least
559  * 4 UChars.
560  * @param status a pointer to an input-output UErrorCode
561  * @return the parsed double
562  * @see unum_parseDouble
563  * @see unum_formatDoubleCurrency
564  * @stable ICU 3.0
565  */
566 U_STABLE double U_EXPORT2
567 unum_parseDoubleCurrency(const UNumberFormat* fmt,
568                          const UChar* text,
569                          int32_t textLength,
570                          int32_t* parsePos, /* 0 = start */
571                          UChar* currency,
572                          UErrorCode* status);
573 
574 /**
575  * Set the pattern used by a UNumberFormat.  This can only be used
576  * on a DecimalFormat, other formats return U_ILLEGAL_ARGUMENT_ERROR
577  * in the status.
578  * @param format The formatter to set.
579  * @param localized TRUE if the pattern is localized, FALSE otherwise.
580  * @param pattern The new pattern
581  * @param patternLength The length of pattern, or -1 if null-terminated.
582  * @param parseError A pointer to UParseError to recieve information
583  * about errors occurred during parsing, or NULL if no parse error
584  * information is desired.
585  * @param status A pointer to an input-output UErrorCode.
586  * @see unum_toPattern
587  * @see DecimalFormat
588  * @stable ICU 2.0
589  */
590 U_STABLE void U_EXPORT2
591 unum_applyPattern(          UNumberFormat  *format,
592                             UBool          localized,
593                     const   UChar          *pattern,
594                             int32_t         patternLength,
595                             UParseError    *parseError,
596                             UErrorCode     *status
597                                     );
598 
599 /**
600 * Get a locale for which decimal formatting patterns are available.
601 * A UNumberFormat in a locale returned by this function will perform the correct
602 * formatting and parsing for the locale.  The results of this call are not
603 * valid for rule-based number formats.
604 * @param localeIndex The index of the desired locale.
605 * @return A locale for which number formatting patterns are available, or 0 if none.
606 * @see unum_countAvailable
607 * @stable ICU 2.0
608 */
609 U_STABLE const char* U_EXPORT2
610 unum_getAvailable(int32_t localeIndex);
611 
612 /**
613 * Determine how many locales have decimal formatting patterns available.  The
614 * results of this call are not valid for rule-based number formats.
615 * This function is useful for determining the loop ending condition for
616 * calls to {@link #unum_getAvailable }.
617 * @return The number of locales for which decimal formatting patterns are available.
618 * @see unum_getAvailable
619 * @stable ICU 2.0
620 */
621 U_STABLE int32_t U_EXPORT2
622 unum_countAvailable(void);
623 
624 /** The possible UNumberFormat numeric attributes @stable ICU 2.0 */
625 typedef enum UNumberFormatAttribute {
626   /** Parse integers only */
627   UNUM_PARSE_INT_ONLY,
628   /** Use grouping separator */
629   UNUM_GROUPING_USED,
630   /** Always show decimal point */
631   UNUM_DECIMAL_ALWAYS_SHOWN,
632   /** Maximum integer digits */
633   UNUM_MAX_INTEGER_DIGITS,
634   /** Minimum integer digits */
635   UNUM_MIN_INTEGER_DIGITS,
636   /** Integer digits */
637   UNUM_INTEGER_DIGITS,
638   /** Maximum fraction digits */
639   UNUM_MAX_FRACTION_DIGITS,
640   /** Minimum fraction digits */
641   UNUM_MIN_FRACTION_DIGITS,
642   /** Fraction digits */
643   UNUM_FRACTION_DIGITS,
644   /** Multiplier */
645   UNUM_MULTIPLIER,
646   /** Grouping size */
647   UNUM_GROUPING_SIZE,
648   /** Rounding Mode */
649   UNUM_ROUNDING_MODE,
650   /** Rounding increment */
651   UNUM_ROUNDING_INCREMENT,
652   /** The width to which the output of <code>format()</code> is padded. */
653   UNUM_FORMAT_WIDTH,
654   /** The position at which padding will take place. */
655   UNUM_PADDING_POSITION,
656   /** Secondary grouping size */
657   UNUM_SECONDARY_GROUPING_SIZE,
658   /** Use significant digits
659    * @stable ICU 3.0 */
660   UNUM_SIGNIFICANT_DIGITS_USED,
661   /** Minimum significant digits
662    * @stable ICU 3.0 */
663   UNUM_MIN_SIGNIFICANT_DIGITS,
664   /** Maximum significant digits
665    * @stable ICU 3.0 */
666   UNUM_MAX_SIGNIFICANT_DIGITS,
667   /** Lenient parse mode used by rule-based formats.
668    * @stable ICU 3.0
669    */
670   UNUM_LENIENT_PARSE
671 } UNumberFormatAttribute;
672 
673 /**
674 * Get a numeric attribute associated with a UNumberFormat.
675 * An example of a numeric attribute is the number of integer digits a formatter will produce.
676 * @param fmt The formatter to query.
677 * @param attr The attribute to query; one of UNUM_PARSE_INT_ONLY, UNUM_GROUPING_USED,
678 * UNUM_DECIMAL_ALWAYS_SHOWN, UNUM_MAX_INTEGER_DIGITS, UNUM_MIN_INTEGER_DIGITS, UNUM_INTEGER_DIGITS,
679 * UNUM_MAX_FRACTION_DIGITS, UNUM_MIN_FRACTION_DIGITS, UNUM_FRACTION_DIGITS, UNUM_MULTIPLIER,
680 * UNUM_GROUPING_SIZE, UNUM_ROUNDING_MODE, UNUM_FORMAT_WIDTH, UNUM_PADDING_POSITION, UNUM_SECONDARY_GROUPING_SIZE.
681 * @return The value of attr.
682 * @see unum_setAttribute
683 * @see unum_getDoubleAttribute
684 * @see unum_setDoubleAttribute
685 * @see unum_getTextAttribute
686 * @see unum_setTextAttribute
687 * @stable ICU 2.0
688 */
689 U_STABLE int32_t U_EXPORT2
690 unum_getAttribute(const UNumberFormat*          fmt,
691           UNumberFormatAttribute  attr);
692 
693 /**
694 * Set a numeric attribute associated with a UNumberFormat.
695 * An example of a numeric attribute is the number of integer digits a formatter will produce.  If the
696 * formatter does not understand the attribute, the call is ignored.  Rule-based formatters only understand
697 * the lenient-parse attribute.
698 * @param fmt The formatter to set.
699 * @param attr The attribute to set; one of UNUM_PARSE_INT_ONLY, UNUM_GROUPING_USED,
700 * UNUM_DECIMAL_ALWAYS_SHOWN, UNUM_MAX_INTEGER_DIGITS, UNUM_MIN_INTEGER_DIGITS, UNUM_INTEGER_DIGITS,
701 * UNUM_MAX_FRACTION_DIGITS, UNUM_MIN_FRACTION_DIGITS, UNUM_FRACTION_DIGITS, UNUM_MULTIPLIER,
702 * UNUM_GROUPING_SIZE, UNUM_ROUNDING_MODE, UNUM_FORMAT_WIDTH, UNUM_PADDING_POSITION, UNUM_SECONDARY_GROUPING_SIZE,
703 * or UNUM_LENIENT_PARSE.
704 * @param newValue The new value of attr.
705 * @see unum_getAttribute
706 * @see unum_getDoubleAttribute
707 * @see unum_setDoubleAttribute
708 * @see unum_getTextAttribute
709 * @see unum_setTextAttribute
710 * @stable ICU 2.0
711 */
712 U_STABLE void U_EXPORT2
713 unum_setAttribute(    UNumberFormat*          fmt,
714             UNumberFormatAttribute  attr,
715             int32_t                 newValue);
716 
717 
718 /**
719 * Get a numeric attribute associated with a UNumberFormat.
720 * An example of a numeric attribute is the number of integer digits a formatter will produce.
721 * If the formatter does not understand the attribute, -1 is returned.
722 * @param fmt The formatter to query.
723 * @param attr The attribute to query; e.g. UNUM_ROUNDING_INCREMENT.
724 * @return The value of attr.
725 * @see unum_getAttribute
726 * @see unum_setAttribute
727 * @see unum_setDoubleAttribute
728 * @see unum_getTextAttribute
729 * @see unum_setTextAttribute
730 * @stable ICU 2.0
731 */
732 U_STABLE double U_EXPORT2
733 unum_getDoubleAttribute(const UNumberFormat*          fmt,
734           UNumberFormatAttribute  attr);
735 
736 /**
737 * Set a numeric attribute associated with a UNumberFormat.
738 * An example of a numeric attribute is the number of integer digits a formatter will produce.
739 * If the formatter does not understand the attribute, this call is ignored.
740 * @param fmt The formatter to set.
741 * @param attr The attribute to set; e.g. UNUM_ROUNDING_INCREMENT.
742 * @param newValue The new value of attr.
743 * @see unum_getAttribute
744 * @see unum_setAttribute
745 * @see unum_getDoubleAttribute
746 * @see unum_getTextAttribute
747 * @see unum_setTextAttribute
748 * @stable ICU 2.0
749 */
750 U_STABLE void U_EXPORT2
751 unum_setDoubleAttribute(    UNumberFormat*          fmt,
752             UNumberFormatAttribute  attr,
753             double                 newValue);
754 
755 /** The possible UNumberFormat text attributes @stable ICU 2.0*/
756 typedef enum UNumberFormatTextAttribute {
757   /** Positive prefix */
758   UNUM_POSITIVE_PREFIX,
759   /** Positive suffix */
760   UNUM_POSITIVE_SUFFIX,
761   /** Negative prefix */
762   UNUM_NEGATIVE_PREFIX,
763   /** Negative suffix */
764   UNUM_NEGATIVE_SUFFIX,
765   /** The character used to pad to the format width. */
766   UNUM_PADDING_CHARACTER,
767   /** The ISO currency code */
768   UNUM_CURRENCY_CODE,
769   /**
770    * The default rule set.  This is only available with rule-based formatters.
771    * @stable ICU 3.0
772    */
773   UNUM_DEFAULT_RULESET,
774   /**
775    * The public rule sets.  This is only available with rule-based formatters.
776    * This is a read-only attribute.  The public rulesets are returned as a
777    * single string, with each ruleset name delimited by ';' (semicolon).
778    * @stable ICU 3.0
779    */
780   UNUM_PUBLIC_RULESETS
781 } UNumberFormatTextAttribute;
782 
783 /**
784 * Get a text attribute associated with a UNumberFormat.
785 * An example of a text attribute is the suffix for positive numbers.  If the formatter
786 * does not understand the attributre, U_UNSUPPORTED_ERROR is returned as the status.
787 * Rule-based formatters only understand UNUM_DEFAULT_RULESET and UNUM_PUBLIC_RULESETS.
788 * @param fmt The formatter to query.
789 * @param tag The attribute to query; one of UNUM_POSITIVE_PREFIX, UNUM_POSITIVE_SUFFIX,
790 * UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX, UNUM_PADDING_CHARACTER, UNUM_CURRENCY_CODE,
791 * UNUM_DEFAULT_RULESET, or UNUM_PUBLIC_RULESETS.
792 * @param result A pointer to a buffer to receive the attribute.
793 * @param resultLength The maximum size of result.
794 * @param status A pointer to an UErrorCode to receive any errors
795 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
796 * @see unum_setTextAttribute
797 * @see unum_getAttribute
798 * @see unum_setAttribute
799 * @stable ICU 2.0
800 */
801 U_STABLE int32_t U_EXPORT2
802 unum_getTextAttribute(    const    UNumberFormat*                    fmt,
803             UNumberFormatTextAttribute      tag,
804             UChar*                            result,
805             int32_t                            resultLength,
806             UErrorCode*                        status);
807 
808 /**
809 * Set a text attribute associated with a UNumberFormat.
810 * An example of a text attribute is the suffix for positive numbers.  Rule-based formatters
811 * only understand UNUM_DEFAULT_RULESET.
812 * @param fmt The formatter to set.
813 * @param tag The attribute to set; one of UNUM_POSITIVE_PREFIX, UNUM_POSITIVE_SUFFIX,
814 * UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX, UNUM_PADDING_CHARACTER, UNUM_CURRENCY_CODE,
815 * or UNUM_DEFAULT_RULESET.
816 * @param newValue The new value of attr.
817 * @param newValueLength The length of newValue, or -1 if null-terminated.
818 * @param status A pointer to an UErrorCode to receive any errors
819 * @see unum_getTextAttribute
820 * @see unum_getAttribute
821 * @see unum_setAttribute
822 * @stable ICU 2.0
823 */
824 U_STABLE void U_EXPORT2
825 unum_setTextAttribute(    UNumberFormat*                    fmt,
826             UNumberFormatTextAttribute      tag,
827             const    UChar*                            newValue,
828             int32_t                            newValueLength,
829             UErrorCode                        *status);
830 
831 /**
832  * Extract the pattern from a UNumberFormat.  The pattern will follow
833  * the DecimalFormat pattern syntax.
834  * @param fmt The formatter to query.
835  * @param isPatternLocalized TRUE if the pattern should be localized,
836  * FALSE otherwise.  This is ignored if the formatter is a rule-based
837  * formatter.
838  * @param result A pointer to a buffer to receive the pattern.
839  * @param resultLength The maximum size of result.
840  * @param status A pointer to an input-output UErrorCode.
841  * @return The total buffer size needed; if greater than resultLength,
842  * the output was truncated.
843  * @see unum_applyPattern
844  * @see DecimalFormat
845  * @stable ICU 2.0
846  */
847 U_STABLE int32_t U_EXPORT2
848 unum_toPattern(    const    UNumberFormat*          fmt,
849         UBool                  isPatternLocalized,
850         UChar*                  result,
851         int32_t                 resultLength,
852         UErrorCode*             status);
853 
854 
855 /**
856  * Constants for specifying a number format symbol.
857  * @stable ICU 2.0
858  */
859 typedef enum UNumberFormatSymbol {
860   /** The decimal separator */
861   UNUM_DECIMAL_SEPARATOR_SYMBOL = 0,
862   /** The grouping separator */
863   UNUM_GROUPING_SEPARATOR_SYMBOL = 1,
864   /** The pattern separator */
865   UNUM_PATTERN_SEPARATOR_SYMBOL = 2,
866   /** The percent sign */
867   UNUM_PERCENT_SYMBOL = 3,
868   /** Zero*/
869   UNUM_ZERO_DIGIT_SYMBOL = 4,
870   /** Character representing a digit in the pattern */
871   UNUM_DIGIT_SYMBOL = 5,
872   /** The minus sign */
873   UNUM_MINUS_SIGN_SYMBOL = 6,
874   /** The plus sign */
875   UNUM_PLUS_SIGN_SYMBOL = 7,
876   /** The currency symbol */
877   UNUM_CURRENCY_SYMBOL = 8,
878   /** The international currency symbol */
879   UNUM_INTL_CURRENCY_SYMBOL = 9,
880   /** The monetary separator */
881   UNUM_MONETARY_SEPARATOR_SYMBOL = 10,
882   /** The exponential symbol */
883   UNUM_EXPONENTIAL_SYMBOL = 11,
884   /** Per mill symbol */
885   UNUM_PERMILL_SYMBOL = 12,
886   /** Escape padding character */
887   UNUM_PAD_ESCAPE_SYMBOL = 13,
888   /** Infinity symbol */
889   UNUM_INFINITY_SYMBOL = 14,
890   /** Nan symbol */
891   UNUM_NAN_SYMBOL = 15,
892   /** Significant digit symbol
893    * @stable ICU 3.0 */
894   UNUM_SIGNIFICANT_DIGIT_SYMBOL = 16,
895   /** The monetary grouping separator
896    * @stable ICU 3.6
897    */
898   UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL = 17,
899   /** count symbol constants */
900   UNUM_FORMAT_SYMBOL_COUNT = 18
901 } UNumberFormatSymbol;
902 
903 /**
904 * Get a symbol associated with a UNumberFormat.
905 * A UNumberFormat uses symbols to represent the special locale-dependent
906 * characters in a number, for example the percent sign. This API is not
907 * supported for rule-based formatters.
908 * @param fmt The formatter to query.
909 * @param symbol The UNumberFormatSymbol constant for the symbol to get
910 * @param buffer The string buffer that will receive the symbol string;
911 *               if it is NULL, then only the length of the symbol is returned
912 * @param size The size of the string buffer
913 * @param status A pointer to an UErrorCode to receive any errors
914 * @return The length of the symbol; the buffer is not modified if
915 *         <code>length&gt;=size</code>
916 * @see unum_setSymbol
917 * @stable ICU 2.0
918 */
919 U_STABLE int32_t U_EXPORT2
920 unum_getSymbol(const UNumberFormat *fmt,
921                UNumberFormatSymbol symbol,
922                UChar *buffer,
923                int32_t size,
924                UErrorCode *status);
925 
926 /**
927 * Set a symbol associated with a UNumberFormat.
928 * A UNumberFormat uses symbols to represent the special locale-dependent
929 * characters in a number, for example the percent sign.  This API is not
930 * supported for rule-based formatters.
931 * @param fmt The formatter to set.
932 * @param symbol The UNumberFormatSymbol constant for the symbol to set
933 * @param value The string to set the symbol to
934 * @param length The length of the string, or -1 for a zero-terminated string
935 * @param status A pointer to an UErrorCode to receive any errors.
936 * @see unum_getSymbol
937 * @stable ICU 2.0
938 */
939 U_STABLE void U_EXPORT2
940 unum_setSymbol(UNumberFormat *fmt,
941                UNumberFormatSymbol symbol,
942                const UChar *value,
943                int32_t length,
944                UErrorCode *status);
945 
946 
947 /**
948  * Get the locale for this number format object.
949  * You can choose between valid and actual locale.
950  * @param fmt The formatter to get the locale from
951  * @param type type of the locale we're looking for (valid or actual)
952  * @param status error code for the operation
953  * @return the locale name
954  * @stable ICU 2.8
955  */
956 U_STABLE const char* U_EXPORT2
957 unum_getLocaleByType(const UNumberFormat *fmt,
958                      ULocDataLocaleType type,
959                      UErrorCode* status);
960 
961 #endif /* #if !UCONFIG_NO_FORMATTING */
962 
963 #endif
964