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, UBool hasAffixes,
01027 UBool isNegative) const;
01028
01029 UBool isGroupingPosition(int32_t pos) const;
01030
01034
01035
01036
01037
01038 UnicodeString fPositivePrefix;
01039 UnicodeString fPositiveSuffix;
01040 UnicodeString fNegativePrefix;
01041 UnicodeString fNegativeSuffix;
01042 UnicodeString* fPosPrefixPattern;
01043 UnicodeString* fPosSuffixPattern;
01044 UnicodeString* fNegPrefixPattern;
01045 UnicodeString* fNegSuffixPattern;
01046 int32_t fMultiplier;
01047 int32_t fGroupingSize;
01048 int32_t fGroupingSize2;
01049 UBool fDecimalSeparatorAlwaysShown;
01050 UBool fIsCurrencyFormat;
01051 DecimalFormatSymbols* fSymbols;
01052
01053 UBool fUseExponentialNotation;
01054 int8_t fMinExponentDigits;
01055 UBool fExponentSignAlwaysShown;
01056
01057
01058
01059
01060
01061 DigitList* fRoundingIncrement;
01062 double fRoundingDouble;
01063 ERoundingMode fRoundingMode;
01064
01065 UChar fPad;
01066 int32_t fFormatWidth;
01067 EPadPosition fPadPosition;
01068
01069
01070 static const UChar kPatternZeroDigit;
01071 static const UChar kPatternGroupingSeparator;
01072 static const UChar kPatternDecimalSeparator;
01073 static const UChar kPatternPerMill;
01074 static const UChar kPatternPercent;
01075 static const UChar kPatternDigit;
01076 static const UChar kPatternSeparator;
01077 static const UChar kPatternExponent;
01078 static const UChar kPatternPlus;
01079 static const UChar kPatternMinus;
01080 static const UChar kPatternPadEscape;
01081
01089 static const UChar kCurrencySign;
01090 static const UChar kQuote;
01091
01092 protected:
01093 static const int32_t kDoubleIntegerDigits;
01094 static const int32_t kDoubleFractionDigits;
01095 };
01096
01097 inline UnicodeString&
01098 DecimalFormat::format(const Formattable& obj,
01099 UnicodeString& result,
01100 UErrorCode& status) const {
01101
01102
01103 return NumberFormat::format(obj, result, status);
01104 }
01105
01106 inline UnicodeString&
01107 DecimalFormat::format(double number,
01108 UnicodeString& output) const {
01109 FieldPosition pos(0);
01110 return format(number, output, pos);
01111 }
01112
01113 inline UnicodeString&
01114 DecimalFormat::format(int32_t number,
01115 UnicodeString& output) const {
01116 FieldPosition pos(0);
01117 return format(number, output, pos);
01118 }
01119
01120 inline UChar
01121 DecimalFormat::getPadCharacter() {
01122 return getPadCharacterString().charAt(0);
01123 }
01124
01125 inline void
01126 DecimalFormat::setPadCharacter(UChar padChar) {
01127 setPadCharacter(UnicodeString(padChar));
01128 }
01129
01130 #endif // _DECIMFMT
01131