00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef DECIMFMT_H
00025 #define DECIMFMT_H
00026
00027 #include "unicode/utypes.h"
00028 #include "unicode/numfmt.h"
00029 #include "unicode/locid.h"
00030
00031 U_NAMESPACE_BEGIN
00032
00033 class DecimalFormatSymbols;
00034 class DigitList;
00035
00180 class U_I18N_API DecimalFormat: public NumberFormat {
00181 public:
00182 enum ERoundingMode {
00183 kRoundCeiling,
00184 kRoundFloor,
00185 kRoundDown,
00186 kRoundUp,
00187 kRoundHalfEven,
00188 kRoundHalfDown,
00189 kRoundHalfUp
00190
00191 };
00192
00193 enum EPadPosition {
00194 kPadBeforePrefix,
00195 kPadAfterPrefix,
00196 kPadBeforeSuffix,
00197 kPadAfterSuffix
00198 };
00199
00213 DecimalFormat(UErrorCode& status);
00214
00229 DecimalFormat(const UnicodeString& pattern,
00230 UErrorCode& status);
00231
00250 DecimalFormat( const UnicodeString& pattern,
00251 DecimalFormatSymbols* symbolsToAdopt,
00252 UErrorCode& status);
00253
00273 DecimalFormat( const UnicodeString& pattern,
00274 DecimalFormatSymbols* symbolsToAdopt,
00275 UParseError& parseError,
00276 UErrorCode& status);
00294 DecimalFormat( const UnicodeString& pattern,
00295 const DecimalFormatSymbols& symbols,
00296 UErrorCode& status);
00297
00302 DecimalFormat(const DecimalFormat& source);
00303
00308 DecimalFormat& operator=(const DecimalFormat& rhs);
00309
00314 virtual ~DecimalFormat();
00315
00321 virtual Format* clone(void) const;
00322
00328 virtual UBool operator==(const Format& other) const;
00329
00341 virtual UnicodeString& format(double number,
00342 UnicodeString& toAppendTo,
00343 FieldPosition& pos) const;
00355 virtual UnicodeString& format(int32_t number,
00356 UnicodeString& toAppendTo,
00357 FieldPosition& pos) const;
00370 virtual UnicodeString& format(const Formattable& obj,
00371 UnicodeString& toAppendTo,
00372 FieldPosition& pos,
00373 UErrorCode& status) const;
00374
00379 UnicodeString& format(const Formattable& obj,
00380 UnicodeString& result,
00381 UErrorCode& status) const;
00382
00387 UnicodeString& format(double number,
00388 UnicodeString& output) const;
00389
00394 UnicodeString& format(int32_t number,
00395 UnicodeString& output) const;
00396
00416 virtual void parse(const UnicodeString& text,
00417 Formattable& result,
00418 ParsePosition& parsePosition) const;
00419
00420
00422 virtual void parse(const UnicodeString& text,
00423 Formattable& result,
00424 UErrorCode& error) const;
00425
00433 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00434
00441 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00442
00449 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00450
00451
00458 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00459
00466 virtual void setPositivePrefix(const UnicodeString& newValue);
00467
00474 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00475
00482 virtual void setNegativePrefix(const UnicodeString& newValue);
00483
00490 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00491
00498 virtual void setPositiveSuffix(const UnicodeString& newValue);
00499
00506 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00507
00514 virtual void setNegativeSuffix(const UnicodeString& newValue);
00515
00525 int32_t getMultiplier(void) const;
00526
00536 virtual void setMultiplier(int32_t newValue);
00537
00547 virtual double getRoundingIncrement(void);
00548
00559 virtual void setRoundingIncrement(double newValue);
00560
00569 virtual ERoundingMode getRoundingMode(void);
00570
00580 virtual void setRoundingMode(ERoundingMode roundingMode);
00581
00592 virtual int32_t getFormatWidth(void);
00593
00607 virtual void setFormatWidth(int32_t width);
00608
00619 inline UChar getPadCharacter(void);
00620
00634 virtual UnicodeString getPadCharacterString();
00635
00647 inline void setPadCharacter(UChar padChar);
00648
00663 virtual void setPadCharacter(UnicodeString padChar);
00664
00683 virtual EPadPosition getPadPosition(void);
00684
00705 virtual void setPadPosition(EPadPosition padPos);
00706
00717 virtual UBool isScientificNotation(void);
00718
00730 virtual void setScientificNotation(UBool useScientific);
00731
00742 virtual int8_t getMinimumExponentDigits(void);
00743
00756 virtual void setMinimumExponentDigits(int8_t minExpDig);
00757
00770 virtual UBool isExponentSignAlwaysShown(void);
00771
00785 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00786
00796 int32_t getGroupingSize(void) const;
00797
00807 virtual void setGroupingSize(int32_t newValue);
00808
00826 int32_t getSecondaryGroupingSize(void) const;
00827
00836 virtual void setSecondaryGroupingSize(int32_t newValue);
00837
00845 UBool isDecimalSeparatorAlwaysShown(void) const;
00846
00854 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00855
00862 virtual UnicodeString& toPattern(UnicodeString& result) const;
00863
00871 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00872
00903 virtual void applyPattern(const UnicodeString& pattern,
00904 UParseError& parseError,
00905 UErrorCode& status);
00914 virtual void applyPattern(const UnicodeString& pattern,
00915 UErrorCode& status);
00916
00945 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00946 UParseError& parseError,
00947 UErrorCode& status);
00948
00949
00950
00951
00952
00953 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00954 UErrorCode& status);
00955
00956
00963 virtual void setMaximumIntegerDigits(int32_t newValue);
00964
00971 virtual void setMinimumIntegerDigits(int32_t newValue);
00972
00979 virtual void setMaximumFractionDigits(int32_t newValue);
00980
00987 virtual void setMinimumFractionDigits(int32_t newValue);
00988
00994 static const char fgNumberPatterns[];
00995
00996 public:
00997
01009 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01010
01022 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
01023
01024 private:
01025 static const char fgClassID;
01029 void construct(UErrorCode& status,
01030 UParseError& parseErr,
01031 const UnicodeString* pattern = 0,
01032 DecimalFormatSymbols* symbolsToAdopt = 0,
01033 const Locale& locale = Locale::getDefault()
01034 );
01035
01039 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01040
01051 void applyPattern(const UnicodeString& pattern,
01052 UBool localized,
01053 UParseError& parseError,
01054 UErrorCode& status);
01058 UnicodeString& subformat(UnicodeString& result,
01059 FieldPosition& fieldPosition,
01060 DigitList& digits,
01061 UBool isInteger) const;
01062
01063 enum {
01064 fgStatusInfinite,
01065 fgStatusLength
01066 } StatusFlags;
01067
01080 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01081 DigitList& digits, UBool* status) const;
01082
01088 void appendAffix(UnicodeString& buffer, const UnicodeString& affix,
01089 UBool localized) const;
01090
01091 void appendAffix(UnicodeString& buffer,
01092 const UnicodeString* affixPattern,
01093 const UnicodeString& expAffix, UBool localized) const;
01094
01095 void expandAffix(const UnicodeString& pattern,
01096 UnicodeString& affix) const;
01097
01098 void expandAffixes(void);
01099
01100 static double round(double a, ERoundingMode mode, UBool isNegative);
01101
01102 void addPadding(UnicodeString& result,
01103 FieldPosition& fieldPosition,
01104 UBool hasAffixes,
01105 UBool isNegative) const;
01106
01107 UBool isGroupingPosition(int32_t pos) const;
01108
01112
01113
01114
01115
01116 UnicodeString fPositivePrefix;
01117 UnicodeString fPositiveSuffix;
01118 UnicodeString fNegativePrefix;
01119 UnicodeString fNegativeSuffix;
01120 UnicodeString* fPosPrefixPattern;
01121 UnicodeString* fPosSuffixPattern;
01122 UnicodeString* fNegPrefixPattern;
01123 UnicodeString* fNegSuffixPattern;
01124 int32_t fMultiplier;
01125 int32_t fGroupingSize;
01126 int32_t fGroupingSize2;
01127 UBool fDecimalSeparatorAlwaysShown;
01128 UBool fIsCurrencyFormat;
01129 DecimalFormatSymbols* fSymbols;
01130
01131 UBool fUseExponentialNotation;
01132 int8_t fMinExponentDigits;
01133 UBool fExponentSignAlwaysShown;
01134
01135
01136
01137
01138
01139 DigitList* fRoundingIncrement;
01140 double fRoundingDouble;
01141 ERoundingMode fRoundingMode;
01142
01143 UnicodeString fPad;
01144 int32_t fFormatWidth;
01145 EPadPosition fPadPosition;
01146
01147
01148 static const UChar kPatternZeroDigit;
01149 static const UChar kPatternGroupingSeparator;
01150 static const UChar kPatternDecimalSeparator;
01151 static const UChar kPatternPerMill;
01152 static const UChar kPatternPercent;
01153 static const UChar kPatternDigit;
01154 static const UChar kPatternSeparator;
01155 static const UChar kPatternExponent;
01156 static const UChar kPatternPlus;
01157 static const UChar kPatternMinus;
01158 static const UChar kPatternPadEscape;
01159
01167 static const UChar kCurrencySign;
01168 static const UChar kQuote;
01169
01170 protected:
01171 static const int32_t kDoubleIntegerDigits;
01172 static const int32_t kDoubleFractionDigits;
01173 };
01174
01175 inline UnicodeString&
01176 DecimalFormat::format(const Formattable& obj,
01177 UnicodeString& result,
01178 UErrorCode& status) const {
01179
01180
01181 return NumberFormat::format(obj, result, status);
01182 }
01183
01184 inline UnicodeString&
01185 DecimalFormat::format(double number,
01186 UnicodeString& output) const {
01187 FieldPosition pos(0);
01188 return format(number, output, pos);
01189 }
01190
01191 inline UnicodeString&
01192 DecimalFormat::format(int32_t number,
01193 UnicodeString& output) const {
01194 FieldPosition pos(0);
01195 return format(number, output, pos);
01196 }
01197
01198 inline UChar
01199 DecimalFormat::getPadCharacter() {
01200 return getPadCharacterString().charAt(0);
01201 }
01202
01203 inline void
01204 DecimalFormat::setPadCharacter(UChar padChar) {
01205 setPadCharacter(UnicodeString(padChar));
01206 }
01207
01208 U_NAMESPACE_END
01209
01210 #endif // _DECIMFMT
01211