| /* |
| ******************************************************************************** |
| * Copyright (C) 1997-2001, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| ******************************************************************************** |
| * |
| * File DECIMFMT.H |
| * |
| * Modification History: |
| * |
| * Date Name Description |
| * 02/19/97 aliu Converted from java. |
| * 03/20/97 clhuang Updated per C++ implementation. |
| * 04/03/97 aliu Rewrote parsing and formatting completely, and |
| * cleaned up and debugged. Actually works now. |
| * 04/17/97 aliu Changed DigitCount to int per code review. |
| * 07/10/97 helena Made ParsePosition a class and get rid of the function |
| * hiding problems. |
| * 09/09/97 aliu Ported over support for exponential formats. |
| * 07/20/98 stephen Changed documentation |
| ******************************************************************************** |
| */ |
| |
| #ifndef DECIMFMT_H |
| #define DECIMFMT_H |
| |
| #include "unicode/utypes.h" |
| #include "unicode/numfmt.h" |
| #include "unicode/locid.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| class DecimalFormatSymbols; |
| class DigitList; |
| |
| /** |
| * Concrete class for formatting decimal numbers, allowing a variety |
| * of parameters, and localization to Western, Arabic, or Indic numbers. |
| * <P> |
| * Normally, you get the proper NumberFormat for a specific locale |
| * (including the default locale) using the NumberFormat factory methods, |
| * rather than constructing a DecimalNumberFormat directly. |
| * <P> |
| * Either the prefixes or the suffixes must be different for the parse |
| * to distinguish positive from negative. Parsing will be unreliable |
| * if the digits, thousands or decimal separators are the same, or if |
| * any of them occur in the prefixes or suffixes. |
| * <P> |
| * [Special cases:] |
| * <P> |
| * NaN is formatted as a single character, typically \\uFFFD. |
| * <P> |
| * +/-Infinity is formatted as a single character, typically \\u221E, |
| * plus the positive and negative pre/suffixes. |
| * <P> |
| * Note: this class is designed for common users; for very large or small |
| * numbers, use a format that can express exponential values. |
| * <P> |
| * [Example:] |
| * <pre> |
| * \code |
| * // normally we would have a GUI with a menu for this |
| * int32_t locCount; |
| * const Locale* locales = NumberFormat::getAvailableLocales(locCount); |
| * if (locCount > 12) locCount = 12; //limit output |
| * |
| * double myNumber = -1234.56; |
| * UErrorCode success = U_ZERO_ERROR; |
| * NumberFormat* form; //= NumberFormat::createInstance(success); |
| * |
| * // just for fun, we print out a number with the locale number, currency |
| * // and percent format for each locale we can. |
| * UnicodeString countryName; |
| * UnicodeString displayName; |
| * UnicodeString str; |
| * UnicodeString pattern; |
| * Formattable fmtable; |
| * for (int32_t j = 0; j < 3; ++j) { |
| * cout << endl << "FORMAT " << j << endl; |
| * for (int32_t i = 0; i < locCount; ++i) { |
| * if (locales[i].getCountry(countryName).size() == 0) { |
| * // skip language-only |
| * continue; |
| * } |
| * switch (j) { |
| * default: |
| * form = NumberFormat::createInstance(locales[i], success ); break; |
| * case 1: |
| * form = NumberFormat::createCurrencyInstance(locales[i], success ); break; |
| * case 0: |
| * form = NumberFormat::createPercentInstance(locales[i], success ); break; |
| * } |
| * if (form) { |
| * str.remove(); |
| * pattern = ((DecimalFormat*)form)->toPattern(pattern); |
| * cout << locales[i].getDisplayName(displayName) << ": " << pattern; |
| * cout << " -> " << form->format(myNumber,str) << endl; |
| * form->parse(form->format(myNumber,str), fmtable, success); |
| * //cout << " parsed: " << fmtable << endl; |
| * delete form; |
| * } |
| * } |
| * } |
| * \endcode |
| * </pre> |
| * [The following shows the structure of the pattern.] |
| * <pre> |
| * \code |
| * pattern := subpattern{;subpattern} |
| * subpattern := {prefix}integer{.fraction}{suffix} |
| * |
| * prefix := '\\u0000'..'\\uFFFD' - specialCharacters |
| * suffix := '\\u0000'..'\\uFFFD' - specialCharacters |
| * integer := '#'* '0'* '0' |
| * fraction := '0'* '#'* |
| * |
| * Notation: |
| * X* 0 or more instances of X |
| * (X | Y) either X or Y. |
| * X..Y any character from X up to Y, inclusive. |
| * S - T characters in S, except those in T |
| * \code |
| * /pre> |
| * The first subpattern is for positive numbers. The second (optional) |
| * subpattern is used for negative numbers. (In both cases, ',' can |
| * occur inside the integer portion--it is just too messy to indicate |
| * in BNF.) For the second subpattern, only the PREFIX and SUFFIX are |
| * noted; other attributes are taken only from the first subpattern. |
| * <P> |
| * Here are the special characters used in the parts of the |
| * subpattern, with notes on their usage. |
| * <pre> |
| * \code |
| * Symbol Meaning |
| * 0 a digit, showing up a zero if it is zero |
| * # a digit, supressed if zero |
| * . placeholder for decimal separator |
| * , placeholder for grouping separator. |
| * E separates mantissa and exponent for exponential formats. |
| * ; separates formats. |
| * - default negative prefix. |
| * % multiply by 100 and show as percentage |
| * \u2030 multiply by 1000 and show as per mille |
| * \u00A4 currency sign; replaced by currency symbol; if |
| * doubled, replaced by international currency symbol. |
| * If present in a pattern, the monetary decimal separator |
| * is used instead of the decimal separator. |
| * X any other characters can be used in the prefix or suffix |
| * ' used to quote special characters in a prefix or suffix. |
| * \endcode |
| * </pre> |
| * [Notes] |
| * <P> |
| * If there is no explicit negative subpattern, - is prefixed to the |
| * positive form. That is, "0.00" alone is equivalent to "0.00;-0.00". |
| * <P> |
| * Illegal formats, such as "#.#.#" in the same format, will cause a |
| * failing UErrorCode to be returned. |
| * <P> |
| * The grouping separator is commonly used for thousands, but in some |
| * countries for ten-thousands. The interval is a constant number of |
| * digits between the grouping characters, such as 100,000,000 or 1,0000,0000. |
| * If you supply a pattern with multiple grouping characters, the interval |
| * between the last one and the end of the integer determines the primary |
| * grouping size, and the interval between the last two determines |
| * the secondary grouping size (see below); all others are ignored. |
| * So "#,##,###,####" == "###,###,####" == "##,#,###,####". |
| * <P> |
| * Some locales have two different grouping intervals: One used for the |
| * least significant integer digits (the primary grouping size), and |
| * one used for all others (the secondary grouping size). For example, |
| * if the primary grouping interval is 3, and the secondary is 2, then |
| * this corresponds to the pattern "#,##,##0", and the number 123456789 |
| * is formatted as "12,34,56,789". |
| * <P> |
| * This class only handles localized digits where the 10 digits are |
| * contiguous in Unicode, from 0 to 9. Other digits sets (such as |
| * superscripts) would need a different subclass. |
| */ |
| class U_I18N_API DecimalFormat: public NumberFormat { |
| public: |
| enum ERoundingMode { |
| kRoundCeiling, |
| kRoundFloor, |
| kRoundDown, |
| kRoundUp, |
| kRoundHalfEven, |
| kRoundHalfDown, |
| kRoundHalfUp |
| // We don't support ROUND_UNNECESSARY |
| }; |
| |
| enum EPadPosition { |
| kPadBeforePrefix, |
| kPadAfterPrefix, |
| kPadBeforeSuffix, |
| kPadAfterSuffix |
| }; |
| |
| /** |
| * Create a DecimalFormat using the default pattern and symbols |
| * for the default locale. This is a convenient way to obtain a |
| * DecimalFormat when internationalization is not the main concern. |
| * <P> |
| * To obtain standard formats for a given locale, use the factory methods |
| * on NumberFormat such as getNumberInstance. These factories will |
| * return the most appropriate sub-class of NumberFormat for a given |
| * locale. |
| * @param status Output param set to success/failure code. If the |
| * pattern is invalid this will be set to a failure code. |
| * @stable |
| */ |
| DecimalFormat(UErrorCode& status); |
| |
| /** |
| * Create a DecimalFormat from the given pattern and the symbols |
| * for the default locale. This is a convenient way to obtain a |
| * DecimalFormat when internationalization is not the main concern. |
| * <P> |
| * To obtain standard formats for a given locale, use the factory methods |
| * on NumberFormat such as getNumberInstance. These factories will |
| * return the most appropriate sub-class of NumberFormat for a given |
| * locale. |
| * @param pattern A non-localized pattern string. |
| * @param status Output param set to success/failure code. If the |
| * pattern is invalid this will be set to a failure code. |
| * @stable |
| */ |
| DecimalFormat(const UnicodeString& pattern, |
| UErrorCode& status); |
| |
| /** |
| * Create a DecimalFormat from the given pattern and symbols. |
| * Use this constructor when you need to completely customize the |
| * behavior of the format. |
| * <P> |
| * To obtain standard formats for a given |
| * locale, use the factory methods on NumberFormat such as |
| * getInstance or getCurrencyInstance. If you need only minor adjustments |
| * to a standard format, you can modify the format returned by |
| * a NumberFormat factory method. |
| * |
| * @param pattern a non-localized pattern string |
| * @param symbolsToAdopt the set of symbols to be used. The caller should not |
| * delete this object after making this call. |
| * @param status Output param set to success/failure code. If the |
| * pattern is invalid this will be set to a failure code. |
| * @stable |
| */ |
| DecimalFormat( const UnicodeString& pattern, |
| DecimalFormatSymbols* symbolsToAdopt, |
| UErrorCode& status); |
| |
| /** |
| * Create a DecimalFormat from the given pattern and symbols. |
| * Use this constructor when you need to completely customize the |
| * behavior of the format. |
| * <P> |
| * To obtain standard formats for a given |
| * locale, use the factory methods on NumberFormat such as |
| * getInstance or getCurrencyInstance. If you need only minor adjustments |
| * to a standard format, you can modify the format returned by |
| * a NumberFormat factory method. |
| * |
| * @param pattern a non-localized pattern string |
| * @param symbolsToAdopt the set of symbols to be used. The caller should not |
| * delete this object after making this call. |
| * @param parseError Output param to receive errors occured during parsing |
| * @param status Output param set to success/failure code. If the |
| * pattern is invalid this will be set to a failure code. |
| * @draft ICU 2.0 |
| */ |
| DecimalFormat( const UnicodeString& pattern, |
| DecimalFormatSymbols* symbolsToAdopt, |
| UParseError& parseError, |
| UErrorCode& status); |
| /** |
| * Create a DecimalFormat from the given pattern and symbols. |
| * Use this constructor when you need to completely customize the |
| * behavior of the format. |
| * <P> |
| * To obtain standard formats for a given |
| * locale, use the factory methods on NumberFormat such as |
| * getInstance or getCurrencyInstance. If you need only minor adjustments |
| * to a standard format, you can modify the format returned by |
| * a NumberFormat factory method. |
| * |
| * @param pattern a non-localized pattern string |
| * @param symbols the set of symbols to be used |
| * @param status Output param set to success/failure code. If the |
| * pattern is invalid this will be set to a failure code. |
| * @stable |
| */ |
| DecimalFormat( const UnicodeString& pattern, |
| const DecimalFormatSymbols& symbols, |
| UErrorCode& status); |
| |
| /** |
| * Copy constructor. |
| * @stable |
| */ |
| DecimalFormat(const DecimalFormat& source); |
| |
| /** |
| * Assignment operator. |
| * @stable |
| */ |
| DecimalFormat& operator=(const DecimalFormat& rhs); |
| |
| /** |
| * Destructor. |
| * @stable |
| */ |
| virtual ~DecimalFormat(); |
| |
| /** |
| * Clone this Format object polymorphically. The caller owns the |
| * result and should delete it when done. |
| * @stable |
| */ |
| virtual Format* clone(void) const; |
| |
| /** |
| * Return true if the given Format objects are semantically equal. |
| * Objects of different subclasses are considered unequal. |
| * @stable |
| */ |
| virtual UBool operator==(const Format& other) const; |
| |
| /** |
| * Format a double or long number using base-10 representation. |
| * |
| * @param number The value to be formatted. |
| * @param toAppendTo The string to append the formatted string to. |
| * This is an output parameter. |
| * @param pos On input: an alignment field, if desired. |
| * On output: the offsets of the alignment field. |
| * @return A reference to 'toAppendTo'. |
| * @stable |
| */ |
| virtual UnicodeString& format(double number, |
| UnicodeString& toAppendTo, |
| FieldPosition& pos) const; |
| /** |
| * Format a long number using base-10 representation. |
| * |
| * @param number The value to be formatted. |
| * @param toAppendTo The string to append the formatted string to. |
| * This is an output parameter. |
| * @param pos On input: an alignment field, if desired. |
| * On output: the offsets of the alignment field. |
| * @return A reference to 'toAppendTo'. |
| * @stable |
| */ |
| virtual UnicodeString& format(int32_t number, |
| UnicodeString& toAppendTo, |
| FieldPosition& pos) const; |
| /** |
| * Format a Formattable using base-10 representation. |
| * |
| * @param obj The value to be formatted. |
| * @param toAppendTo The string to append the formatted string to. |
| * This is an output parameter. |
| * @param pos On input: an alignment field, if desired. |
| * On output: the offsets of the alignment field. |
| * @param status Error code indicating success or failure. |
| * @return A reference to 'toAppendTo'. |
| * @stable |
| */ |
| virtual UnicodeString& format(const Formattable& obj, |
| UnicodeString& toAppendTo, |
| FieldPosition& pos, |
| UErrorCode& status) const; |
| |
| /** |
| * Redeclared NumberFormat method. |
| * @stable |
| */ |
| UnicodeString& format(const Formattable& obj, |
| UnicodeString& result, |
| UErrorCode& status) const; |
| |
| /** |
| * Redeclared NumberFormat method. |
| * @stable |
| */ |
| UnicodeString& format(double number, |
| UnicodeString& output) const; |
| |
| /** |
| * Redeclared NumberFormat method. |
| * @stable |
| */ |
| UnicodeString& format(int32_t number, |
| UnicodeString& output) const; |
| |
| /** |
| * Parse the given string using this object's choices. The method |
| * does string comparisons to try to find an optimal match. |
| * If no object can be parsed, index is unchanged, and NULL is |
| * returned. The result is returned as the most parsimonious |
| * type of <code>Formattable</code> that will accomodate all of the |
| * necessary precision. For example, if the result is exactly 12, |
| * it will be returned as a long. However, if it is 1.5, it will |
| * be returned as a double. |
| * |
| * @param text The text to be parsed. |
| * @param result Formattable to be set to the parse result. |
| * If parse fails, return contents are undefined. |
| * @param parsePosition The position to start parsing at on input. |
| * On output, moved to after the last successfully |
| * parse character. On parse failure, does not change. |
| * @see Formattable |
| * @stable |
| */ |
| virtual void parse(const UnicodeString& text, |
| Formattable& result, |
| ParsePosition& parsePosition) const; |
| |
| // Declare here again to get rid of function hiding problems. |
| /** @stable */ |
| virtual void parse(const UnicodeString& text, |
| Formattable& result, |
| UErrorCode& error) const; |
| |
| /** |
| * Returns the decimal format symbols, which is generally not changed |
| * by the programmer or user. |
| * @return desired DecimalFormatSymbols |
| * @see DecimalFormatSymbols |
| * @stable |
| */ |
| virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; |
| |
| /** |
| * Sets the decimal format symbols, which is generally not changed |
| * by the programmer or user. |
| * @param symbolsToAdopt DecimalFormatSymbols to be adopted. |
| * @stable |
| */ |
| virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); |
| |
| /** |
| * Sets the decimal format symbols, which is generally not changed |
| * by the programmer or user. |
| * @param symbols DecimalFormatSymbols. |
| * @stable |
| */ |
| virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); |
| |
| |
| /** |
| * Get the positive prefix. |
| * |
| * Examples: +123, $123, sFr123 |
| * @stable |
| */ |
| UnicodeString& getPositivePrefix(UnicodeString& result) const; |
| |
| /** |
| * Set the positive prefix. |
| * |
| * Examples: +123, $123, sFr123 |
| * @stable |
| */ |
| virtual void setPositivePrefix(const UnicodeString& newValue); |
| |
| /** |
| * Get the negative prefix. |
| * |
| * Examples: -123, ($123) (with negative suffix), sFr-123 |
| * @stable |
| */ |
| UnicodeString& getNegativePrefix(UnicodeString& result) const; |
| |
| /** |
| * Set the negative prefix. |
| * |
| * Examples: -123, ($123) (with negative suffix), sFr-123 |
| * @stable |
| */ |
| virtual void setNegativePrefix(const UnicodeString& newValue); |
| |
| /** |
| * Get the positive suffix. |
| * |
| * Example: 123% |
| * @stable |
| */ |
| UnicodeString& getPositiveSuffix(UnicodeString& result) const; |
| |
| /** |
| * Set the positive suffix. |
| * |
| * Example: 123% |
| * @stable |
| */ |
| virtual void setPositiveSuffix(const UnicodeString& newValue); |
| |
| /** |
| * Get the negative suffix. |
| * |
| * Examples: -123%, ($123) (with positive suffixes) |
| * @stable |
| */ |
| UnicodeString& getNegativeSuffix(UnicodeString& result) const; |
| |
| /** |
| * Set the positive suffix. |
| * |
| * Examples: 123% |
| * @stable |
| */ |
| virtual void setNegativeSuffix(const UnicodeString& newValue); |
| |
| /** |
| * Get the multiplier for use in percent, permill, etc. |
| * For a percentage, set the suffixes to have "%" and the multiplier to be 100. |
| * (For Arabic, use arabic percent symbol). |
| * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. |
| * |
| * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 |
| * @stable |
| */ |
| int32_t getMultiplier(void) const; |
| |
| /** |
| * Set the multiplier for use in percent, permill, etc. |
| * For a percentage, set the suffixes to have "%" and the multiplier to be 100. |
| * (For Arabic, use arabic percent symbol). |
| * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. |
| * |
| * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 |
| * @stable |
| */ |
| virtual void setMultiplier(int32_t newValue); |
| |
| /** |
| * Get the rounding increment. |
| * @return A positive rounding increment, or 0.0 if rounding |
| * is not in effect. |
| * @see #setRoundingIncrement |
| * @see #getRoundingMode |
| * @see #setRoundingMode |
| * @stable |
| */ |
| virtual double getRoundingIncrement(void); |
| |
| /** |
| * Set the rounding increment. This method also controls whether |
| * rounding is enabled. |
| * @param newValue A positive rounding increment, or 0.0 to disable rounding. |
| * Negative increments are equivalent to 0.0. |
| * @see #getRoundingIncrement |
| * @see #getRoundingMode |
| * @see #setRoundingMode |
| * @stable |
| */ |
| virtual void setRoundingIncrement(double newValue); |
| |
| /** |
| * Get the rounding mode. |
| * @return A rounding mode |
| * @see #setRoundingIncrement |
| * @see #getRoundingIncrement |
| * @see #setRoundingMode |
| * @stable |
| */ |
| virtual ERoundingMode getRoundingMode(void); |
| |
| /** |
| * Set the rounding mode. This has no effect unless the rounding |
| * increment is greater than zero. |
| * @param roundingMode A rounding mode |
| * @see #setRoundingIncrement |
| * @see #getRoundingIncrement |
| * @see #getRoundingMode |
| * @stable |
| */ |
| virtual void setRoundingMode(ERoundingMode roundingMode); |
| |
| /** |
| * Get the width to which the output of <code>format()</code> is padded. |
| * @return the format width, or zero if no padding is in effect |
| * @see #setFormatWidth |
| * @see #getPadCharacter |
| * @see #setPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @stable |
| */ |
| virtual int32_t getFormatWidth(void); |
| |
| /** |
| * Set the width to which the output of <code>format()</code> is padded. |
| * This method also controls whether padding is enabled. |
| * @param width the width to which to pad the result of |
| * <code>format()</code>, or zero to disable padding. A negative |
| * width is equivalent to 0. |
| * @see #getFormatWidth |
| * @see #getPadCharacter |
| * @see #setPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @stable |
| */ |
| virtual void setFormatWidth(int32_t width); |
| |
| /** |
| * Get the first code unit of the string used to pad to the format width. The default is ' '. |
| * @return the first code unit of the pad string |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #setPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @deprecated remove after 2000-dec-31. See getPadCharacterString(). |
| */ |
| inline UChar getPadCharacter(void); |
| |
| /** |
| * Get the grapheme string (a character, possibly with modifier letters) |
| * used to pad to the format width. The default is " ". |
| * Note: The current implementation only stores the first code unit of the |
| * pad string. |
| * @return the pad grapheme string |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #setPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @stable |
| */ |
| virtual UnicodeString getPadCharacterString(); |
| |
| /** |
| * Set a one-code unit string used to pad to the format width. This has no effect |
| * unless padding is enabled. |
| * @param padChar the pad character that is used to construct the pad string |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #getPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @deprecated remove after 2000-dec-31. See setPadCharacter(UnicodeString). |
| */ |
| inline void setPadCharacter(UChar padChar); |
| |
| /** |
| * Set the grapheme string (a character, possibly with modifier letters) |
| * used to pad to the format width. This has no effect |
| * unless padding is enabled. |
| * Note: The current implementation only stores the first code unit of the |
| * pad string. |
| * @param padChar the pad grapheme |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #getPadCharacter |
| * @see #getPadPosition |
| * @see #setPadPosition |
| * @stable |
| */ |
| virtual void setPadCharacter(UnicodeString padChar); |
| |
| /** |
| * Get the position at which padding will take place. This is the location |
| * at which padding will be inserted if the result of <code>format()</code> |
| * is shorter than the format width. |
| * @return the pad position, one of <code>kPadBeforePrefix</code>, |
| * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or |
| * <code>kPadAfterSuffix</code>. |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #setPadCharacter |
| * @see #getPadCharacter |
| * @see #setPadPosition |
| * @see #kPadBeforePrefix |
| * @see #kPadAfterPrefix |
| * @see #kPadBeforeSuffix |
| * @see #kPadAfterSuffix |
| * @stable |
| */ |
| virtual EPadPosition getPadPosition(void); |
| |
| /** |
| * <strong><font face=helvetica color=red>NEW</font></strong> |
| * Set the position at which padding will take place. This is the location |
| * at which padding will be inserted if the result of <code>format()</code> |
| * is shorter than the format width. This has no effect unless padding is |
| * enabled. |
| * @param padPos the pad position, one of <code>kPadBeforePrefix</code>, |
| * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or |
| * <code>kPadAfterSuffix</code>. |
| * @see #setFormatWidth |
| * @see #getFormatWidth |
| * @see #setPadCharacter |
| * @see #getPadCharacter |
| * @see #getPadPosition |
| * @see #kPadBeforePrefix |
| * @see #kPadAfterPrefix |
| * @see #kPadBeforeSuffix |
| * @see #kPadAfterSuffix |
| * @stable |
| */ |
| virtual void setPadPosition(EPadPosition padPos); |
| |
| /** |
| * Return whether or not scientific notation is used. |
| * @return TRUE if this object formats and parses scientific notation |
| * @see #setScientificNotation |
| * @see #getMinimumExponentDigits |
| * @see #setMinimumExponentDigits |
| * @see #isExponentSignAlwaysShown |
| * @see #setExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual UBool isScientificNotation(void); |
| |
| /** |
| * Set whether or not scientific notation is used. |
| * @param useScientific TRUE if this object formats and parses scientific |
| * notation |
| * @see #isScientificNotation |
| * @see #getMinimumExponentDigits |
| * @see #setMinimumExponentDigits |
| * @see #isExponentSignAlwaysShown |
| * @see #setExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual void setScientificNotation(UBool useScientific); |
| |
| /** |
| * Return the minimum exponent digits that will be shown. |
| * @return the minimum exponent digits that will be shown |
| * @see #setScientificNotation |
| * @see #isScientificNotation |
| * @see #setMinimumExponentDigits |
| * @see #isExponentSignAlwaysShown |
| * @see #setExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual int8_t getMinimumExponentDigits(void); |
| |
| /** |
| * Set the minimum exponent digits that will be shown. This has no |
| * effect unless scientific notation is in use. |
| * @param minExpDig a value >= 1 indicating the fewest exponent digits |
| * that will be shown. Values less than 1 will be treated as 1. |
| * @see #setScientificNotation |
| * @see #isScientificNotation |
| * @see #getMinimumExponentDigits |
| * @see #isExponentSignAlwaysShown |
| * @see #setExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual void setMinimumExponentDigits(int8_t minExpDig); |
| |
| /** |
| * Return whether the exponent sign is always shown. |
| * @return TRUE if the exponent is always prefixed with either the |
| * localized minus sign or the localized plus sign, false if only negative |
| * exponents are prefixed with the localized minus sign. |
| * @see #setScientificNotation |
| * @see #isScientificNotation |
| * @see #setMinimumExponentDigits |
| * @see #getMinimumExponentDigits |
| * @see #setExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual UBool isExponentSignAlwaysShown(void); |
| |
| /** |
| * Set whether the exponent sign is always shown. This has no effect |
| * unless scientific notation is in use. |
| * @param expSignAlways TRUE if the exponent is always prefixed with either |
| * the localized minus sign or the localized plus sign, false if only |
| * negative exponents are prefixed with the localized minus sign. |
| * @see #setScientificNotation |
| * @see #isScientificNotation |
| * @see #setMinimumExponentDigits |
| * @see #getMinimumExponentDigits |
| * @see #isExponentSignAlwaysShown |
| * @stable |
| */ |
| virtual void setExponentSignAlwaysShown(UBool expSignAlways); |
| |
| /** |
| * Return the grouping size. Grouping size is the number of digits between |
| * grouping separators in the integer portion of a number. For example, |
| * in the number "123,456.78", the grouping size is 3. |
| * @see setGroupingSize |
| * @see NumberFormat::isGroupingUsed |
| * @see DecimalFormatSymbols::getGroupingSeparator |
| * @stable |
| */ |
| int32_t getGroupingSize(void) const; |
| |
| /** |
| * Set the grouping size. Grouping size is the number of digits between |
| * grouping separators in the integer portion of a number. For example, |
| * in the number "123,456.78", the grouping size is 3. |
| * @see getGroupingSize |
| * @see NumberFormat::setGroupingUsed |
| * @see DecimalFormatSymbols::setGroupingSeparator |
| * @stable |
| */ |
| virtual void setGroupingSize(int32_t newValue); |
| |
| /** |
| * Return the secondary grouping size. In some locales one |
| * grouping interval is used for the least significant integer |
| * digits (the primary grouping size), and another is used for all |
| * others (the secondary grouping size). A formatter supporting a |
| * secondary grouping size will return a positive integer unequal |
| * to the primary grouping size returned by |
| * <code>getGroupingSize()</code>. For example, if the primary |
| * grouping size is 4, and the secondary grouping size is 2, then |
| * the number 123456789 formats as "1,23,45,6789", and the pattern |
| * appears as "#,##,###0". |
| * @return the secondary grouping size, or a value less than |
| * one if there is none |
| * @see setSecondaryGroupingSize |
| * @see NumberFormat::isGroupingUsed |
| * @see DecimalFormatSymbols::getGroupingSeparator |
| */ |
| int32_t getSecondaryGroupingSize(void) const; |
| |
| /** |
| * Set the secondary grouping size. If set to a value less than 1, |
| * then secondary grouping is turned off, and the primary grouping |
| * size is used for all intervals, not just the least significant. |
| * @see getSecondaryGroupingSize |
| * @see NumberFormat#setGroupingUsed |
| * @see DecimalFormatSymbols::setGroupingSeparator |
| */ |
| virtual void setSecondaryGroupingSize(int32_t newValue); |
| |
| /** |
| * Allows you to get the behavior of the decimal separator with integers. |
| * (The decimal separator will always appear with decimals.) |
| * |
| * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 |
| * @stable |
| */ |
| UBool isDecimalSeparatorAlwaysShown(void) const; |
| |
| /** |
| * Allows you to set the behavior of the decimal separator with integers. |
| * (The decimal separator will always appear with decimals.) |
| * |
| * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 |
| * @stable |
| */ |
| virtual void setDecimalSeparatorAlwaysShown(UBool newValue); |
| |
| /** |
| * Synthesizes a pattern string that represents the current state |
| * of this Format object. |
| * @see applyPattern |
| * @stable |
| */ |
| virtual UnicodeString& toPattern(UnicodeString& result) const; |
| |
| /** |
| * Synthesizes a localized pattern string that represents the current |
| * state of this Format object. |
| * |
| * @see applyPattern |
| * @stable |
| */ |
| virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; |
| |
| /** |
| * Apply the given pattern to this Format object. A pattern is a |
| * short-hand specification for the various formatting properties. |
| * These properties can also be changed individually through the |
| * various setter methods. |
| * <P> |
| * There is no limit to integer digits are set |
| * by this routine, since that is the typical end-user desire; |
| * use setMaximumInteger if you want to set a real value. |
| * For negative numbers, use a second pattern, separated by a semicolon |
| * <pre> |
| * . Example "#,#00.0#" -> 1,234.56 |
| * </pre> |
| * This means a minimum of 2 integer digits, 1 fraction digit, and |
| * a maximum of 2 fraction digits. |
| * <pre> |
| * . Example: "#,#00.0#;(#,#00.0#)" for negatives in parantheses. |
| * </pre> |
| * In negative patterns, the minimum and maximum counts are ignored; |
| * these are presumed to be set in the positive pattern. |
| * |
| * @param pattern The pattern to be applied. |
| * @param pattern The pattern to be applied. |
| * @param parseError Struct to recieve information on position |
| * of error if an error is encountered |
| * @param status Output param set to success/failure code on |
| * exit. If the pattern is invalid, this will be |
| * set to a failure result. |
| * @draft ICU 2.0 |
| */ |
| virtual void applyPattern(const UnicodeString& pattern, |
| UParseError& parseError, |
| UErrorCode& status); |
| /** |
| * Sets the pattern. |
| * @param pattern The pattern to be applied. |
| * @param status Output param set to success/failure code on |
| * exit. If the pattern is invalid, this will be |
| * set to a failure result. |
| * @stable |
| */ |
| virtual void applyPattern(const UnicodeString& pattern, |
| UErrorCode& status); |
| |
| /** |
| * Apply the given pattern to this Format object. The pattern |
| * is assumed to be in a localized notation. A pattern is a |
| * short-hand specification for the various formatting properties. |
| * These properties can also be changed individually through the |
| * various setter methods. |
| * <P> |
| * There is no limit to integer digits are set |
| * by this routine, since that is the typical end-user desire; |
| * use setMaximumInteger if you want to set a real value. |
| * For negative numbers, use a second pattern, separated by a semicolon |
| * <pre> |
| * . Example "#,#00.0#" -> 1,234.56 |
| * </pre> |
| * This means a minimum of 2 integer digits, 1 fraction digit, and |
| * a maximum of 2 fraction digits. |
| * |
| * Example: "#,#00.0#;(#,#00.0#)" for negatives in parantheses. |
| * |
| * In negative patterns, the minimum and maximum counts are ignored; |
| * these are presumed to be set in the positive pattern. |
| * |
| * @param pattern The localized pattern to be applied. |
| * @param status Output param set to success/failure code on |
| * exit. If the pattern is invalid, this will be |
| * set to a failure result. |
| * @draft ICU 2.0 |
| */ |
| virtual void applyLocalizedPattern(const UnicodeString& pattern, |
| UParseError& parseError, |
| UErrorCode& status); |
| |
| /* |
| * Apply the given pattern to this Format object. |
| * @stable |
| */ |
| virtual void applyLocalizedPattern(const UnicodeString& pattern, |
| UErrorCode& status); |
| |
| |
| /** |
| * Sets the maximum number of digits allowed in the integer portion of a |
| * number. This override limits the integer digit count to 309. |
| * @see NumberFormat#setMaximumIntegerDigits |
| * @stable |
| */ |
| virtual void setMaximumIntegerDigits(int32_t newValue); |
| |
| /** |
| * Sets the minimum number of digits allowed in the integer portion of a |
| * number. This override limits the integer digit count to 309. |
| * @see NumberFormat#setMinimumIntegerDigits |
| * @stable |
| */ |
| virtual void setMinimumIntegerDigits(int32_t newValue); |
| |
| /** |
| * Sets the maximum number of digits allowed in the fraction portion of a |
| * number. This override limits the fraction digit count to 340. |
| * @see NumberFormat#setMaximumFractionDigits |
| * @stable |
| */ |
| virtual void setMaximumFractionDigits(int32_t newValue); |
| |
| /** |
| * Sets the minimum number of digits allowed in the fraction portion of a |
| * number. This override limits the fraction digit count to 340. |
| * @see NumberFormat#setMinimumFractionDigits |
| * @stable |
| */ |
| virtual void setMinimumFractionDigits(int32_t newValue); |
| |
| /** |
| * The resource tags we use to retrieve decimal format data from |
| * locale resource bundles. |
| * @stable |
| */ |
| static const char fgNumberPatterns[]; |
| |
| public: |
| |
| /** |
| * Return the class ID for this class. This is useful only for |
| * comparing to a return value from getDynamicClassID(). For example: |
| * <pre> |
| * . Base* polymorphic_pointer = createPolymorphicObject(); |
| * . if (polymorphic_pointer->getDynamicClassID() == |
| * . Derived::getStaticClassID()) ... |
| * </pre> |
| * @return The class ID for all objects of this class. |
| * @stable |
| */ |
| static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } |
| |
| /** |
| * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. |
| * This method is to implement a simple version of RTTI, since not all |
| * C++ compilers support genuine RTTI. Polymorphic operator==() and |
| * clone() methods call this method. |
| * |
| * @return The class ID for this object. All objects of a |
| * given class have the same class ID. Objects of |
| * other classes have different class IDs. |
| * @stable |
| */ |
| virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } |
| |
| private: |
| static const char fgClassID; |
| /** |
| * Do real work of constructing a new DecimalFormat. |
| */ |
| void construct(UErrorCode& status, |
| UParseError& parseErr, |
| const UnicodeString* pattern = 0, |
| DecimalFormatSymbols* symbolsToAdopt = 0, |
| const Locale& locale = Locale::getDefault() |
| ); |
| |
| /** |
| * Does the real work of generating a pattern. |
| */ |
| UnicodeString& toPattern(UnicodeString& result, UBool localized) const; |
| |
| /** |
| * Does the real work of applying a pattern. |
| * @param pattern The pattern to be applied. |
| * @param localized If true, the pattern is localized; else false. |
| * @param parseError Struct to recieve information on position |
| * of error if an error is encountered |
| * @param status Output param set to success/failure code on |
| * exit. If the pattern is invalid, this will be |
| * set to a failure result. |
| */ |
| void applyPattern(const UnicodeString& pattern, |
| UBool localized, |
| UParseError& parseError, |
| UErrorCode& status); |
| /** |
| * Do the work of formatting a number, either a double or a long. |
| */ |
| UnicodeString& subformat(UnicodeString& result, |
| FieldPosition& fieldPosition, |
| DigitList& digits, |
| UBool isInteger) const; |
| |
| enum { |
| fgStatusInfinite, |
| fgStatusLength // Leave last in list. |
| } StatusFlags; |
| |
| /** |
| * Parse the given text into a number. The text is parsed beginning at |
| * parsePosition, until an unparseable character is seen. |
| * @param text The string to parse. |
| * @param parsePosition The position at which to being parsing. Upon |
| * return, the first unparseable character. |
| * @param digits The DigitList to set to the parsed value. |
| * @param isExponent If true, parse an exponent. This means no |
| * infinite values and integer only. |
| * @param status Upon return contains boolean status flags indicating |
| * whether the value was infinite and whether it was positive. |
| */ |
| UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, |
| DigitList& digits, UBool* status) const; |
| |
| /** |
| * Append an affix to the given StringBuffer, using quotes if |
| * there are special characters. Single quotes themselves must be |
| * escaped in either case. |
| */ |
| void appendAffix(UnicodeString& buffer, const UnicodeString& affix, |
| UBool localized) const; |
| |
| void appendAffix(UnicodeString& buffer, |
| const UnicodeString* affixPattern, |
| const UnicodeString& expAffix, UBool localized) const; |
| |
| void expandAffix(const UnicodeString& pattern, |
| UnicodeString& affix) const; |
| |
| void expandAffixes(void); |
| |
| static double round(double a, ERoundingMode mode, UBool isNegative); |
| |
| void addPadding(UnicodeString& result, |
| FieldPosition& fieldPosition, |
| UBool hasAffixes, |
| UBool isNegative) const; |
| |
| UBool isGroupingPosition(int32_t pos) const; |
| |
| /** |
| * Constants. |
| */ |
| //static const int8_t fgMaxDigit; // The largest digit, in this case 9 |
| |
| /*transient*/ //DigitList* fDigitList; |
| |
| UnicodeString fPositivePrefix; |
| UnicodeString fPositiveSuffix; |
| UnicodeString fNegativePrefix; |
| UnicodeString fNegativeSuffix; |
| UnicodeString* fPosPrefixPattern; |
| UnicodeString* fPosSuffixPattern; |
| UnicodeString* fNegPrefixPattern; |
| UnicodeString* fNegSuffixPattern; |
| int32_t fMultiplier; |
| int32_t fGroupingSize; |
| int32_t fGroupingSize2; |
| UBool fDecimalSeparatorAlwaysShown; |
| /*transient*/ UBool fIsCurrencyFormat; |
| /* @deprecated */ DecimalFormatSymbols* fSymbols; |
| |
| UBool fUseExponentialNotation; |
| int8_t fMinExponentDigits; |
| UBool fExponentSignAlwaysShown; |
| |
| /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to |
| * fRoundingIncrement.getDouble(). Since this operation may be expensive, |
| * we cache the result in fRoundingDouble. All methods that update |
| * fRoundingIncrement also update fRoundingDouble. */ |
| DigitList* fRoundingIncrement; |
| /*transient*/ double fRoundingDouble; |
| ERoundingMode fRoundingMode; |
| |
| UnicodeString fPad; |
| int32_t fFormatWidth; |
| EPadPosition fPadPosition; |
| |
| // Constants for characters used in programmatic (unlocalized) patterns. |
| static const UChar kPatternZeroDigit; |
| static const UChar kPatternGroupingSeparator; |
| static const UChar kPatternDecimalSeparator; |
| static const UChar kPatternPerMill; |
| static const UChar kPatternPercent; |
| static const UChar kPatternDigit; |
| static const UChar kPatternSeparator; |
| static const UChar kPatternExponent; |
| static const UChar kPatternPlus; |
| static const UChar kPatternMinus; |
| static const UChar kPatternPadEscape; |
| |
| /** |
| * The CURRENCY_SIGN is the standard Unicode symbol for currency. It |
| * is used in patterns and substitued with either the currency symbol, |
| * or if it is doubled, with the international currency symbol. If the |
| * CURRENCY_SIGN is seen in a pattern, then the decimal separator is |
| * replaced with the monetary decimal separator. |
| */ |
| static const UChar kCurrencySign; |
| static const UChar kQuote; |
| |
| protected: |
| static const int32_t kDoubleIntegerDigits; |
| static const int32_t kDoubleFractionDigits; |
| }; |
| |
| inline UnicodeString& |
| DecimalFormat::format(const Formattable& obj, |
| UnicodeString& result, |
| UErrorCode& status) const { |
| // Don't use Format:: - use immediate base class only, |
| // in case immediate base modifies behavior later. |
| return NumberFormat::format(obj, result, status); |
| } |
| |
| inline UnicodeString& |
| DecimalFormat::format(double number, |
| UnicodeString& output) const { |
| FieldPosition pos(0); |
| return format(number, output, pos); |
| } |
| |
| inline UnicodeString& |
| DecimalFormat::format(int32_t number, |
| UnicodeString& output) const { |
| FieldPosition pos(0); |
| return format(number, output, pos); |
| } |
| |
| inline UChar |
| DecimalFormat::getPadCharacter() { |
| return getPadCharacterString().charAt(0); |
| } |
| |
| inline void |
| DecimalFormat::setPadCharacter(UChar padChar) { |
| setPadCharacter(UnicodeString(padChar)); |
| } |
| |
| U_NAMESPACE_END |
| |
| #endif // _DECIMFMT |
| //eof |