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
00029 #if !UCONFIG_NO_FORMATTING
00030
00031 #include "unicode/dcfmtsym.h"
00032 #include "unicode/numfmt.h"
00033 #include "unicode/locid.h"
00034
00035 U_NAMESPACE_BEGIN
00036
00037 class DigitList;
00038 class ChoiceFormat;
00039
00184 class U_I18N_API DecimalFormat: public NumberFormat {
00185 public:
00189 enum ERoundingMode {
00190 kRoundCeiling,
00191 kRoundFloor,
00192 kRoundDown,
00193 kRoundUp,
00194 kRoundHalfEven,
00195 kRoundHalfDown,
00196 kRoundHalfUp
00197
00198 };
00199
00203 enum EPadPosition {
00204 kPadBeforePrefix,
00205 kPadAfterPrefix,
00206 kPadBeforeSuffix,
00207 kPadAfterSuffix
00208 };
00209
00223 DecimalFormat(UErrorCode& status);
00224
00239 DecimalFormat(const UnicodeString& pattern,
00240 UErrorCode& status);
00241
00260 DecimalFormat( const UnicodeString& pattern,
00261 DecimalFormatSymbols* symbolsToAdopt,
00262 UErrorCode& status);
00263
00283 DecimalFormat( const UnicodeString& pattern,
00284 DecimalFormatSymbols* symbolsToAdopt,
00285 UParseError& parseError,
00286 UErrorCode& status);
00304 DecimalFormat( const UnicodeString& pattern,
00305 const DecimalFormatSymbols& symbols,
00306 UErrorCode& status);
00307
00314 DecimalFormat(const DecimalFormat& source);
00315
00322 DecimalFormat& operator=(const DecimalFormat& rhs);
00323
00328 virtual ~DecimalFormat();
00329
00337 virtual Format* clone(void) const;
00338
00347 virtual UBool operator==(const Format& other) const;
00348
00360 virtual UnicodeString& format(double number,
00361 UnicodeString& appendTo,
00362 FieldPosition& pos) const;
00374 virtual UnicodeString& format(int32_t number,
00375 UnicodeString& appendTo,
00376 FieldPosition& pos) const;
00389 virtual UnicodeString& format(const Formattable& obj,
00390 UnicodeString& appendTo,
00391 FieldPosition& pos,
00392 UErrorCode& status) const;
00393
00405 UnicodeString& format(const Formattable& obj,
00406 UnicodeString& appendTo,
00407 UErrorCode& status) const;
00408
00419 UnicodeString& format(double number,
00420 UnicodeString& appendTo) const;
00421
00433 UnicodeString& format(int32_t number,
00434 UnicodeString& appendTo) const;
00435
00455 virtual void parse(const UnicodeString& text,
00456 Formattable& result,
00457 ParsePosition& parsePosition) const;
00458
00459
00468 virtual void parse(const UnicodeString& text,
00469 Formattable& result,
00470 UErrorCode& status) const;
00471
00479 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00480
00487 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00488
00495 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00496
00497
00506 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00507
00515 virtual void setPositivePrefix(const UnicodeString& newValue);
00516
00525 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00526
00534 virtual void setNegativePrefix(const UnicodeString& newValue);
00535
00544 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00545
00553 virtual void setPositiveSuffix(const UnicodeString& newValue);
00554
00563 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00564
00572 virtual void setNegativeSuffix(const UnicodeString& newValue);
00573
00584 int32_t getMultiplier(void) const;
00585
00596 virtual void setMultiplier(int32_t newValue);
00597
00607 virtual double getRoundingIncrement(void);
00608
00619 virtual void setRoundingIncrement(double newValue);
00620
00629 virtual ERoundingMode getRoundingMode(void);
00630
00640 virtual void setRoundingMode(ERoundingMode roundingMode);
00641
00652 virtual int32_t getFormatWidth(void);
00653
00667 virtual void setFormatWidth(int32_t width);
00668
00682 virtual UnicodeString getPadCharacterString();
00683
00698 virtual void setPadCharacter(const UnicodeString &padChar);
00699
00718 virtual EPadPosition getPadPosition(void);
00719
00740 virtual void setPadPosition(EPadPosition padPos);
00741
00752 virtual UBool isScientificNotation(void);
00753
00765 virtual void setScientificNotation(UBool useScientific);
00766
00777 virtual int8_t getMinimumExponentDigits(void);
00778
00791 virtual void setMinimumExponentDigits(int8_t minExpDig);
00792
00805 virtual UBool isExponentSignAlwaysShown(void);
00806
00820 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00821
00833 int32_t getGroupingSize(void) const;
00834
00846 virtual void setGroupingSize(int32_t newValue);
00847
00866 int32_t getSecondaryGroupingSize(void) const;
00867
00879 virtual void setSecondaryGroupingSize(int32_t newValue);
00880
00889 UBool isDecimalSeparatorAlwaysShown(void) const;
00890
00899 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00900
00911 virtual UnicodeString& toPattern(UnicodeString& result) const;
00912
00923 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00924
00954 virtual void applyPattern(const UnicodeString& pattern,
00955 UParseError& parseError,
00956 UErrorCode& status);
00965 virtual void applyPattern(const UnicodeString& pattern,
00966 UErrorCode& status);
00967
00998 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00999 UParseError& parseError,
01000 UErrorCode& status);
01001
01011 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01012 UErrorCode& status);
01013
01014
01024 virtual void setMaximumIntegerDigits(int32_t newValue);
01025
01035 virtual void setMinimumIntegerDigits(int32_t newValue);
01036
01046 virtual void setMaximumFractionDigits(int32_t newValue);
01047
01057 virtual void setMinimumFractionDigits(int32_t newValue);
01058
01069 virtual void setCurrency(const UChar* theCurrency);
01070
01076 static const char fgNumberPatterns[];
01077
01078 public:
01079
01091 static inline UClassID getStaticClassID(void);
01092
01104 virtual UClassID getDynamicClassID(void) const;
01105
01106 private:
01107 static const char fgClassID;
01108
01109 DecimalFormat();
01110
01114 void construct(UErrorCode& status,
01115 UParseError& parseErr,
01116 const UnicodeString* pattern = 0,
01117 DecimalFormatSymbols* symbolsToAdopt = 0
01118 );
01119
01128 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01129
01140 void applyPattern(const UnicodeString& pattern,
01141 UBool localized,
01142 UParseError& parseError,
01143 UErrorCode& status);
01155 UnicodeString& subformat(UnicodeString& appendTo,
01156 FieldPosition& fieldPosition,
01157 DigitList& digits,
01158 UBool isInteger) const;
01159
01160 enum {
01161 fgStatusInfinite,
01162 fgStatusLength
01163 } StatusFlags;
01164
01177 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01178 DigitList& digits, UBool* status) const;
01179
01180 int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01181
01182 int32_t compareAffix(const UnicodeString& input,
01183 int32_t pos,
01184 UBool isNegative,
01185 UBool isPrefix) const;
01186
01187 static int32_t compareSimpleAffix(const UnicodeString& affix,
01188 const UnicodeString& input,
01189 int32_t pos);
01190
01191 static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01192
01193 static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01194
01195 int32_t compareComplexAffix(const UnicodeString& affixPat,
01196 const UnicodeString& input,
01197 int32_t pos) const;
01198
01199 static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01200
01201 static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01202
01208 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01209
01210 int32_t appendAffix(UnicodeString& buf, double number,
01211 UBool isNegative, UBool isPrefix) const;
01212
01218 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
01219 UBool localized) const;
01220
01221 void appendAffixPattern(UnicodeString& appendTo,
01222 const UnicodeString* affixPattern,
01223 const UnicodeString& expAffix, UBool localized) const;
01224
01225 void expandAffix(const UnicodeString& pattern,
01226 UnicodeString& affix,
01227 double number,
01228 UBool doFormat) const;
01229
01230 void expandAffixes();
01231
01232 static double round(double a, ERoundingMode mode, UBool isNegative);
01233
01234 void addPadding(UnicodeString& appendTo,
01235 FieldPosition& fieldPosition,
01236 int32_t prefixLen, int32_t suffixLen) const;
01237
01238 UBool isGroupingPosition(int32_t pos) const;
01239
01240 void setCurrencyForSymbols();
01241
01242 void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01243
01247
01248
01249
01250
01251 UnicodeString fPositivePrefix;
01252 UnicodeString fPositiveSuffix;
01253 UnicodeString fNegativePrefix;
01254 UnicodeString fNegativeSuffix;
01255 UnicodeString* fPosPrefixPattern;
01256 UnicodeString* fPosSuffixPattern;
01257 UnicodeString* fNegPrefixPattern;
01258 UnicodeString* fNegSuffixPattern;
01259
01265 ChoiceFormat* fCurrencyChoice;
01266
01267 int32_t fMultiplier;
01268 int32_t fGroupingSize;
01269 int32_t fGroupingSize2;
01270 UBool fDecimalSeparatorAlwaysShown;
01271 UBool fIsCurrencyFormat;
01272 DecimalFormatSymbols* fSymbols;
01273
01274 UBool fUseExponentialNotation;
01275 int8_t fMinExponentDigits;
01276 UBool fExponentSignAlwaysShown;
01277
01278
01279
01280
01281
01282 DigitList* fRoundingIncrement;
01283 double fRoundingDouble;
01284 ERoundingMode fRoundingMode;
01285
01286 UChar32 fPad;
01287 int32_t fFormatWidth;
01288 EPadPosition fPadPosition;
01289
01290
01291 static const UChar kPatternZeroDigit;
01292 static const UChar kPatternGroupingSeparator;
01293 static const UChar kPatternDecimalSeparator;
01294 static const UChar kPatternPerMill;
01295 static const UChar kPatternPercent;
01296 static const UChar kPatternDigit;
01297 static const UChar kPatternSeparator;
01298 static const UChar kPatternExponent;
01299 static const UChar kPatternPlus;
01300 static const UChar kPatternMinus;
01301 static const UChar kPatternPadEscape;
01302
01310 static const UChar kCurrencySign;
01311 static const UChar kQuote;
01312
01313 protected:
01317 static const int32_t kDoubleIntegerDigits;
01321 static const int32_t kDoubleFractionDigits;
01322 };
01323
01324 inline UClassID
01325 DecimalFormat::getStaticClassID(void)
01326 { return (UClassID)&fgClassID; }
01327
01328 inline UClassID
01329 DecimalFormat::getDynamicClassID(void) const
01330 { return DecimalFormat::getStaticClassID(); }
01331
01332 inline UnicodeString&
01333 DecimalFormat::format(const Formattable& obj,
01334 UnicodeString& appendTo,
01335 UErrorCode& status) const {
01336
01337
01338 return NumberFormat::format(obj, appendTo, status);
01339 }
01340
01341 inline UnicodeString&
01342 DecimalFormat::format(double number,
01343 UnicodeString& appendTo) const {
01344 FieldPosition pos(0);
01345 return format(number, appendTo, pos);
01346 }
01347
01348 inline UnicodeString&
01349 DecimalFormat::format(int32_t number,
01350 UnicodeString& appendTo) const {
01351 FieldPosition pos(0);
01352 return format(number, appendTo, pos);
01353 }
01354
01355 inline const UnicodeString &
01356 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01357 return fSymbols->getConstSymbol(symbol);
01358 }
01359
01360 U_NAMESPACE_END
01361
01362 #endif
01363
01364 #endif // _DECIMFMT
01365