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
00304 DecimalFormat(const DecimalFormat& source);
00305
00312 DecimalFormat& operator=(const DecimalFormat& rhs);
00313
00318 virtual ~DecimalFormat();
00319
00327 virtual Format* clone(void) const;
00328
00337 virtual UBool operator==(const Format& other) const;
00338
00350 virtual UnicodeString& format(double number,
00351 UnicodeString& toAppendTo,
00352 FieldPosition& pos) const;
00364 virtual UnicodeString& format(int32_t number,
00365 UnicodeString& toAppendTo,
00366 FieldPosition& pos) const;
00379 virtual UnicodeString& format(const Formattable& obj,
00380 UnicodeString& toAppendTo,
00381 FieldPosition& pos,
00382 UErrorCode& status) const;
00383
00395 UnicodeString& format(const Formattable& obj,
00396 UnicodeString& result,
00397 UErrorCode& status) const;
00398
00408 UnicodeString& format(double number,
00409 UnicodeString& output) const;
00410
00421 UnicodeString& format(int32_t number,
00422 UnicodeString& output) const;
00423
00443 virtual void parse(const UnicodeString& text,
00444 Formattable& result,
00445 ParsePosition& parsePosition) const;
00446
00447
00456 virtual void parse(const UnicodeString& text,
00457 Formattable& result,
00458 UErrorCode& error) const;
00459
00467 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00468
00475 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00476
00483 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00484
00485
00494 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00495
00503 virtual void setPositivePrefix(const UnicodeString& newValue);
00504
00513 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00514
00522 virtual void setNegativePrefix(const UnicodeString& newValue);
00523
00532 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00533
00541 virtual void setPositiveSuffix(const UnicodeString& newValue);
00542
00551 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00552
00560 virtual void setNegativeSuffix(const UnicodeString& newValue);
00561
00572 int32_t getMultiplier(void) const;
00573
00584 virtual void setMultiplier(int32_t newValue);
00585
00595 virtual double getRoundingIncrement(void);
00596
00607 virtual void setRoundingIncrement(double newValue);
00608
00617 virtual ERoundingMode getRoundingMode(void);
00618
00628 virtual void setRoundingMode(ERoundingMode roundingMode);
00629
00640 virtual int32_t getFormatWidth(void);
00641
00655 virtual void setFormatWidth(int32_t width);
00656
00670 virtual UnicodeString getPadCharacterString();
00671
00686 virtual void setPadCharacter(UnicodeString padChar);
00687
00706 virtual EPadPosition getPadPosition(void);
00707
00728 virtual void setPadPosition(EPadPosition padPos);
00729
00740 virtual UBool isScientificNotation(void);
00741
00753 virtual void setScientificNotation(UBool useScientific);
00754
00765 virtual int8_t getMinimumExponentDigits(void);
00766
00779 virtual void setMinimumExponentDigits(int8_t minExpDig);
00780
00793 virtual UBool isExponentSignAlwaysShown(void);
00794
00808 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00809
00821 int32_t getGroupingSize(void) const;
00822
00834 virtual void setGroupingSize(int32_t newValue);
00835
00853 int32_t getSecondaryGroupingSize(void) const;
00854
00865 virtual void setSecondaryGroupingSize(int32_t newValue);
00866
00875 UBool isDecimalSeparatorAlwaysShown(void) const;
00876
00885 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00886
00896 virtual UnicodeString& toPattern(UnicodeString& result) const;
00897
00907 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00908
00938 virtual void applyPattern(const UnicodeString& pattern,
00939 UParseError& parseError,
00940 UErrorCode& status);
00949 virtual void applyPattern(const UnicodeString& pattern,
00950 UErrorCode& status);
00951
00982 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00983 UParseError& parseError,
00984 UErrorCode& status);
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00996 UErrorCode& status);
00997
00998
01008 virtual void setMaximumIntegerDigits(int32_t newValue);
01009
01019 virtual void setMinimumIntegerDigits(int32_t newValue);
01020
01030 virtual void setMaximumFractionDigits(int32_t newValue);
01031
01041 virtual void setMinimumFractionDigits(int32_t newValue);
01042
01053 void setCurrency(const UChar* theCurrency);
01054
01067 const UChar* getCurrency() const;
01068
01074 static const char fgNumberPatterns[];
01075
01076 public:
01077
01089 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01090
01102 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
01103
01104 private:
01105 static const char fgClassID;
01109 void construct(UErrorCode& status,
01110 UParseError& parseErr,
01111 const UnicodeString* pattern = 0,
01112 DecimalFormatSymbols* symbolsToAdopt = 0
01113 );
01114
01122 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01123
01134 void applyPattern(const UnicodeString& pattern,
01135 UBool localized,
01136 UParseError& parseError,
01137 UErrorCode& status);
01148 UnicodeString& subformat(UnicodeString& result,
01149 FieldPosition& fieldPosition,
01150 DigitList& digits,
01151 UBool isInteger) const;
01152
01153 enum {
01154 fgStatusInfinite,
01155 fgStatusLength
01156 } StatusFlags;
01157
01170 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01171 DigitList& digits, UBool* status) const;
01172
01178 void appendAffix(UnicodeString& buffer, const UnicodeString& affix,
01179 UBool localized) const;
01180
01181 void appendAffix(UnicodeString& buffer,
01182 const UnicodeString* affixPattern,
01183 const UnicodeString& expAffix, UBool localized) const;
01184
01185 void expandAffix(const UnicodeString& pattern,
01186 UnicodeString& affix) const;
01187
01188 void expandAffixes(void);
01189
01190 static double round(double a, ERoundingMode mode, UBool isNegative);
01191
01192 void addPadding(UnicodeString& result,
01193 FieldPosition& fieldPosition,
01194 UBool hasAffixes,
01195 UBool isNegative) const;
01196
01197 UBool isGroupingPosition(int32_t pos) const;
01198
01199 void setCurrencyForSymbols();
01200
01201 void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01202
01206
01207
01208
01209
01210 UnicodeString fPositivePrefix;
01211 UnicodeString fPositiveSuffix;
01212 UnicodeString fNegativePrefix;
01213 UnicodeString fNegativeSuffix;
01214 UnicodeString* fPosPrefixPattern;
01215 UnicodeString* fPosSuffixPattern;
01216 UnicodeString* fNegPrefixPattern;
01217 UnicodeString* fNegSuffixPattern;
01218 int32_t fMultiplier;
01219 int32_t fGroupingSize;
01220 int32_t fGroupingSize2;
01221 UBool fDecimalSeparatorAlwaysShown;
01222 UBool fIsCurrencyFormat;
01223 DecimalFormatSymbols* fSymbols;
01224
01225 UBool fUseExponentialNotation;
01226 int8_t fMinExponentDigits;
01227 UBool fExponentSignAlwaysShown;
01228
01229
01230
01231
01232
01233 DigitList* fRoundingIncrement;
01234 double fRoundingDouble;
01235 ERoundingMode fRoundingMode;
01236
01237 UnicodeString fPad;
01238 int32_t fFormatWidth;
01239 EPadPosition fPadPosition;
01240
01241
01242 UChar currency[4];
01243
01244
01245 static const UChar kPatternZeroDigit;
01246 static const UChar kPatternGroupingSeparator;
01247 static const UChar kPatternDecimalSeparator;
01248 static const UChar kPatternPerMill;
01249 static const UChar kPatternPercent;
01250 static const UChar kPatternDigit;
01251 static const UChar kPatternSeparator;
01252 static const UChar kPatternExponent;
01253 static const UChar kPatternPlus;
01254 static const UChar kPatternMinus;
01255 static const UChar kPatternPadEscape;
01256
01264 static const UChar kCurrencySign;
01265 static const UChar kQuote;
01266
01267 protected:
01268 static const int32_t kDoubleIntegerDigits;
01269 static const int32_t kDoubleFractionDigits;
01270 };
01271
01272 inline UnicodeString&
01273 DecimalFormat::format(const Formattable& obj,
01274 UnicodeString& result,
01275 UErrorCode& status) const {
01276
01277
01278 return NumberFormat::format(obj, result, status);
01279 }
01280
01281 inline UnicodeString&
01282 DecimalFormat::format(double number,
01283 UnicodeString& output) const {
01284 FieldPosition pos(0);
01285 return format(number, output, pos);
01286 }
01287
01288 inline UnicodeString&
01289 DecimalFormat::format(int32_t number,
01290 UnicodeString& output) const {
01291 FieldPosition pos(0);
01292 return format(number, output, pos);
01293 }
01294
01295
01296 U_NAMESPACE_END
01297
01298 #endif // _DECIMFMT
01299