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 class DecimalFormatSymbols;
00032 class DigitList;
00033
00178 class U_I18N_API DecimalFormat: public NumberFormat {
00179 public:
00180 enum ERoundingMode {
00181 kRoundCeiling,
00182 kRoundFloor,
00183 kRoundDown,
00184 kRoundUp,
00185 kRoundHalfEven,
00186 kRoundHalfDown,
00187 kRoundHalfUp
00188
00189 };
00190
00191 enum EPadPosition {
00192 kPadBeforePrefix,
00193 kPadAfterPrefix,
00194 kPadBeforeSuffix,
00195 kPadAfterSuffix
00196 };
00197
00211 DecimalFormat(UErrorCode& status);
00212
00227 DecimalFormat(const UnicodeString& pattern,
00228 UErrorCode& status);
00229
00248 DecimalFormat( const UnicodeString& pattern,
00249 DecimalFormatSymbols* symbolsToAdopt,
00250 UErrorCode& status);
00251
00269 DecimalFormat( const UnicodeString& pattern,
00270 const DecimalFormatSymbols& symbols,
00271 UErrorCode& status);
00272
00277 DecimalFormat(const DecimalFormat& source);
00278
00283 DecimalFormat& operator=(const DecimalFormat& rhs);
00284
00289 virtual ~DecimalFormat();
00290
00296 virtual Format* clone(void) const;
00297
00303 virtual UBool operator==(const Format& other) const;
00304
00316 virtual UnicodeString& format(double number,
00317 UnicodeString& toAppendTo,
00318 FieldPosition& pos) const;
00319 virtual UnicodeString& format(int32_t number,
00320 UnicodeString& toAppendTo,
00321 FieldPosition& pos) const;
00322 virtual UnicodeString& format(const Formattable& obj,
00323 UnicodeString& toAppendTo,
00324 FieldPosition& pos,
00325 UErrorCode& status) const;
00326
00331 UnicodeString& format(const Formattable& obj,
00332 UnicodeString& result,
00333 UErrorCode& status) const;
00334
00339 UnicodeString& format(double number,
00340 UnicodeString& output) const;
00341
00346 UnicodeString& format(int32_t number,
00347 UnicodeString& output) const;
00348
00368 virtual void parse(const UnicodeString& text,
00369 Formattable& result,
00370 ParsePosition& parsePosition) const;
00371
00372
00373 virtual void parse(const UnicodeString& text,
00374 Formattable& result,
00375 UErrorCode& error) const;
00376
00384 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00385
00392 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00393
00400 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00401
00402
00409 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00410
00417 virtual void setPositivePrefix(const UnicodeString& newValue);
00418
00425 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00426
00433 virtual void setNegativePrefix(const UnicodeString& newValue);
00434
00441 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00442
00449 virtual void setPositiveSuffix(const UnicodeString& newValue);
00450
00457 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00458
00465 virtual void setNegativeSuffix(const UnicodeString& newValue);
00466
00476 int32_t getMultiplier(void) const;
00477
00486 virtual void setMultiplier(int32_t newValue);
00487
00497 virtual double getRoundingIncrement(void);
00498
00509 virtual void setRoundingIncrement(double newValue);
00510
00519 virtual ERoundingMode getRoundingMode(void);
00520
00530 virtual void setRoundingMode(ERoundingMode roundingMode);
00531
00542 virtual int32_t getFormatWidth(void);
00543
00557 virtual void setFormatWidth(int32_t width);
00558
00569 inline UChar getPadCharacter(void);
00570
00584 virtual UnicodeString getPadCharacterString();
00585
00597 inline void setPadCharacter(UChar padChar);
00598
00613 virtual void setPadCharacter(UnicodeString padChar);
00614
00633 virtual EPadPosition getPadPosition(void);
00634
00655 virtual void setPadPosition(EPadPosition padPos);
00656
00667 virtual UBool isScientificNotation(void);
00668
00680 virtual void setScientificNotation(UBool useScientific);
00681
00692 virtual int8_t getMinimumExponentDigits(void);
00693
00706 virtual void setMinimumExponentDigits(int8_t minExpDig);
00707
00720 virtual UBool isExponentSignAlwaysShown(void);
00721
00735 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00736
00746 int32_t getGroupingSize(void) const;
00747
00757 virtual void setGroupingSize(int32_t newValue);
00758
00776 int32_t getSecondaryGroupingSize(void) const;
00777
00786 virtual void setSecondaryGroupingSize(int32_t newValue);
00787
00795 UBool isDecimalSeparatorAlwaysShown(void) const;
00796
00804 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00805
00812 virtual UnicodeString& toPattern(UnicodeString& result) const;
00813
00821 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00822
00850 virtual void applyPattern(const UnicodeString& pattern,
00851 UErrorCode& status);
00852
00881 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00882 UErrorCode& status);
00883
00890 virtual void setMaximumIntegerDigits(int32_t newValue);
00891
00898 virtual void setMinimumIntegerDigits(int32_t newValue);
00899
00906 virtual void setMaximumFractionDigits(int32_t newValue);
00907
00914 virtual void setMinimumFractionDigits(int32_t newValue);
00915
00921 static const char *fgNumberPatterns;
00922
00923 public:
00924
00936 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00937
00949 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00950
00951 private:
00952 static char fgClassID;
00953
00957 void construct(UErrorCode& status,
00958 const UnicodeString* pattern = 0,
00959 DecimalFormatSymbols* symbolsToAdopt = 0,
00960 const Locale& locale = Locale::getDefault());
00961
00965 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
00966
00975 void applyPattern(const UnicodeString& pattern,
00976 UBool localized,
00977 UErrorCode& status);
00978
00982 UnicodeString& subformat(UnicodeString& result,
00983 FieldPosition& fieldPosition,
00984 DigitList& digits,
00985 UBool isInteger) const;
00986
00987 enum {
00988 fgStatusInfinite,
00989 fgStatusLength
00990 } StatusFlags;
00991
01004 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01005 DigitList& digits, UBool* status) const;
01006
01012 void appendAffix(UnicodeString& buffer, const UnicodeString& affix,
01013 UBool localized) const;
01014
01015 void appendAffix(UnicodeString& buffer,
01016 const UnicodeString* affixPattern,
01017 const UnicodeString& expAffix, UBool localized) const;
01018
01019 void expandAffix(const UnicodeString& pattern,
01020 UnicodeString& affix) const;
01021
01022 void expandAffixes(void);
01023
01024 static double round(double a, ERoundingMode mode, UBool isNegative);
01025
01026 void addPadding(UnicodeString& result,
01027 FieldPosition& fieldPosition,
01028 UBool hasAffixes,
01029 UBool isNegative) const;
01030
01031 UBool isGroupingPosition(int32_t pos) const;
01032
01036
01037
01038
01039
01040 UnicodeString fPositivePrefix;
01041 UnicodeString fPositiveSuffix;
01042 UnicodeString fNegativePrefix;
01043 UnicodeString fNegativeSuffix;
01044 UnicodeString* fPosPrefixPattern;
01045 UnicodeString* fPosSuffixPattern;
01046 UnicodeString* fNegPrefixPattern;
01047 UnicodeString* fNegSuffixPattern;
01048 int32_t fMultiplier;
01049 int32_t fGroupingSize;
01050 int32_t fGroupingSize2;
01051 UBool fDecimalSeparatorAlwaysShown;
01052 UBool fIsCurrencyFormat;
01053 DecimalFormatSymbols* fSymbols;
01054
01055 UBool fUseExponentialNotation;
01056 int8_t fMinExponentDigits;
01057 UBool fExponentSignAlwaysShown;
01058
01059
01060
01061
01062
01063 DigitList* fRoundingIncrement;
01064 double fRoundingDouble;
01065 ERoundingMode fRoundingMode;
01066
01067 UChar fPad;
01068 int32_t fFormatWidth;
01069 EPadPosition fPadPosition;
01070
01071
01072 static const UChar kPatternZeroDigit;
01073 static const UChar kPatternGroupingSeparator;
01074 static const UChar kPatternDecimalSeparator;
01075 static const UChar kPatternPerMill;
01076 static const UChar kPatternPercent;
01077 static const UChar kPatternDigit;
01078 static const UChar kPatternSeparator;
01079 static const UChar kPatternExponent;
01080 static const UChar kPatternPlus;
01081 static const UChar kPatternMinus;
01082 static const UChar kPatternPadEscape;
01083
01091 static const UChar kCurrencySign;
01092 static const UChar kQuote;
01093
01094 protected:
01095 static const int32_t kDoubleIntegerDigits;
01096 static const int32_t kDoubleFractionDigits;
01097 };
01098
01099 inline UnicodeString&
01100 DecimalFormat::format(const Formattable& obj,
01101 UnicodeString& result,
01102 UErrorCode& status) const {
01103
01104
01105 return NumberFormat::format(obj, result, status);
01106 }
01107
01108 inline UnicodeString&
01109 DecimalFormat::format(double number,
01110 UnicodeString& output) const {
01111 FieldPosition pos(0);
01112 return format(number, output, pos);
01113 }
01114
01115 inline UnicodeString&
01116 DecimalFormat::format(int32_t number,
01117 UnicodeString& output) const {
01118 FieldPosition pos(0);
01119 return format(number, output, pos);
01120 }
01121
01122 inline UChar
01123 DecimalFormat::getPadCharacter() {
01124 return getPadCharacterString().charAt(0);
01125 }
01126
01127 inline void
01128 DecimalFormat::setPadCharacter(UChar padChar) {
01129 setPadCharacter(UnicodeString(padChar));
01130 }
01131
01132 #endif // _DECIMFMT
01133