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