1 // 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************** 5 * Copyright (C) 1997-2016, International Business Machines Corporation and others. 6 * All Rights Reserved. 7 ******************************************************************************** 8 * 9 * File NUMFMT.H 10 * 11 * Modification History: 12 * 13 * Date Name Description 14 * 02/19/97 aliu Converted from java. 15 * 03/18/97 clhuang Updated per C++ implementation. 16 * 04/17/97 aliu Changed DigitCount to int per code review. 17 * 07/20/98 stephen JDK 1.2 sync up. Added scientific support. 18 * Changed naming conventions to match C++ guidelines 19 * Derecated Java style constants (eg, INTEGER_FIELD) 20 ******************************************************************************** 21 */ 22 23 #ifndef NUMFMT_H 24 #define NUMFMT_H 25 26 27 #include "unicode/utypes.h" 28 29 /** 30 * \file 31 * \brief C++ API: Compatibility APIs for number formatting. 32 */ 33 34 #if !UCONFIG_NO_FORMATTING 35 36 #include "unicode/unistr.h" 37 #include "unicode/format.h" 38 #include "unicode/unum.h" // UNumberFormatStyle 39 #include "unicode/locid.h" 40 #include "unicode/stringpiece.h" 41 #include "unicode/curramt.h" 42 #include "unicode/udisplaycontext.h" 43 44 class NumberFormatTest; 45 46 U_NAMESPACE_BEGIN 47 48 class SharedNumberFormat; 49 50 #if !UCONFIG_NO_SERVICE 51 class NumberFormatFactory; 52 class StringEnumeration; 53 #endif 54 55 /** 56 * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if 57 * numberformatter.h fits their use case. Although not deprecated, this header 58 * is provided for backwards compatibility only. 59 * 60 * Abstract base class for all number formats. Provides interface for 61 * formatting and parsing a number. Also provides methods for 62 * determining which locales have number formats, and what their names 63 * are. 64 * 65 * \headerfile unicode/numfmt.h "unicode/numfmt.h" 66 * <P> 67 * NumberFormat helps you to format and parse numbers for any locale. 68 * Your code can be completely independent of the locale conventions 69 * for decimal points, thousands-separators, or even the particular 70 * decimal digits used, or whether the number format is even decimal. 71 * <P> 72 * To format a number for the current Locale, use one of the static 73 * factory methods: 74 * \code 75 * #include <iostream> 76 * #include "unicode/numfmt.h" 77 * #include "unicode/unistr.h" 78 * #include "unicode/ustream.h" 79 * using namespace std; 80 * 81 * int main() { 82 * double myNumber = 7.0; 83 * UnicodeString myString; 84 * UErrorCode success = U_ZERO_ERROR; 85 * NumberFormat* nf = NumberFormat::createInstance(success); 86 * nf->format(myNumber, myString); 87 * cout << " Example 1: " << myString << endl; 88 * } 89 * \endcode 90 * Note that there are additional factory methods within subclasses of 91 * NumberFormat. 92 * <P> 93 * If you are formatting multiple numbers, it is more efficient to get 94 * the format and use it multiple times so that the system doesn't 95 * have to fetch the information about the local language and country 96 * conventions multiple times. 97 * \code 98 * UnicodeString myString; 99 * UErrorCode success = U_ZERO_ERROR; 100 * NumberFormat *nf = NumberFormat::createInstance( success ); 101 * for (int32_t number: {123, 3333, -1234567}) { 102 * nf->format(number, myString); 103 * myString += "; "; 104 * } 105 * cout << " Example 2: " << myString << endl; 106 * \endcode 107 * To format a number for a different Locale, specify it in the 108 * call to \c createInstance(). 109 * \code 110 * nf = NumberFormat::createInstance(Locale::getFrench(), success); 111 * \endcode 112 * You can use a \c NumberFormat to parse also. 113 * \code 114 * UErrorCode success; 115 * Formattable result(-999); // initialized with error code 116 * nf->parse(myString, result, success); 117 * \endcode 118 * Use \c createInstance() to get the normal number format for a \c Locale. 119 * There are other static factory methods available. Use \c createCurrencyInstance() 120 * to get the currency number format for that country. Use \c createPercentInstance() 121 * to get a format for displaying percentages. With this format, a 122 * fraction from 0.53 is displayed as 53%. 123 * <P> 124 * The type of number formatting can be specified by passing a 'style' parameter to \c createInstance(). 125 * For example, use\n 126 * \c createInstance(locale, UNUM_DECIMAL, errorCode) to get the normal number format,\n 127 * \c createInstance(locale, UNUM_PERCENT, errorCode) to get a format for displaying percentage,\n 128 * \c createInstance(locale, UNUM_SCIENTIFIC, errorCode) to get a format for displaying scientific number,\n 129 * \c createInstance(locale, UNUM_CURRENCY, errorCode) to get the currency number format, 130 * in which the currency is represented by its symbol, for example, "$3.00".\n 131 * \c createInstance(locale, UNUM_CURRENCY_ISO, errorCode) to get the currency number format, 132 * in which the currency is represented by its ISO code, for example "USD3.00".\n 133 * \c createInstance(locale, UNUM_CURRENCY_PLURAL, errorCode) to get the currency number format, 134 * in which the currency is represented by its full name in plural format, 135 * for example, "3.00 US dollars" or "1.00 US dollar". 136 * <P> 137 * You can also control the display of numbers with such methods as 138 * \c getMinimumFractionDigits(). If you want even more control over the 139 * format or parsing, or want to give your users more control, you can 140 * try dynamic_casting the \c NumberFormat you get from the factory methods to a 141 * \c DecimalFormat. This will work for the vast majority of 142 * countries; just remember to test for NULL in case you 143 * encounter an unusual one. 144 * <P> 145 * You can also use forms of the parse and format methods with 146 * \c ParsePosition and \c FieldPosition to allow you to: 147 * <ul type=round> 148 * <li>(a) progressively parse through pieces of a string. 149 * <li>(b) align the decimal point and other areas. 150 * </ul> 151 * For example, you can align numbers in two ways. 152 * <P> 153 * If you are using a monospaced font with spacing for alignment, you 154 * can pass the \c FieldPosition in your format call, with field = 155 * \c UNUM_INTEGER_FIELD. On output, \c getEndIndex will be set to the offset 156 * between the last character of the integer and the decimal. Add 157 * (desiredSpaceCount - getEndIndex) spaces at the front of the 158 * string. 159 * <P> 160 * If you are using proportional fonts, instead of padding with 161 * spaces, measure the width of the string in pixels from the start to 162 * getEndIndex. Then move the pen by (desiredPixelWidth - 163 * widthToAlignmentPoint) before drawing the text. It also works 164 * where there is no decimal, but possibly additional characters at 165 * the end, e.g. with parentheses in negative numbers: "(12)" for -12. 166 * <p> 167 * <em>User subclasses are not supported.</em> While clients may write 168 * subclasses, such code will not necessarily work and will not be 169 * guaranteed to work stably from release to release. 170 * 171 * @stable ICU 2.0 172 */ 173 class U_I18N_API NumberFormat : public Format { 174 public: 175 /** 176 * Rounding mode. 177 * 178 * <p> 179 * For more detail on rounding modes, see: 180 * http://userguide.icu-project.org/formatparse/numbers/rounding-modes 181 * 182 * @stable ICU 2.4 183 */ 184 enum ERoundingMode { 185 kRoundCeiling, /**< Round towards positive infinity */ 186 kRoundFloor, /**< Round towards negative infinity */ 187 kRoundDown, /**< Round towards zero */ 188 kRoundUp, /**< Round away from zero */ 189 kRoundHalfEven, /**< Round towards the nearest integer, or 190 towards the nearest even integer if equidistant */ 191 kRoundHalfDown, /**< Round towards the nearest integer, or 192 towards zero if equidistant */ 193 kRoundHalfUp, /**< Round towards the nearest integer, or 194 away from zero if equidistant */ 195 /** 196 * Return U_FORMAT_INEXACT_ERROR if number does not format exactly. 197 * @stable ICU 4.8 198 */ 199 kRoundUnnecessary 200 }; 201 202 /** 203 * Alignment Field constants used to construct a FieldPosition object. 204 * Signifies that the position of the integer part or fraction part of 205 * a formatted number should be returned. 206 * 207 * Note: as of ICU 4.4, the values in this enum have been extended to 208 * support identification of all number format fields, not just those 209 * pertaining to alignment. 210 * 211 * These constants are provided for backwards compatibility only. 212 * Please use the C style constants defined in the header file unum.h. 213 * 214 * @see FieldPosition 215 * @stable ICU 2.0 216 */ 217 enum EAlignmentFields { 218 /** @stable ICU 2.0 */ 219 kIntegerField = UNUM_INTEGER_FIELD, 220 /** @stable ICU 2.0 */ 221 kFractionField = UNUM_FRACTION_FIELD, 222 /** @stable ICU 2.0 */ 223 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD, 224 /** @stable ICU 2.0 */ 225 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD, 226 /** @stable ICU 2.0 */ 227 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD, 228 /** @stable ICU 2.0 */ 229 kExponentField = UNUM_EXPONENT_FIELD, 230 /** @stable ICU 2.0 */ 231 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD, 232 /** @stable ICU 2.0 */ 233 kCurrencyField = UNUM_CURRENCY_FIELD, 234 /** @stable ICU 2.0 */ 235 kPercentField = UNUM_PERCENT_FIELD, 236 /** @stable ICU 2.0 */ 237 kPermillField = UNUM_PERMILL_FIELD, 238 /** @stable ICU 2.0 */ 239 kSignField = UNUM_SIGN_FIELD, 240 241 /** 242 * These constants are provided for backwards compatibility only. 243 * Please use the constants defined in the header file unum.h. 244 */ 245 /** @stable ICU 2.0 */ 246 INTEGER_FIELD = UNUM_INTEGER_FIELD, 247 /** @stable ICU 2.0 */ 248 FRACTION_FIELD = UNUM_FRACTION_FIELD 249 }; 250 251 /** 252 * Destructor. 253 * @stable ICU 2.0 254 */ 255 virtual ~NumberFormat(); 256 257 /** 258 * Return true if the given Format objects are semantically equal. 259 * Objects of different subclasses are considered unequal. 260 * @return true if the given Format objects are semantically equal. 261 * @stable ICU 2.0 262 */ 263 virtual UBool operator==(const Format& other) const; 264 265 266 using Format::format; 267 268 /** 269 * Format an object to produce a string. This method handles 270 * Formattable objects with numeric types. If the Formattable 271 * object type is not a numeric type, then it returns a failing 272 * UErrorCode. 273 * 274 * @param obj The object to format. 275 * @param appendTo Output parameter to receive result. 276 * Result is appended to existing contents. 277 * @param pos On input: an alignment field, if desired. 278 * On output: the offsets of the alignment field. 279 * @param status Output param filled with success/failure status. 280 * @return Reference to 'appendTo' parameter. 281 * @stable ICU 2.0 282 */ 283 virtual UnicodeString& format(const Formattable& obj, 284 UnicodeString& appendTo, 285 FieldPosition& pos, 286 UErrorCode& status) const; 287 288 /** 289 * Format an object to produce a string. This method handles 290 * Formattable objects with numeric types. If the Formattable 291 * object type is not a numeric type, then it returns a failing 292 * UErrorCode. 293 * 294 * @param obj The object to format. 295 * @param appendTo Output parameter to receive result. 296 * Result is appended to existing contents. 297 * @param posIter On return, can be used to iterate over positions 298 * of fields generated by this format call. Can be 299 * NULL. 300 * @param status Output param filled with success/failure status. 301 * @return Reference to 'appendTo' parameter. 302 * @stable ICU 4.4 303 */ 304 virtual UnicodeString& format(const Formattable& obj, 305 UnicodeString& appendTo, 306 FieldPositionIterator* posIter, 307 UErrorCode& status) const; 308 309 /** 310 * Parse a string to produce an object. This methods handles 311 * parsing of numeric strings into Formattable objects with numeric 312 * types. 313 * <P> 314 * Before calling, set parse_pos.index to the offset you want to 315 * start parsing at in the source. After calling, parse_pos.index 316 * indicates the position after the successfully parsed text. If 317 * an error occurs, parse_pos.index is unchanged. 318 * <P> 319 * When parsing, leading whitespace is discarded (with successful 320 * parse), while trailing whitespace is left as is. 321 * <P> 322 * See Format::parseObject() for more. 323 * 324 * @param source The string to be parsed into an object. 325 * @param result Formattable to be set to the parse result. 326 * If parse fails, return contents are undefined. 327 * @param parse_pos The position to start parsing at. Upon return 328 * this param is set to the position after the 329 * last character successfully parsed. If the 330 * source is not parsed successfully, this param 331 * will remain unchanged. 332 * @return A newly created Formattable* object, or NULL 333 * on failure. The caller owns this and should 334 * delete it when done. 335 * @stable ICU 2.0 336 */ 337 virtual void parseObject(const UnicodeString& source, 338 Formattable& result, 339 ParsePosition& parse_pos) const; 340 341 /** 342 * Format a double number. These methods call the NumberFormat 343 * pure virtual format() methods with the default FieldPosition. 344 * 345 * @param number The value to be formatted. 346 * @param appendTo Output parameter to receive result. 347 * Result is appended to existing contents. 348 * @return Reference to 'appendTo' parameter. 349 * @stable ICU 2.0 350 */ 351 UnicodeString& format( double number, 352 UnicodeString& appendTo) const; 353 354 /** 355 * Format a long number. These methods call the NumberFormat 356 * pure virtual format() methods with the default FieldPosition. 357 * 358 * @param number The value to be formatted. 359 * @param appendTo Output parameter to receive result. 360 * Result is appended to existing contents. 361 * @return Reference to 'appendTo' parameter. 362 * @stable ICU 2.0 363 */ 364 UnicodeString& format( int32_t number, 365 UnicodeString& appendTo) const; 366 367 /** 368 * Format an int64 number. These methods call the NumberFormat 369 * pure virtual format() methods with the default FieldPosition. 370 * 371 * @param number The value to be formatted. 372 * @param appendTo Output parameter to receive result. 373 * Result is appended to existing contents. 374 * @return Reference to 'appendTo' parameter. 375 * @stable ICU 2.8 376 */ 377 UnicodeString& format( int64_t number, 378 UnicodeString& appendTo) const; 379 380 /** 381 * Format a double number. Concrete subclasses must implement 382 * these pure virtual methods. 383 * 384 * @param number The value to be formatted. 385 * @param appendTo Output parameter to receive result. 386 * Result is appended to existing contents. 387 * @param pos On input: an alignment field, if desired. 388 * On output: the offsets of the alignment field. 389 * @return Reference to 'appendTo' parameter. 390 * @stable ICU 2.0 391 */ 392 virtual UnicodeString& format(double number, 393 UnicodeString& appendTo, 394 FieldPosition& pos) const = 0; 395 /** 396 * Format a double number. By default, the parent function simply 397 * calls the base class and does not return an error status. 398 * Therefore, the status may be ignored in some subclasses. 399 * 400 * @param number The value to be formatted. 401 * @param appendTo Output parameter to receive result. 402 * Result is appended to existing contents. 403 * @param pos On input: an alignment field, if desired. 404 * On output: the offsets of the alignment field. 405 * @param status error status 406 * @return Reference to 'appendTo' parameter. 407 * @internal 408 */ 409 virtual UnicodeString& format(double number, 410 UnicodeString& appendTo, 411 FieldPosition& pos, 412 UErrorCode &status) const; 413 /** 414 * Format a double number. Subclasses must implement 415 * this method. 416 * 417 * @param number The value to be formatted. 418 * @param appendTo Output parameter to receive result. 419 * Result is appended to existing contents. 420 * @param posIter On return, can be used to iterate over positions 421 * of fields generated by this format call. 422 * Can be NULL. 423 * @param status Output param filled with success/failure status. 424 * @return Reference to 'appendTo' parameter. 425 * @stable ICU 4.4 426 */ 427 virtual UnicodeString& format(double number, 428 UnicodeString& appendTo, 429 FieldPositionIterator* posIter, 430 UErrorCode& status) const; 431 /** 432 * Format a long number. Concrete subclasses must implement 433 * these pure virtual methods. 434 * 435 * @param number The value to be formatted. 436 * @param appendTo Output parameter to receive result. 437 * Result is appended to existing contents. 438 * @param pos On input: an alignment field, if desired. 439 * On output: the offsets of the alignment field. 440 * @return Reference to 'appendTo' parameter. 441 * @stable ICU 2.0 442 */ 443 virtual UnicodeString& format(int32_t number, 444 UnicodeString& appendTo, 445 FieldPosition& pos) const = 0; 446 447 /** 448 * Format a long number. Concrete subclasses may override 449 * this function to provide status return. 450 * 451 * @param number The value to be formatted. 452 * @param appendTo Output parameter to receive result. 453 * Result is appended to existing contents. 454 * @param pos On input: an alignment field, if desired. 455 * On output: the offsets of the alignment field. 456 * @param status the output status. 457 * @return Reference to 'appendTo' parameter. 458 * @internal 459 */ 460 virtual UnicodeString& format(int32_t number, 461 UnicodeString& appendTo, 462 FieldPosition& pos, 463 UErrorCode &status) const; 464 465 /** 466 * Format an int32 number. Subclasses must implement 467 * this method. 468 * 469 * @param number The value to be formatted. 470 * @param appendTo Output parameter to receive result. 471 * Result is appended to existing contents. 472 * @param posIter On return, can be used to iterate over positions 473 * of fields generated by this format call. 474 * Can be NULL. 475 * @param status Output param filled with success/failure status. 476 * @return Reference to 'appendTo' parameter. 477 * @stable ICU 4.4 478 */ 479 virtual UnicodeString& format(int32_t number, 480 UnicodeString& appendTo, 481 FieldPositionIterator* posIter, 482 UErrorCode& status) const; 483 /** 484 * Format an int64 number. (Not abstract to retain compatibility 485 * with earlier releases, however subclasses should override this 486 * method as it just delegates to format(int32_t number...); 487 * 488 * @param number The value to be formatted. 489 * @param appendTo Output parameter to receive result. 490 * Result is appended to existing contents. 491 * @param pos On input: an alignment field, if desired. 492 * On output: the offsets of the alignment field. 493 * @return Reference to 'appendTo' parameter. 494 * @stable ICU 2.8 495 */ 496 virtual UnicodeString& format(int64_t number, 497 UnicodeString& appendTo, 498 FieldPosition& pos) const; 499 500 /** 501 * Format an int64 number. (Not abstract to retain compatibility 502 * with earlier releases, however subclasses should override this 503 * method as it just delegates to format(int32_t number...); 504 * 505 * @param number The value to be formatted. 506 * @param appendTo Output parameter to receive result. 507 * Result is appended to existing contents. 508 * @param pos On input: an alignment field, if desired. 509 * On output: the offsets of the alignment field. 510 * @param status Output param filled with success/failure status. 511 * @return Reference to 'appendTo' parameter. 512 * @internal 513 */ 514 virtual UnicodeString& format(int64_t number, 515 UnicodeString& appendTo, 516 FieldPosition& pos, 517 UErrorCode& status) const; 518 /** 519 * Format an int64 number. Subclasses must implement 520 * this method. 521 * 522 * @param number The value to be formatted. 523 * @param appendTo Output parameter to receive result. 524 * Result is appended to existing contents. 525 * @param posIter On return, can be used to iterate over positions 526 * of fields generated by this format call. 527 * Can be NULL. 528 * @param status Output param filled with success/failure status. 529 * @return Reference to 'appendTo' parameter. 530 * @stable ICU 4.4 531 */ 532 virtual UnicodeString& format(int64_t number, 533 UnicodeString& appendTo, 534 FieldPositionIterator* posIter, 535 UErrorCode& status) const; 536 537 /** 538 * Format a decimal number. Subclasses must implement 539 * this method. The syntax of the unformatted number is a "numeric string" 540 * as defined in the Decimal Arithmetic Specification, available at 541 * http://speleotrove.com/decimal 542 * 543 * @param number The unformatted number, as a string, to be formatted. 544 * @param appendTo Output parameter to receive result. 545 * Result is appended to existing contents. 546 * @param posIter On return, can be used to iterate over positions 547 * of fields generated by this format call. 548 * Can be NULL. 549 * @param status Output param filled with success/failure status. 550 * @return Reference to 'appendTo' parameter. 551 * @stable ICU 4.4 552 */ 553 virtual UnicodeString& format(StringPiece number, 554 UnicodeString& appendTo, 555 FieldPositionIterator* posIter, 556 UErrorCode& status) const; 557 558 // Can't use #ifndef U_HIDE_INTERNAL_API because these are virtual methods 559 560 /** 561 * Format a decimal number. 562 * The number is a DecimalQuantity wrapper onto a floating point decimal number. 563 * The default implementation in NumberFormat converts the decimal number 564 * to a double and formats that. Subclasses of NumberFormat that want 565 * to specifically handle big decimal numbers must override this method. 566 * class DecimalFormat does so. 567 * 568 * @param number The number, a DecimalQuantity format Decimal Floating Point. 569 * @param appendTo Output parameter to receive result. 570 * Result is appended to existing contents. 571 * @param posIter On return, can be used to iterate over positions 572 * of fields generated by this format call. 573 * @param status Output param filled with success/failure status. 574 * @return Reference to 'appendTo' parameter. 575 * @internal 576 */ 577 virtual UnicodeString& format(const number::impl::DecimalQuantity &number, 578 UnicodeString& appendTo, 579 FieldPositionIterator* posIter, 580 UErrorCode& status) const; 581 582 /** 583 * Format a decimal number. 584 * The number is a DecimalQuantity wrapper onto a floating point decimal number. 585 * The default implementation in NumberFormat converts the decimal number 586 * to a double and formats that. Subclasses of NumberFormat that want 587 * to specifically handle big decimal numbers must override this method. 588 * class DecimalFormat does so. 589 * 590 * @param number The number, a DecimalQuantity format Decimal Floating Point. 591 * @param appendTo Output parameter to receive result. 592 * Result is appended to existing contents. 593 * @param pos On input: an alignment field, if desired. 594 * On output: the offsets of the alignment field. 595 * @param status Output param filled with success/failure status. 596 * @return Reference to 'appendTo' parameter. 597 * @internal 598 */ 599 virtual UnicodeString& format(const number::impl::DecimalQuantity &number, 600 UnicodeString& appendTo, 601 FieldPosition& pos, 602 UErrorCode& status) const; 603 604 /** 605 * Return a long if possible (e.g. within range LONG_MAX, 606 * LONG_MAX], and with no decimals), otherwise a double. If 607 * IntegerOnly is set, will stop at a decimal point (or equivalent; 608 * e.g. for rational numbers "1 2/3", will stop after the 1). 609 * <P> 610 * If no object can be parsed, index is unchanged, and NULL is 611 * returned. 612 * <P> 613 * This is a pure virtual which concrete subclasses must implement. 614 * 615 * @param text The text to be parsed. 616 * @param result Formattable to be set to the parse result. 617 * If parse fails, return contents are undefined. 618 * @param parsePosition The position to start parsing at on input. 619 * On output, moved to after the last successfully 620 * parse character. On parse failure, does not change. 621 * @stable ICU 2.0 622 */ 623 virtual void parse(const UnicodeString& text, 624 Formattable& result, 625 ParsePosition& parsePosition) const = 0; 626 627 /** 628 * Parse a string as a numeric value, and return a Formattable 629 * numeric object. This method parses integers only if IntegerOnly 630 * is set. 631 * 632 * @param text The text to be parsed. 633 * @param result Formattable to be set to the parse result. 634 * If parse fails, return contents are undefined. 635 * @param status Output parameter set to a failure error code 636 * when a failure occurs. 637 * @see NumberFormat::isParseIntegerOnly 638 * @stable ICU 2.0 639 */ 640 virtual void parse(const UnicodeString& text, 641 Formattable& result, 642 UErrorCode& status) const; 643 644 /** 645 * Parses text from the given string as a currency amount. Unlike 646 * the parse() method, this method will attempt to parse a generic 647 * currency name, searching for a match of this object's locale's 648 * currency display names, or for a 3-letter ISO currency code. 649 * This method will fail if this format is not a currency format, 650 * that is, if it does not contain the currency pattern symbol 651 * (U+00A4) in its prefix or suffix. 652 * 653 * @param text the string to parse 654 * @param pos input-output position; on input, the position within text 655 * to match; must have 0 <= pos.getIndex() < text.length(); 656 * on output, the position after the last matched character. 657 * If the parse fails, the position in unchanged upon output. 658 * @return if parse succeeds, a pointer to a newly-created CurrencyAmount 659 * object (owned by the caller) containing information about 660 * the parsed currency; if parse fails, this is NULL. 661 * @stable ICU 49 662 */ 663 virtual CurrencyAmount* parseCurrency(const UnicodeString& text, 664 ParsePosition& pos) const; 665 666 /** 667 * Return true if this format will parse numbers as integers 668 * only. For example in the English locale, with ParseIntegerOnly 669 * true, the string "1234." would be parsed as the integer value 670 * 1234 and parsing would stop at the "." character. Of course, 671 * the exact format accepted by the parse operation is locale 672 * dependant and determined by sub-classes of NumberFormat. 673 * @return true if this format will parse numbers as integers 674 * only. 675 * @stable ICU 2.0 676 */ 677 UBool isParseIntegerOnly(void) const; 678 679 /** 680 * Sets whether or not numbers should be parsed as integers only. 681 * @param value set True, this format will parse numbers as integers 682 * only. 683 * @see isParseIntegerOnly 684 * @stable ICU 2.0 685 */ 686 virtual void setParseIntegerOnly(UBool value); 687 688 /** 689 * Sets whether lenient parsing should be enabled (it is off by default). 690 * 691 * @param enable \c TRUE if lenient parsing should be used, 692 * \c FALSE otherwise. 693 * @stable ICU 4.8 694 */ 695 virtual void setLenient(UBool enable); 696 697 /** 698 * Returns whether lenient parsing is enabled (it is off by default). 699 * 700 * @return \c TRUE if lenient parsing is enabled, 701 * \c FALSE otherwise. 702 * @see #setLenient 703 * @stable ICU 4.8 704 */ 705 virtual UBool isLenient(void) const; 706 707 /** 708 * Create a default style NumberFormat for the current default locale. 709 * The default formatting style is locale dependent. 710 * <p> 711 * <strong>NOTE:</strong> New users are strongly encouraged to use 712 * {@link icu::number::NumberFormatter} instead of NumberFormat. 713 * @stable ICU 2.0 714 */ 715 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&); 716 717 /** 718 * Create a default style NumberFormat for the specified locale. 719 * The default formatting style is locale dependent. 720 * @param inLocale the given locale. 721 * <p> 722 * <strong>NOTE:</strong> New users are strongly encouraged to use 723 * {@link icu::number::NumberFormatter} instead of NumberFormat. 724 * @stable ICU 2.0 725 */ 726 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale, 727 UErrorCode&); 728 729 /** 730 * Create a specific style NumberFormat for the specified locale. 731 * <p> 732 * <strong>NOTE:</strong> New users are strongly encouraged to use 733 * {@link icu::number::NumberFormatter} instead of NumberFormat. 734 * @param desiredLocale the given locale. 735 * @param style the given style. 736 * @param errorCode Output param filled with success/failure status. 737 * @return A new NumberFormat instance. 738 * @stable ICU 4.8 739 */ 740 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale, 741 UNumberFormatStyle style, 742 UErrorCode& errorCode); 743 744 #ifndef U_HIDE_INTERNAL_API 745 746 /** 747 * ICU use only. 748 * Creates NumberFormat instance without using the cache. 749 * @internal 750 */ 751 static NumberFormat* internalCreateInstance( 752 const Locale& desiredLocale, 753 UNumberFormatStyle style, 754 UErrorCode& errorCode); 755 756 /** 757 * ICU use only. 758 * Returns handle to the shared, cached NumberFormat instance for given 759 * locale. On success, caller must call removeRef() on returned value 760 * once it is done with the shared instance. 761 * @internal 762 */ 763 static const SharedNumberFormat* U_EXPORT2 createSharedInstance( 764 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status); 765 766 #endif /* U_HIDE_INTERNAL_API */ 767 768 /** 769 * Returns a currency format for the current default locale. 770 * <p> 771 * <strong>NOTE:</strong> New users are strongly encouraged to use 772 * {@link icu::number::NumberFormatter} instead of NumberFormat. 773 * @stable ICU 2.0 774 */ 775 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&); 776 777 /** 778 * Returns a currency format for the specified locale. 779 * <p> 780 * <strong>NOTE:</strong> New users are strongly encouraged to use 781 * {@link icu::number::NumberFormatter} instead of NumberFormat. 782 * @param inLocale the given locale. 783 * @stable ICU 2.0 784 */ 785 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale, 786 UErrorCode&); 787 788 /** 789 * Returns a percentage format for the current default locale. 790 * <p> 791 * <strong>NOTE:</strong> New users are strongly encouraged to use 792 * {@link icu::number::NumberFormatter} instead of NumberFormat. 793 * @stable ICU 2.0 794 */ 795 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&); 796 797 /** 798 * Returns a percentage format for the specified locale. 799 * <p> 800 * <strong>NOTE:</strong> New users are strongly encouraged to use 801 * {@link icu::number::NumberFormatter} instead of NumberFormat. 802 * @param inLocale the given locale. 803 * @stable ICU 2.0 804 */ 805 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale, 806 UErrorCode&); 807 808 /** 809 * Returns a scientific format for the current default locale. 810 * <p> 811 * <strong>NOTE:</strong> New users are strongly encouraged to use 812 * {@link icu::number::NumberFormatter} instead of NumberFormat. 813 * @stable ICU 2.0 814 */ 815 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&); 816 817 /** 818 * Returns a scientific format for the specified locale. 819 * <p> 820 * <strong>NOTE:</strong> New users are strongly encouraged to use 821 * {@link icu::number::NumberFormatter} instead of NumberFormat. 822 * @param inLocale the given locale. 823 * @stable ICU 2.0 824 */ 825 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale, 826 UErrorCode&); 827 828 /** 829 * Get the set of Locales for which NumberFormats are installed. 830 * @param count Output param to receive the size of the locales 831 * @stable ICU 2.0 832 */ 833 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); 834 835 #if !UCONFIG_NO_SERVICE 836 /** 837 * Register a new NumberFormatFactory. The factory will be adopted. 838 * Because ICU may choose to cache NumberFormat objects internally, 839 * this must be called at application startup, prior to any calls to 840 * NumberFormat::createInstance to avoid undefined behavior. 841 * @param toAdopt the NumberFormatFactory instance to be adopted 842 * @param status the in/out status code, no special meanings are assigned 843 * @return a registry key that can be used to unregister this factory 844 * @stable ICU 2.6 845 */ 846 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status); 847 848 /** 849 * Unregister a previously-registered NumberFormatFactory using the key returned from the 850 * register call. Key becomes invalid after a successful call and should not be used again. 851 * The NumberFormatFactory corresponding to the key will be deleted. 852 * Because ICU may choose to cache NumberFormat objects internally, 853 * this should be called during application shutdown, after all calls to 854 * NumberFormat::createInstance to avoid undefined behavior. 855 * @param key the registry key returned by a previous call to registerFactory 856 * @param status the in/out status code, no special meanings are assigned 857 * @return TRUE if the factory for the key was successfully unregistered 858 * @stable ICU 2.6 859 */ 860 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); 861 862 /** 863 * Return a StringEnumeration over the locales available at the time of the call, 864 * including registered locales. 865 * @return a StringEnumeration over the locales available at the time of the call 866 * @stable ICU 2.6 867 */ 868 static StringEnumeration* U_EXPORT2 getAvailableLocales(void); 869 #endif /* UCONFIG_NO_SERVICE */ 870 871 /** 872 * Returns true if grouping is used in this format. For example, 873 * in the English locale, with grouping on, the number 1234567 874 * might be formatted as "1,234,567". The grouping separator as 875 * well as the size of each group is locale dependent and is 876 * determined by sub-classes of NumberFormat. 877 * @see setGroupingUsed 878 * @stable ICU 2.0 879 */ 880 UBool isGroupingUsed(void) const; 881 882 /** 883 * Set whether or not grouping will be used in this format. 884 * @param newValue True, grouping will be used in this format. 885 * @see getGroupingUsed 886 * @stable ICU 2.0 887 */ 888 virtual void setGroupingUsed(UBool newValue); 889 890 /** 891 * Returns the maximum number of digits allowed in the integer portion of a 892 * number. 893 * @return the maximum number of digits allowed in the integer portion of a 894 * number. 895 * @see setMaximumIntegerDigits 896 * @stable ICU 2.0 897 */ 898 int32_t getMaximumIntegerDigits(void) const; 899 900 /** 901 * Sets the maximum number of digits allowed in the integer portion of a 902 * number. maximumIntegerDigits must be >= minimumIntegerDigits. If the 903 * new value for maximumIntegerDigits is less than the current value 904 * of minimumIntegerDigits, then minimumIntegerDigits will also be set to 905 * the new value. 906 * 907 * @param newValue the new value for the maximum number of digits 908 * allowed in the integer portion of a number. 909 * @see getMaximumIntegerDigits 910 * @stable ICU 2.0 911 */ 912 virtual void setMaximumIntegerDigits(int32_t newValue); 913 914 /** 915 * Returns the minimum number of digits allowed in the integer portion of a 916 * number. 917 * @return the minimum number of digits allowed in the integer portion of a 918 * number. 919 * @see setMinimumIntegerDigits 920 * @stable ICU 2.0 921 */ 922 int32_t getMinimumIntegerDigits(void) const; 923 924 /** 925 * Sets the minimum number of digits allowed in the integer portion of a 926 * number. minimumIntegerDigits must be <= maximumIntegerDigits. If the 927 * new value for minimumIntegerDigits exceeds the current value 928 * of maximumIntegerDigits, then maximumIntegerDigits will also be set to 929 * the new value. 930 * @param newValue the new value to be set. 931 * @see getMinimumIntegerDigits 932 * @stable ICU 2.0 933 */ 934 virtual void setMinimumIntegerDigits(int32_t newValue); 935 936 /** 937 * Returns the maximum number of digits allowed in the fraction portion of a 938 * number. 939 * @return the maximum number of digits allowed in the fraction portion of a 940 * number. 941 * @see setMaximumFractionDigits 942 * @stable ICU 2.0 943 */ 944 int32_t getMaximumFractionDigits(void) const; 945 946 /** 947 * Sets the maximum number of digits allowed in the fraction portion of a 948 * number. maximumFractionDigits must be >= minimumFractionDigits. If the 949 * new value for maximumFractionDigits is less than the current value 950 * of minimumFractionDigits, then minimumFractionDigits will also be set to 951 * the new value. 952 * @param newValue the new value to be set. 953 * @see getMaximumFractionDigits 954 * @stable ICU 2.0 955 */ 956 virtual void setMaximumFractionDigits(int32_t newValue); 957 958 /** 959 * Returns the minimum number of digits allowed in the fraction portion of a 960 * number. 961 * @return the minimum number of digits allowed in the fraction portion of a 962 * number. 963 * @see setMinimumFractionDigits 964 * @stable ICU 2.0 965 */ 966 int32_t getMinimumFractionDigits(void) const; 967 968 /** 969 * Sets the minimum number of digits allowed in the fraction portion of a 970 * number. minimumFractionDigits must be <= maximumFractionDigits. If the 971 * new value for minimumFractionDigits exceeds the current value 972 * of maximumFractionDigits, then maximumIntegerDigits will also be set to 973 * the new value 974 * @param newValue the new value to be set. 975 * @see getMinimumFractionDigits 976 * @stable ICU 2.0 977 */ 978 virtual void setMinimumFractionDigits(int32_t newValue); 979 980 /** 981 * Sets the currency used to display currency 982 * amounts. This takes effect immediately, if this format is a 983 * currency format. If this format is not a currency format, then 984 * the currency is used if and when this object becomes a 985 * currency format. 986 * @param theCurrency a 3-letter ISO code indicating new currency 987 * to use. It need not be null-terminated. May be the empty 988 * string or NULL to indicate no currency. 989 * @param ec input-output error code 990 * @stable ICU 3.0 991 */ 992 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec); 993 994 /** 995 * Gets the currency used to display currency 996 * amounts. This may be an empty string for some subclasses. 997 * @return a 3-letter null-terminated ISO code indicating 998 * the currency in use, or a pointer to the empty string. 999 * @stable ICU 2.6 1000 */ 1001 const char16_t* getCurrency() const; 1002 1003 /** 1004 * Set a particular UDisplayContext value in the formatter, such as 1005 * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. 1006 * @param value The UDisplayContext value to set. 1007 * @param status Input/output status. If at entry this indicates a failure 1008 * status, the function will do nothing; otherwise this will be 1009 * updated with any new status from the function. 1010 * @stable ICU 53 1011 */ 1012 virtual void setContext(UDisplayContext value, UErrorCode& status); 1013 1014 /** 1015 * Get the formatter's UDisplayContext value for the specified UDisplayContextType, 1016 * such as UDISPCTX_TYPE_CAPITALIZATION. 1017 * @param type The UDisplayContextType whose value to return 1018 * @param status Input/output status. If at entry this indicates a failure 1019 * status, the function will do nothing; otherwise this will be 1020 * updated with any new status from the function. 1021 * @return The UDisplayContextValue for the specified type. 1022 * @stable ICU 53 1023 */ 1024 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; 1025 1026 /** 1027 * Get the rounding mode. This will always return NumberFormat::ERoundingMode::kRoundUnnecessary 1028 * if the subclass does not support rounding. 1029 * @return A rounding mode 1030 * @stable ICU 60 1031 */ 1032 virtual ERoundingMode getRoundingMode(void) const; 1033 1034 /** 1035 * Set the rounding mode. If a subclass does not support rounding, this will do nothing. 1036 * @param roundingMode A rounding mode 1037 * @stable ICU 60 1038 */ 1039 virtual void setRoundingMode(ERoundingMode roundingMode); 1040 1041 public: 1042 1043 /** 1044 * Return the class ID for this class. This is useful for 1045 * comparing to a return value from getDynamicClassID(). Note that, 1046 * because NumberFormat is an abstract base class, no fully constructed object 1047 * will have the class ID returned by NumberFormat::getStaticClassID(). 1048 * @return The class ID for all objects of this class. 1049 * @stable ICU 2.0 1050 */ 1051 static UClassID U_EXPORT2 getStaticClassID(void); 1052 1053 /** 1054 * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. 1055 * This method is to implement a simple version of RTTI, since not all 1056 * C++ compilers support genuine RTTI. Polymorphic operator==() and 1057 * clone() methods call this method. 1058 * <P> 1059 * @return The class ID for this object. All objects of a 1060 * given class have the same class ID. Objects of 1061 * other classes have different class IDs. 1062 * @stable ICU 2.0 1063 */ 1064 virtual UClassID getDynamicClassID(void) const = 0; 1065 1066 protected: 1067 1068 /** 1069 * Default constructor for subclass use only. 1070 * @stable ICU 2.0 1071 */ 1072 NumberFormat(); 1073 1074 /** 1075 * Copy constructor. 1076 * @stable ICU 2.0 1077 */ 1078 NumberFormat(const NumberFormat&); 1079 1080 /** 1081 * Assignment operator. 1082 * @stable ICU 2.0 1083 */ 1084 NumberFormat& operator=(const NumberFormat&); 1085 1086 /** 1087 * Returns the currency in effect for this formatter. Subclasses 1088 * should override this method as needed. Unlike getCurrency(), 1089 * this method should never return "". 1090 * @result output parameter for null-terminated result, which must 1091 * have a capacity of at least 4 1092 * @internal 1093 */ 1094 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const; 1095 1096 #ifndef U_HIDE_INTERNAL_API 1097 /** 1098 * Creates the specified number format style of the desired locale. 1099 * If mustBeDecimalFormat is TRUE, then the returned pointer is 1100 * either a DecimalFormat or it is NULL. 1101 * @internal 1102 */ 1103 static NumberFormat* makeInstance(const Locale& desiredLocale, 1104 UNumberFormatStyle style, 1105 UBool mustBeDecimalFormat, 1106 UErrorCode& errorCode); 1107 #endif /* U_HIDE_INTERNAL_API */ 1108 1109 private: 1110 1111 static UBool isStyleSupported(UNumberFormatStyle style); 1112 1113 /** 1114 * Creates the specified decimal format style of the desired locale. 1115 * @param desiredLocale the given locale. 1116 * @param style the given style. 1117 * @param errorCode Output param filled with success/failure status. 1118 * @return A new NumberFormat instance. 1119 */ 1120 static NumberFormat* makeInstance(const Locale& desiredLocale, 1121 UNumberFormatStyle style, 1122 UErrorCode& errorCode); 1123 1124 UBool fGroupingUsed; 1125 int32_t fMaxIntegerDigits; 1126 int32_t fMinIntegerDigits; 1127 int32_t fMaxFractionDigits; 1128 int32_t fMinFractionDigits; 1129 1130 protected: 1131 /** \internal */ 1132 static const int32_t gDefaultMaxIntegerDigits; 1133 /** \internal */ 1134 static const int32_t gDefaultMinIntegerDigits; 1135 1136 private: 1137 UBool fParseIntegerOnly; 1138 UBool fLenient; // TRUE => lenient parse is enabled 1139 1140 // ISO currency code 1141 char16_t fCurrency[4]; 1142 1143 UDisplayContext fCapitalizationContext; 1144 1145 friend class ICUNumberFormatFactory; // access to makeInstance 1146 friend class ICUNumberFormatService; 1147 friend class ::NumberFormatTest; // access to isStyleSupported() 1148 }; 1149 1150 #if !UCONFIG_NO_SERVICE 1151 /** 1152 * A NumberFormatFactory is used to register new number formats. The factory 1153 * should be able to create any of the predefined formats for each locale it 1154 * supports. When registered, the locales it supports extend or override the 1155 * locale already supported by ICU. 1156 * 1157 * @stable ICU 2.6 1158 */ 1159 class U_I18N_API NumberFormatFactory : public UObject { 1160 public: 1161 1162 /** 1163 * Destructor 1164 * @stable ICU 3.0 1165 */ 1166 virtual ~NumberFormatFactory(); 1167 1168 /** 1169 * Return true if this factory will be visible. Default is true. 1170 * If not visible, the locales supported by this factory will not 1171 * be listed by getAvailableLocales. 1172 * @stable ICU 2.6 1173 */ 1174 virtual UBool visible(void) const = 0; 1175 1176 /** 1177 * Return the locale names directly supported by this factory. The number of names 1178 * is returned in count; 1179 * @stable ICU 2.6 1180 */ 1181 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0; 1182 1183 /** 1184 * Return a number format of the appropriate type. If the locale 1185 * is not supported, return null. If the locale is supported, but 1186 * the type is not provided by this service, return null. Otherwise 1187 * return an appropriate instance of NumberFormat. 1188 * @stable ICU 2.6 1189 */ 1190 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0; 1191 }; 1192 1193 /** 1194 * A NumberFormatFactory that supports a single locale. It can be visible or invisible. 1195 * @stable ICU 2.6 1196 */ 1197 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory { 1198 protected: 1199 /** 1200 * True if the locale supported by this factory is visible. 1201 * @stable ICU 2.6 1202 */ 1203 const UBool _visible; 1204 1205 /** 1206 * The locale supported by this factory, as a UnicodeString. 1207 * @stable ICU 2.6 1208 */ 1209 UnicodeString _id; 1210 1211 public: 1212 /** 1213 * @stable ICU 2.6 1214 */ 1215 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE); 1216 1217 /** 1218 * @stable ICU 3.0 1219 */ 1220 virtual ~SimpleNumberFormatFactory(); 1221 1222 /** 1223 * @stable ICU 2.6 1224 */ 1225 virtual UBool visible(void) const; 1226 1227 /** 1228 * @stable ICU 2.6 1229 */ 1230 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const; 1231 }; 1232 #endif /* #if !UCONFIG_NO_SERVICE */ 1233 1234 // ------------------------------------- 1235 1236 inline UBool 1237 NumberFormat::isParseIntegerOnly() const 1238 { 1239 return fParseIntegerOnly; 1240 } 1241 1242 inline UBool 1243 NumberFormat::isLenient() const 1244 { 1245 return fLenient; 1246 } 1247 1248 U_NAMESPACE_END 1249 1250 #endif /* #if !UCONFIG_NO_FORMATTING */ 1251 1252 #endif // _NUMFMT 1253 //eof 1254