Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(331)

Side by Side Diff: source/i18n/unicode/decimfmt.h

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/i18n/unicode/dcfmtsym.h ('k') | source/i18n/unicode/dtfmtsym.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ******************************************************************************** 2 ********************************************************************************
3 * Copyright (C) 1997-2014, International Business Machines 3 * Copyright (C) 1997-2015, International Business Machines
4 * Corporation and others. All Rights Reserved. 4 * Corporation and others. All Rights Reserved.
5 ******************************************************************************** 5 ********************************************************************************
6 * 6 *
7 * File DECIMFMT.H 7 * File DECIMFMT.H
8 * 8 *
9 * Modification History: 9 * Modification History:
10 * 10 *
11 * Date Name Description 11 * Date Name Description
12 * 02/19/97 aliu Converted from java. 12 * 02/19/97 aliu Converted from java.
13 * 03/20/97 clhuang Updated per C++ implementation. 13 * 03/20/97 clhuang Updated per C++ implementation.
(...skipping 20 matching lines...) Expand all
34 #if !UCONFIG_NO_FORMATTING 34 #if !UCONFIG_NO_FORMATTING
35 35
36 #include "unicode/dcfmtsym.h" 36 #include "unicode/dcfmtsym.h"
37 #include "unicode/numfmt.h" 37 #include "unicode/numfmt.h"
38 #include "unicode/locid.h" 38 #include "unicode/locid.h"
39 #include "unicode/fpositer.h" 39 #include "unicode/fpositer.h"
40 #include "unicode/stringpiece.h" 40 #include "unicode/stringpiece.h"
41 #include "unicode/curramt.h" 41 #include "unicode/curramt.h"
42 #include "unicode/enumset.h" 42 #include "unicode/enumset.h"
43 43
44 #ifndef U_HIDE_INTERNAL_API
44 /** 45 /**
45 * \def UNUM_DECIMALFORMAT_INTERNAL_SIZE 46 * \def UNUM_DECIMALFORMAT_INTERNAL_SIZE
46 * @internal 47 * @internal
47 */ 48 */
48 #if UCONFIG_FORMAT_FASTPATHS_49 49 #if UCONFIG_FORMAT_FASTPATHS_49
49 #define UNUM_DECIMALFORMAT_INTERNAL_SIZE 16 50 #define UNUM_DECIMALFORMAT_INTERNAL_SIZE 16
50 #endif 51 #endif
52 #endif /* U_HIDE_INTERNAL_API */
51 53
52 U_NAMESPACE_BEGIN 54 U_NAMESPACE_BEGIN
53 55
54 class DigitList; 56 class DigitList;
55 class ChoiceFormat; 57 class ChoiceFormat;
56 class CurrencyPluralInfo; 58 class CurrencyPluralInfo;
57 class Hashtable; 59 class Hashtable;
58 class UnicodeSet; 60 class UnicodeSet;
59 class FieldPositionHandler; 61 class FieldPositionHandler;
60 class DecimalFormatStaticSets; 62 class DecimalFormatStaticSets;
61 class FixedDecimal; 63 class FixedDecimal;
64 class DecimalFormatImpl;
65 class PluralRules;
66 class VisibleDigitsWithExponent;
62 67
63 // explicit template instantiation. see digitlst.h 68 // explicit template instantiation. see digitlst.h
64 #if defined (_MSC_VER) 69 #if defined (_MSC_VER)
65 template class U_I18N_API EnumSet<UNumberFormatAttribute, 70 template class U_I18N_API EnumSet<UNumberFormatAttribute,
66 UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1, 71 UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
67 UNUM_LIMIT_BOOLEAN_ATTRIBUTE>; 72 UNUM_LIMIT_BOOLEAN_ATTRIBUTE>;
68 #endif 73 #endif
69 74
70 /** 75 /**
71 * DecimalFormat is a concrete subclass of NumberFormat that formats decimal 76 * DecimalFormat is a concrete subclass of NumberFormat that formats decimal
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 * @stable ICU 51 806 * @stable ICU 51
802 */ 807 */
803 virtual int32_t getAttribute( UNumberFormatAttribute attr, 808 virtual int32_t getAttribute( UNumberFormatAttribute attr,
804 UErrorCode &status) const; 809 UErrorCode &status) const;
805 810
806 811
807 /** 812 /**
808 * Set whether or not grouping will be used in this format. 813 * Set whether or not grouping will be used in this format.
809 * @param newValue True, grouping will be used in this format. 814 * @param newValue True, grouping will be used in this format.
810 * @see getGroupingUsed 815 * @see getGroupingUsed
811 * @draft ICU 53 816 * @stable ICU 53
812 */ 817 */
813 virtual void setGroupingUsed(UBool newValue); 818 virtual void setGroupingUsed(UBool newValue);
814 819
815 /** 820 /**
816 * Sets whether or not numbers should be parsed as integers only. 821 * Sets whether or not numbers should be parsed as integers only.
817 * @param value set True, this format will parse numbers as integers 822 * @param value set True, this format will parse numbers as integers
818 * only. 823 * only.
819 * @see isParseIntegerOnly 824 * @see isParseIntegerOnly
820 * @draft ICU 53 825 * @stable ICU 53
821 */ 826 */
822 virtual void setParseIntegerOnly(UBool value); 827 virtual void setParseIntegerOnly(UBool value);
823 828
824 /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
825 /** 829 /**
826 * Set a particular UDisplayContext value in the formatter, such as 830 * Set a particular UDisplayContext value in the formatter, such as
827 * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. 831 * UDISPCTX_CAPITALIZATION_FOR_STANDALONE.
828 * @param value The UDisplayContext value to set. 832 * @param value The UDisplayContext value to set.
829 * @param status Input/output status. If at entry this indicates a failure 833 * @param status Input/output status. If at entry this indicates a failure
830 * status, the function will do nothing; otherwise this will b e 834 * status, the function will do nothing; otherwise this will b e
831 * updated with any new status from the function. 835 * updated with any new status from the function.
832 * @draft ICU 53 836 * @stable ICU 53
833 */ 837 */
834 virtual void setContext(UDisplayContext value, UErrorCode& status); 838 virtual void setContext(UDisplayContext value, UErrorCode& status);
835 839
836 /** 840 /**
837 * Create a DecimalFormat from the given pattern and symbols. 841 * Create a DecimalFormat from the given pattern and symbols.
838 * Use this constructor when you need to completely customize the 842 * Use this constructor when you need to completely customize the
839 * behavior of the format. 843 * behavior of the format.
840 * <P> 844 * <P>
841 * To obtain standard formats for a given 845 * To obtain standard formats for a given
842 * locale, use the factory methods on NumberFormat such as 846 * locale, use the factory methods on NumberFormat such as
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 * @return Reference to 'appendTo' parameter. 1111 * @return Reference to 'appendTo' parameter.
1108 * @internal 1112 * @internal
1109 */ 1113 */
1110 virtual UnicodeString& format(const DigitList &number, 1114 virtual UnicodeString& format(const DigitList &number,
1111 UnicodeString& appendTo, 1115 UnicodeString& appendTo,
1112 FieldPositionIterator* posIter, 1116 FieldPositionIterator* posIter,
1113 UErrorCode& status) const; 1117 UErrorCode& status) const;
1114 1118
1115 /** 1119 /**
1116 * Format a decimal number. 1120 * Format a decimal number.
1121 * @param number The number
1122 * @param appendTo Output parameter to receive result.
1123 * Result is appended to existing contents.
1124 * @param pos On input: an alignment field, if desired.
1125 * On output: the offsets of the alignment field.
1126 * @param status Output param filled with success/failure status.
1127 * @return Reference to 'appendTo' parameter.
1128 * @internal
1129 */
1130 virtual UnicodeString& format(
1131 const VisibleDigitsWithExponent &number,
1132 UnicodeString& appendTo,
1133 FieldPosition& pos,
1134 UErrorCode& status) const;
1135
1136 /**
1137 * Format a decimal number.
1138 * @param number The number
1139 * @param appendTo Output parameter to receive result.
1140 * Result is appended to existing contents.
1141 * @param posIter On return, can be used to iterate over positions
1142 * of fields generated by this format call.
1143 * @param status Output param filled with success/failure status.
1144 * @return Reference to 'appendTo' parameter.
1145 * @internal
1146 */
1147 virtual UnicodeString& format(
1148 const VisibleDigitsWithExponent &number,
1149 UnicodeString& appendTo,
1150 FieldPositionIterator* posIter,
1151 UErrorCode& status) const;
1152
1153 /**
1154 * Format a decimal number.
1117 * The number is a DigitList wrapper onto a floating point decimal number. 1155 * The number is a DigitList wrapper onto a floating point decimal number.
1118 * The default implementation in NumberFormat converts the decimal number 1156 * The default implementation in NumberFormat converts the decimal number
1119 * to a double and formats that. 1157 * to a double and formats that.
1120 * 1158 *
1121 * @param number The number, a DigitList format Decimal Floating Point. 1159 * @param number The number, a DigitList format Decimal Floating Point.
1122 * @param appendTo Output parameter to receive result. 1160 * @param appendTo Output parameter to receive result.
1123 * Result is appended to existing contents. 1161 * Result is appended to existing contents.
1124 * @param pos On input: an alignment field, if desired. 1162 * @param pos On input: an alignment field, if desired.
1125 * On output: the offsets of the alignment field. 1163 * On output: the offsets of the alignment field.
1126 * @param status Output param filled with success/failure status. 1164 * @param status Output param filled with success/failure status.
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 * size is used for all intervals, not just the least significant. 1642 * size is used for all intervals, not just the least significant.
1605 * 1643 *
1606 * @param newValue the new value of the secondary grouping size. 1644 * @param newValue the new value of the secondary grouping size.
1607 * @see getSecondaryGroupingSize 1645 * @see getSecondaryGroupingSize
1608 * @see NumberFormat#setGroupingUsed 1646 * @see NumberFormat#setGroupingUsed
1609 * @see DecimalFormatSymbols::setGroupingSeparator 1647 * @see DecimalFormatSymbols::setGroupingSeparator
1610 * @stable ICU 2.4 1648 * @stable ICU 2.4
1611 */ 1649 */
1612 virtual void setSecondaryGroupingSize(int32_t newValue); 1650 virtual void setSecondaryGroupingSize(int32_t newValue);
1613 1651
1652 #ifndef U_HIDE_INTERNAL_API
1653
1654 /**
1655 * Returns the minimum number of grouping digits.
1656 * Grouping separators are output if there are at least this many
1657 * digits to the left of the first (rightmost) grouping separator,
1658 * that is, there are at least (minimum grouping + grouping size) integer di gits.
1659 * (Subject to isGroupingUsed().)
1660 *
1661 * For example, if this value is 2, and the grouping size is 3, then
1662 * 9999 -> "9999" and 10000 -> "10,000"
1663 *
1664 * This is a technology preview. This API may change behavior or may be remo ved.
1665 *
1666 * The default value for this attribute is 0.
1667 * A value of 1, 0, or lower, means that the use of grouping separators
1668 * only depends on the grouping size (and on isGroupingUsed()).
1669 * Currently, the corresponding CLDR data is not used; this is likely to cha nge.
1670 *
1671 * @see setMinimumGroupingDigits
1672 * @see getGroupingSize
1673 * @internal technology preview
1674 */
1675 int32_t getMinimumGroupingDigits() const;
1676
1677 /**
1678 * Sets the minimum grouping digits. Setting to a value less than or
1679 * equal to 1 turns off minimum grouping digits.
1680 *
1681 * @param newValue the new value of minimum grouping digits.
1682 * @see getMinimumGroupingDigits
1683 * @internal technology preview
1684 */
1685 virtual void setMinimumGroupingDigits(int32_t newValue);
1686
1687 #endif /* U_HIDE_INTERNAL_API */
1688
1614 /** 1689 /**
1615 * Allows you to get the behavior of the decimal separator with integers. 1690 * Allows you to get the behavior of the decimal separator with integers.
1616 * (The decimal separator will always appear with decimals.) 1691 * (The decimal separator will always appear with decimals.)
1617 * 1692 *
1618 * @return TRUE if the decimal separator always appear with decimals. 1693 * @return TRUE if the decimal separator always appear with decimals.
1619 * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 1694 * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345
1620 * @stable ICU 2.0 1695 * @stable ICU 2.0
1621 */ 1696 */
1622 UBool isDecimalSeparatorAlwaysShown(void) const; 1697 UBool isDecimalSeparatorAlwaysShown(void) const;
1623 1698
1624 /** 1699 /**
1625 * Allows you to set the behavior of the decimal separator with integers. 1700 * Allows you to set the behavior of the decimal separator with integers.
1626 * (The decimal separator will always appear with decimals.) 1701 * (The decimal separator will always appear with decimals.)
1627 * 1702 *
1628 * @param newValue set TRUE if the decimal separator will always appear w ith decimals. 1703 * @param newValue set TRUE if the decimal separator will always appear w ith decimals.
1629 * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 1704 * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345
1630 * @stable ICU 2.0 1705 * @stable ICU 2.0
1631 */ 1706 */
1632 virtual void setDecimalSeparatorAlwaysShown(UBool newValue); 1707 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
1633 1708
1634 #ifndef U_HIDE_DRAFT_API
1635 /** 1709 /**
1636 * Allows you to get the parse behavior of the pattern decimal mark. 1710 * Allows you to get the parse behavior of the pattern decimal mark.
1637 * 1711 *
1638 * @return TRUE if input must contain a match to decimal mark in pattern 1712 * @return TRUE if input must contain a match to decimal mark in pattern
1639 * @draft ICU 54 1713 * @stable ICU 54
1640 */ 1714 */
1641 UBool isDecimalPatternMatchRequired(void) const; 1715 UBool isDecimalPatternMatchRequired(void) const;
1642 #endif /* U_HIDE_DRAFT_API */
1643 1716
1644 /** 1717 /**
1645 * Allows you to set the behavior of the pattern decimal mark. 1718 * Allows you to set the behavior of the pattern decimal mark.
1646 * 1719 *
1647 * if TRUE, the input must have a decimal mark if one was specified in the p attern. When 1720 * if TRUE, the input must have a decimal mark if one was specified in the p attern. When
1648 * FALSE the decimal mark may be omitted from the input. 1721 * FALSE the decimal mark may be omitted from the input.
1649 * 1722 *
1650 * @param newValue set TRUE if input must contain a match to decimal mark in pattern 1723 * @param newValue set TRUE if input must contain a match to decimal mark in pattern
1651 * @draft ICU 54 1724 * @stable ICU 54
1652 */ 1725 */
1653 virtual void setDecimalPatternMatchRequired(UBool newValue); 1726 virtual void setDecimalPatternMatchRequired(UBool newValue);
1654 1727
1655 1728
1656 /** 1729 /**
1657 * Synthesizes a pattern string that represents the current state 1730 * Synthesizes a pattern string that represents the current state
1658 * of this Format object. 1731 * of this Format object.
1659 * 1732 *
1660 * @param result Output param which will receive the pattern. 1733 * @param result Output param which will receive the pattern.
1661 * Previous contents are deleted. 1734 * Previous contents are deleted.
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1887 */ 1960 */
1888 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); 1961 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
1889 1962
1890 /** 1963 /**
1891 * Sets the currency used to display currency amounts. See 1964 * Sets the currency used to display currency amounts. See
1892 * setCurrency(const UChar*, UErrorCode&). 1965 * setCurrency(const UChar*, UErrorCode&).
1893 * @deprecated ICU 3.0. Use setCurrency(const UChar*, UErrorCode&). 1966 * @deprecated ICU 3.0. Use setCurrency(const UChar*, UErrorCode&).
1894 */ 1967 */
1895 virtual void setCurrency(const UChar* theCurrency); 1968 virtual void setCurrency(const UChar* theCurrency);
1896 1969
1897 #ifndef U_HIDE_DRAFT_API
1898 /** 1970 /**
1899 * Sets the <tt>Currency Context</tt> object used to display currency. 1971 * Sets the <tt>Currency Context</tt> object used to display currency.
1900 * This takes effect immediately, if this format is a 1972 * This takes effect immediately, if this format is a
1901 * currency format. 1973 * currency format.
1902 * @param currencyContext new currency context object to use. 1974 * @param currencyContext new currency context object to use.
1903 * @draft ICU 54 1975 * @stable ICU 54
1904 */ 1976 */
1905 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec); 1977 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
1906 1978
1907 /** 1979 /**
1908 * Returns the <tt>Currency Context</tt> object used to display currency 1980 * Returns the <tt>Currency Context</tt> object used to display currency
1909 * @draft ICU 54 1981 * @stable ICU 54
1910 */ 1982 */
1911 UCurrencyUsage getCurrencyUsage() const; 1983 UCurrencyUsage getCurrencyUsage() const;
1912 #endif /* U_HIDE_DRAFT_API */
1913 1984
1914 1985
1915 #ifndef U_HIDE_DEPRECATED_API 1986 #ifndef U_HIDE_DEPRECATED_API
1916 /** 1987 /**
1917 * The resource tags we use to retrieve decimal format data from 1988 * The resource tags we use to retrieve decimal format data from
1918 * locale resource bundles. 1989 * locale resource bundles.
1919 * @deprecated ICU 3.4. This string has no public purpose. Please don't use it. 1990 * @deprecated ICU 3.4. This string has no public purpose. Please don't use it.
1920 */ 1991 */
1921 static const char fgNumberPatterns[]; 1992 static const char fgNumberPatterns[];
1922 #endif /* U_HIDE_DEPRECATED_API */ 1993 #endif /* U_HIDE_DEPRECATED_API */
(...skipping 15 matching lines...) Expand all
1938 */ 2009 */
1939 FixedDecimal getFixedDecimal(const Formattable &number, UErrorCode &status) const; 2010 FixedDecimal getFixedDecimal(const Formattable &number, UErrorCode &status) const;
1940 2011
1941 /** 2012 /**
1942 * Get a FixedDecimal corresponding to a DigitList as it would be 2013 * Get a FixedDecimal corresponding to a DigitList as it would be
1943 * formatted by this DecimalFormat. Note: the DigitList may be modified. 2014 * formatted by this DecimalFormat. Note: the DigitList may be modified.
1944 * Internal, not intended for public use. 2015 * Internal, not intended for public use.
1945 * @internal 2016 * @internal
1946 */ 2017 */
1947 FixedDecimal getFixedDecimal(DigitList &number, UErrorCode &status) const; 2018 FixedDecimal getFixedDecimal(DigitList &number, UErrorCode &status) const;
2019
2020 /**
2021 * Get a VisibleDigitsWithExponent corresponding to a double
2022 * as it would be formatted by this DecimalFormat.
2023 * Internal, not intended for public use.
2024 * @internal
2025 */
2026 VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
2027 double number,
2028 VisibleDigitsWithExponent &digits,
2029 UErrorCode &status) const;
2030
2031 /**
2032 * Get a VisibleDigitsWithExponent corresponding to a formattable
2033 * as it would be formatted by this DecimalFormat.
2034 * Internal, not intended for public use.
2035 * @internal
2036 */
2037 VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
2038 const Formattable &number,
2039 VisibleDigitsWithExponent &digits,
2040 UErrorCode &status) const;
2041
2042 /**
2043 * Get a VisibleDigitsWithExponent corresponding to a DigitList
2044 * as it would be formatted by this DecimalFormat.
2045 * Note: the DigitList may be modified.
2046 * Internal, not intended for public use.
2047 * @internal
2048 */
2049 VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
2050 DigitList &number,
2051 VisibleDigitsWithExponent &digits,
2052 UErrorCode &status) const;
2053
1948 #endif /* U_HIDE_INTERNAL_API */ 2054 #endif /* U_HIDE_INTERNAL_API */
1949 2055
1950 public: 2056 public:
1951 2057
1952 /** 2058 /**
1953 * Return the class ID for this class. This is useful only for 2059 * Return the class ID for this class. This is useful only for
1954 * comparing to a return value from getDynamicClassID(). For example: 2060 * comparing to a return value from getDynamicClassID(). For example:
1955 * <pre> 2061 * <pre>
1956 * . Base* polymorphic_pointer = createPolymorphicObject(); 2062 * . Base* polymorphic_pointer = createPolymorphicObject();
1957 * . if (polymorphic_pointer->getDynamicClassID() == 2063 * . if (polymorphic_pointer->getDynamicClassID() ==
(...skipping 14 matching lines...) Expand all
1972 * given class have the same class ID. Objects of 2078 * given class have the same class ID. Objects of
1973 * other classes have different class IDs. 2079 * other classes have different class IDs.
1974 * @stable ICU 2.0 2080 * @stable ICU 2.0
1975 */ 2081 */
1976 virtual UClassID getDynamicClassID(void) const; 2082 virtual UClassID getDynamicClassID(void) const;
1977 2083
1978 private: 2084 private:
1979 2085
1980 DecimalFormat(); // default constructor not implemented 2086 DecimalFormat(); // default constructor not implemented
1981 2087
1982 int32_t precision() const;
1983
1984 /** 2088 /**
1985 * Initialize all fields of a new DecimalFormatter to a safe default value . 2089 * Initialize all fields of a new DecimalFormatter to a safe default value .
1986 * Common code for use by constructors. 2090 * Common code for use by constructors.
1987 */ 2091 */
1988 void init(); 2092 void init();
1989 2093
1990 /** 2094 /**
1991 * Do real work of constructing a new DecimalFormat. 2095 * Do real work of constructing a new DecimalFormat.
1992 */ 2096 */
1993 void construct(UErrorCode& status, 2097 void construct(UErrorCode& status,
1994 UParseError& parseErr, 2098 UParseError& parseErr,
1995 const UnicodeString* pattern = 0, 2099 const UnicodeString* pattern = 0,
1996 DecimalFormatSymbols* symbolsToAdopt = 0 2100 DecimalFormatSymbols* symbolsToAdopt = 0
1997 ); 2101 );
1998 2102
1999 /**
2000 * Does the real work of generating a pattern.
2001 *
2002 * @param result Output param which will receive the pattern.
2003 * Previous contents are deleted.
2004 * @param localized TRUE return localized pattern.
2005 * @return A reference to 'result'.
2006 */
2007 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
2008
2009 /**
2010 * Does the real work of applying a pattern.
2011 * @param pattern The pattern to be applied.
2012 * @param localized If true, the pattern is localized; else false.
2013 * @param parseError Struct to recieve information on position
2014 * of error if an error is encountered
2015 * @param status Output param set to success/failure code on
2016 * exit. If the pattern is invalid, this will be
2017 * set to a failure result.
2018 */
2019 void applyPattern(const UnicodeString& pattern,
2020 UBool localized,
2021 UParseError& parseError,
2022 UErrorCode& status);
2023
2024 /*
2025 * similar to applyPattern, but without re-gen affix for currency
2026 */
2027 void applyPatternInternally(const UnicodeString& pluralCount,
2028 const UnicodeString& pattern,
2029 UBool localized,
2030 UParseError& parseError,
2031 UErrorCode& status);
2032
2033 /*
2034 * only apply pattern without expand affixes
2035 */
2036 void applyPatternWithoutExpandAffix(const UnicodeString& pattern,
2037 UBool localized,
2038 UParseError& parseError,
2039 UErrorCode& status);
2040
2041
2042 /*
2043 * expand affixes (after apply patter) and re-compute fFormatWidth
2044 */
2045 void expandAffixAdjustWidth(const UnicodeString* pluralCount);
2046
2047
2048 /**
2049 * Do the work of formatting a number, either a double or a long.
2050 *
2051 * @param appendTo Output parameter to receive result.
2052 * Result is appended to existing contents.
2053 * @param handler Records information about field positions.
2054 * @param digits the digits to be formatted.
2055 * @param isInteger if TRUE format the digits as Integer.
2056 * @return Reference to 'appendTo' parameter.
2057 */
2058 UnicodeString& subformat(UnicodeString& appendTo,
2059 FieldPositionHandler& handler,
2060 DigitList& digits,
2061 UBool isInteger,
2062 UErrorCode &status) const;
2063
2064
2065 void parse(const UnicodeString& text, 2103 void parse(const UnicodeString& text,
2066 Formattable& result, 2104 Formattable& result,
2067 ParsePosition& pos, 2105 ParsePosition& pos,
2068 UChar* currency) const; 2106 UChar* currency) const;
2069 2107
2070 enum { 2108 enum {
2071 fgStatusInfinite, 2109 fgStatusInfinite,
2072 fgStatusLength // Leave last in list. 2110 fgStatusLength // Leave last in list.
2073 } StatusFlags; 2111 } StatusFlags;
2074 2112
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2138 static UBool matchDecimal(UChar32 symbolChar, 2176 static UBool matchDecimal(UChar32 symbolChar,
2139 UBool sawDecimal, UChar32 sawDecimalChar, 2177 UBool sawDecimal, UChar32 sawDecimalChar,
2140 const UnicodeSet *sset, UChar32 schar); 2178 const UnicodeSet *sset, UChar32 schar);
2141 2179
2142 static UBool matchGrouping(UChar32 groupingChar, 2180 static UBool matchGrouping(UChar32 groupingChar,
2143 UBool sawGrouping, UChar32 sawGroupingChar, 2181 UBool sawGrouping, UChar32 sawGroupingChar,
2144 const UnicodeSet *sset, 2182 const UnicodeSet *sset,
2145 UChar32 decimalChar, const UnicodeSet *decimalSet, 2183 UChar32 decimalChar, const UnicodeSet *decimalSet,
2146 UChar32 schar); 2184 UChar32 schar);
2147 2185
2148 /**
2149 * Get a decimal format symbol.
2150 * Returns a const reference to the symbol string.
2151 * @internal
2152 */
2153 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberForm atSymbol symbol) const;
2154
2155 int32_t appendAffix(UnicodeString& buf,
2156 double number,
2157 FieldPositionHandler& handler,
2158 UBool isNegative,
2159 UBool isPrefix) const;
2160
2161 /**
2162 * Append an affix to the given UnicodeString, using quotes if
2163 * there are special characters. Single quotes themselves must be
2164 * escaped in either case.
2165 */
2166 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
2167 UBool localized) const;
2168
2169 void appendAffixPattern(UnicodeString& appendTo,
2170 const UnicodeString* affixPattern,
2171 const UnicodeString& expAffix, UBool localized) cons t;
2172
2173 void expandAffix(const UnicodeString& pattern,
2174 UnicodeString& affix,
2175 double number,
2176 FieldPositionHandler& handler,
2177 UBool doFormat,
2178 const UnicodeString* pluralCount) const;
2179
2180 void expandAffixes(const UnicodeString* pluralCount);
2181
2182 void addPadding(UnicodeString& appendTo,
2183 FieldPositionHandler& handler,
2184 int32_t prefixLen, int32_t suffixLen) const;
2185
2186 UBool isGroupingPosition(int32_t pos) const;
2187
2188 void setCurrencyForSymbols();
2189
2190 // similar to setCurrency without re-compute the affixes for currency.
2191 // If currency changes, the affix pattern for currency is not changed,
2192 // but the affix will be changed. So, affixes need to be
2193 // re-computed in setCurrency(), but not in setCurrencyInternally().
2194 virtual void setCurrencyInternally(const UChar* theCurrency, UErrorCode& ec) ;
2195
2196 // set up currency affix patterns for mix parsing. 2186 // set up currency affix patterns for mix parsing.
2197 // The patterns saved here are the affix patterns of default currency 2187 // The patterns saved here are the affix patterns of default currency
2198 // pattern and the unique affix patterns of the plural currency patterns. 2188 // pattern and the unique affix patterns of the plural currency patterns.
2199 // Those patterns are used by parseForCurrency(). 2189 // Those patterns are used by parseForCurrency().
2200 void setupCurrencyAffixPatterns(UErrorCode& status); 2190 void setupCurrencyAffixPatterns(UErrorCode& status);
2201 2191
2202 // set up the currency affixes used in currency plural formatting.
2203 // It sets up both fAffixesForCurrency for currency pattern if the current
2204 // pattern contains 3 currency signs,
2205 // and it sets up fPluralAffixesForCurrency for currency plural patterns.
2206 void setupCurrencyAffixes(const UnicodeString& pattern,
2207 UBool setupForCurrentPattern,
2208 UBool setupForPluralPattern,
2209 UErrorCode& status);
2210
2211 // get the currency rounding with respect to currency usage 2192 // get the currency rounding with respect to currency usage
2212 double getCurrencyRounding(const UChar* currency, 2193 double getCurrencyRounding(const UChar* currency,
2213 UErrorCode* ec) const; 2194 UErrorCode* ec) const;
2214 2195
2215 // get the currency fraction with respect to currency usage 2196 // get the currency fraction with respect to currency usage
2216 int getCurrencyFractionDigits(const UChar* currency, 2197 int getCurrencyFractionDigits(const UChar* currency,
2217 UErrorCode* ec) const; 2198 UErrorCode* ec) const;
2218 2199
2219 // hashtable operations 2200 // hashtable operations
2220 Hashtable* initHashForAffixPattern(UErrorCode& status); 2201 Hashtable* initHashForAffixPattern(UErrorCode& status);
2221 Hashtable* initHashForAffix(UErrorCode& status);
2222 2202
2223 void deleteHashForAffixPattern(); 2203 void deleteHashForAffixPattern();
2224 void deleteHashForAffix(Hashtable*& table);
2225 2204
2226 void copyHashForAffixPattern(const Hashtable* source, 2205 void copyHashForAffixPattern(const Hashtable* source,
2227 Hashtable* target, UErrorCode& status); 2206 Hashtable* target, UErrorCode& status);
2228 void copyHashForAffix(const Hashtable* source,
2229 Hashtable* target, UErrorCode& status);
2230 2207
2231 UnicodeString& _format(int64_t number, 2208 DecimalFormatImpl *fImpl;
2232 UnicodeString& appendTo,
2233 FieldPositionHandler& handler,
2234 UErrorCode &status) const;
2235 UnicodeString& _format(double number,
2236 UnicodeString& appendTo,
2237 FieldPositionHandler& handler,
2238 UErrorCode &status) const;
2239 UnicodeString& _format(const DigitList &number,
2240 UnicodeString& appendTo,
2241 FieldPositionHandler& handler,
2242 UErrorCode &status) const;
2243 2209
2244 /** 2210 /**
2245 * Constants. 2211 * Constants.
2246 */ 2212 */
2247 2213
2248 UnicodeString fPositivePrefix;
2249 UnicodeString fPositiveSuffix;
2250 UnicodeString fNegativePrefix;
2251 UnicodeString fNegativeSuffix;
2252 UnicodeString* fPosPrefixPattern;
2253 UnicodeString* fPosSuffixPattern;
2254 UnicodeString* fNegPrefixPattern;
2255 UnicodeString* fNegSuffixPattern;
2256
2257 /**
2258 * Formatter for ChoiceFormat-based currency names. If this field
2259 * is not null, then delegate to it to format currency symbols.
2260 * @since ICU 2.6
2261 */
2262 ChoiceFormat* fCurrencyChoice;
2263
2264 DigitList * fMultiplier; // NULL for multiplier of one
2265 int32_t fScale;
2266 int32_t fGroupingSize;
2267 int32_t fGroupingSize2;
2268 UBool fDecimalSeparatorAlwaysShown;
2269 DecimalFormatSymbols* fSymbols;
2270
2271 UBool fUseSignificantDigits;
2272 int32_t fMinSignificantDigits;
2273 int32_t fMaxSignificantDigits;
2274
2275 UBool fUseExponentialNotation;
2276 int8_t fMinExponentDigits;
2277 UBool fExponentSignAlwaysShown;
2278 2214
2279 EnumSet<UNumberFormatAttribute, 2215 EnumSet<UNumberFormatAttribute,
2280 UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1, 2216 UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
2281 UNUM_LIMIT_BOOLEAN_ATTRIBUTE> 2217 UNUM_LIMIT_BOOLEAN_ATTRIBUTE>
2282 fBoolFlags; 2218 fBoolFlags;
2283 2219
2284 DigitList* fRoundingIncrement; // NULL if no rounding incremen t specified.
2285 ERoundingMode fRoundingMode;
2286 2220
2287 UChar32 fPad;
2288 int32_t fFormatWidth;
2289 EPadPosition fPadPosition;
2290
2291 /*
2292 * Following are used for currency format
2293 */
2294 // pattern used in this formatter
2295 UnicodeString fFormatPattern;
2296 // style is only valid when decimal formatter is constructed by 2221 // style is only valid when decimal formatter is constructed by
2297 // DecimalFormat(pattern, decimalFormatSymbol, style) 2222 // DecimalFormat(pattern, decimalFormatSymbol, style)
2298 int fStyle; 2223 int fStyle;
2299 /*
2300 * Represents whether this is a currency format, and which
2301 * currency format style.
2302 * 0: not currency format type;
2303 * 1: currency style -- symbol name, such as "$" for US dollar.
2304 * 2: currency style -- ISO name, such as USD for US dollar.
2305 * 3: currency style -- plural long name, such as "US Dollar" for
2306 * "1.00 US Dollar", or "US Dollars" for
2307 * "3.00 US Dollars".
2308 */
2309 int fCurrencySignCount;
2310 2224
2311 2225
2312 /* For currency parsing purose,
2313 * Need to remember all prefix patterns and suffix patterns of
2314 * every currency format pattern,
2315 * including the pattern of default currecny style
2316 * and plural currency style. And the patterns are set through applyPattern.
2317 */
2318 // TODO: innerclass?
2319 /* This is not needed in the class declaration, so it is moved into decimfmp .cpp
2320 struct AffixPatternsForCurrency : public UMemory {
2321 // negative prefix pattern
2322 UnicodeString negPrefixPatternForCurrency;
2323 // negative suffix pattern
2324 UnicodeString negSuffixPatternForCurrency;
2325 // positive prefix pattern
2326 UnicodeString posPrefixPatternForCurrency;
2327 // positive suffix pattern
2328 UnicodeString posSuffixPatternForCurrency;
2329 int8_t patternType;
2330
2331 AffixPatternsForCurrency(const UnicodeString& negPrefix,
2332 const UnicodeString& negSuffix,
2333 const UnicodeString& posPrefix,
2334 const UnicodeString& posSuffix,
2335 int8_t type) {
2336 negPrefixPatternForCurrency = negPrefix;
2337 negSuffixPatternForCurrency = negSuffix;
2338 posPrefixPatternForCurrency = posPrefix;
2339 posSuffixPatternForCurrency = posSuffix;
2340 patternType = type;
2341 }
2342 };
2343 */
2344
2345 /* affix for currency formatting when the currency sign in the pattern
2346 * equals to 3, such as the pattern contains 3 currency sign or
2347 * the formatter style is currency plural format style.
2348 */
2349 /* This is not needed in the class declaration, so it is moved into decimfmp .cpp
2350 struct AffixesForCurrency : public UMemory {
2351 // negative prefix
2352 UnicodeString negPrefixForCurrency;
2353 // negative suffix
2354 UnicodeString negSuffixForCurrency;
2355 // positive prefix
2356 UnicodeString posPrefixForCurrency;
2357 // positive suffix
2358 UnicodeString posSuffixForCurrency;
2359
2360 int32_t formatWidth;
2361
2362 AffixesForCurrency(const UnicodeString& negPrefix,
2363 const UnicodeString& negSuffix,
2364 const UnicodeString& posPrefix,
2365 const UnicodeString& posSuffix) {
2366 negPrefixForCurrency = negPrefix;
2367 negSuffixForCurrency = negSuffix;
2368 posPrefixForCurrency = posPrefix;
2369 posSuffixForCurrency = posSuffix;
2370 }
2371 };
2372 */
2373
2374 // Affix pattern set for currency. 2226 // Affix pattern set for currency.
2375 // It is a set of AffixPatternsForCurrency, 2227 // It is a set of AffixPatternsForCurrency,
2376 // each element of the set saves the negative prefix pattern, 2228 // each element of the set saves the negative prefix pattern,
2377 // negative suffix pattern, positive prefix pattern, 2229 // negative suffix pattern, positive prefix pattern,
2378 // and positive suffix pattern of a pattern. 2230 // and positive suffix pattern of a pattern.
2379 // It is used for currency mixed style parsing. 2231 // It is used for currency mixed style parsing.
2380 // It is actually is a set. 2232 // It is actually is a set.
2381 // The set contains the default currency pattern from the locale, 2233 // The set contains the default currency pattern from the locale,
2382 // and the currency plural patterns. 2234 // and the currency plural patterns.
2383 // Since it is a set, it does not contain duplicated items. 2235 // Since it is a set, it does not contain duplicated items.
2384 // For example, if 2 currency plural patterns are the same, only one pattern 2236 // For example, if 2 currency plural patterns are the same, only one pattern
2385 // is included in the set. When parsing, we do not check whether the plural 2237 // is included in the set. When parsing, we do not check whether the plural
2386 // count match or not. 2238 // count match or not.
2387 Hashtable* fAffixPatternsForCurrency; 2239 Hashtable* fAffixPatternsForCurrency;
2388 2240
2389 // Following 2 are affixes for currency.
2390 // It is a hash map from plural count to AffixesForCurrency.
2391 // AffixesForCurrency saves the negative prefix,
2392 // negative suffix, positive prefix, and positive suffix of a pattern.
2393 // It is used during currency formatting only when the currency sign count
2394 // is 3. In which case, the affixes are getting from here, not
2395 // from the fNegativePrefix etc.
2396 Hashtable* fAffixesForCurrency; // for current pattern
2397 Hashtable* fPluralAffixesForCurrency; // for plural pattern
2398
2399 // Information needed for DecimalFormat to format/parse currency plural. 2241 // Information needed for DecimalFormat to format/parse currency plural.
2400 CurrencyPluralInfo* fCurrencyPluralInfo; 2242 CurrencyPluralInfo* fCurrencyPluralInfo;
2401 2243
2402 #if UCONFIG_HAVE_PARSEALLINPUT 2244 #if UCONFIG_HAVE_PARSEALLINPUT
2403 UNumberFormatAttributeValue fParseAllInput; 2245 UNumberFormatAttributeValue fParseAllInput;
2404 #endif 2246 #endif
2405 2247
2406 // Decimal Format Static Sets singleton. 2248 // Decimal Format Static Sets singleton.
2407 const DecimalFormatStaticSets *fStaticSets; 2249 const DecimalFormatStaticSets *fStaticSets;
2408 2250
2409 // Currency Usage(STANDARD vs CASH)
2410 UCurrencyUsage fCurrencyUsage;
2411
2412 protected: 2251 protected:
2413 2252
2414 #ifndef U_HIDE_INTERNAL_API 2253 #ifndef U_HIDE_INTERNAL_API
2415 /** 2254 /**
2416 * Rounds a value according to the rules of this object. 2255 * Rounds a value according to the rules of this object.
2417 * @internal 2256 * @internal
2418 */ 2257 */
2419 DigitList& _round(const DigitList& number, DigitList& adjustedNum, UBool& is Negative, UErrorCode& status) const; 2258 DigitList& _round(const DigitList& number, DigitList& adjustedNum, UBool& is Negative, UErrorCode& status) const;
2420 #endif /* U_HIDE_INTERNAL_API */ 2259 #endif /* U_HIDE_INTERNAL_API */
2421 2260
(...skipping 21 matching lines...) Expand all
2443 * number of digits is due to flipping from some other mode that didn't 2282 * number of digits is due to flipping from some other mode that didn't
2444 * restrict the maximum, and so we force 1 integer digit. We don't bother 2283 * restrict the maximum, and so we force 1 integer digit. We don't bother
2445 * to track and see if someone is using exponential notation with more than 2284 * to track and see if someone is using exponential notation with more than
2446 * this number, it wouldn't make sense anyway, and this is just to make sure 2285 * this number, it wouldn't make sense anyway, and this is just to make sure
2447 * that someone turning on scientific mode with default settings doesn't 2286 * that someone turning on scientific mode with default settings doesn't
2448 * end up with lots of zeroes. 2287 * end up with lots of zeroes.
2449 * @stable ICU 2.8 2288 * @stable ICU 2.8
2450 */ 2289 */
2451 static const int32_t kMaxScientificIntegerDigits; 2290 static const int32_t kMaxScientificIntegerDigits;
2452 2291
2453 #if UCONFIG_FORMAT_FASTPATHS_49
2454 private:
2455 /**
2456 * Internal state.
2457 * @internal
2458 */
2459 uint8_t fReserved[UNUM_DECIMALFORMAT_INTERNAL_SIZE];
2460
2461
2462 /**
2463 * Called whenever any state changes. Recomputes whether fastpath is OK to u se.
2464 */
2465 void handleChanged();
2466 #endif
2467 }; 2292 };
2468 2293
2469 inline const UnicodeString &
2470 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
2471 return fSymbols->getConstSymbol(symbol);
2472 }
2473
2474 U_NAMESPACE_END 2294 U_NAMESPACE_END
2475 2295
2476 #endif /* #if !UCONFIG_NO_FORMATTING */ 2296 #endif /* #if !UCONFIG_NO_FORMATTING */
2477 2297
2478 #endif // _DECIMFMT 2298 #endif // _DECIMFMT
2479 //eof 2299 //eof
OLDNEW
« no previous file with comments | « source/i18n/unicode/dcfmtsym.h ('k') | source/i18n/unicode/dtfmtsym.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698