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;
00388 virtual UnicodeString& format(int64_t number,
00389 UnicodeString& appendTo,
00390 FieldPosition& pos) const;
00391
00404 virtual UnicodeString& format(const Formattable& obj,
00405 UnicodeString& appendTo,
00406 FieldPosition& pos,
00407 UErrorCode& status) const;
00408
00420 UnicodeString& format(const Formattable& obj,
00421 UnicodeString& appendTo,
00422 UErrorCode& status) const;
00423
00434 UnicodeString& format(double number,
00435 UnicodeString& appendTo) const;
00436
00448 UnicodeString& format(int32_t number,
00449 UnicodeString& appendTo) const;
00450
00462 UnicodeString& format(int64_t number,
00463 UnicodeString& appendTo) const;
00483 virtual void parse(const UnicodeString& text,
00484 Formattable& result,
00485 ParsePosition& parsePosition) const;
00486
00487
00496 virtual void parse(const UnicodeString& text,
00497 Formattable& result,
00498 UErrorCode& status) const;
00499
00507 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00508
00515 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00516
00523 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00524
00525
00534 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00535
00543 virtual void setPositivePrefix(const UnicodeString& newValue);
00544
00553 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00554
00562 virtual void setNegativePrefix(const UnicodeString& newValue);
00563
00572 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00573
00581 virtual void setPositiveSuffix(const UnicodeString& newValue);
00582
00591 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00592
00600 virtual void setNegativeSuffix(const UnicodeString& newValue);
00601
00612 int32_t getMultiplier(void) const;
00613
00624 virtual void setMultiplier(int32_t newValue);
00625
00635 virtual double getRoundingIncrement(void);
00636
00647 virtual void setRoundingIncrement(double newValue);
00648
00657 virtual ERoundingMode getRoundingMode(void);
00658
00668 virtual void setRoundingMode(ERoundingMode roundingMode);
00669
00680 virtual int32_t getFormatWidth(void);
00681
00695 virtual void setFormatWidth(int32_t width);
00696
00710 virtual UnicodeString getPadCharacterString();
00711
00726 virtual void setPadCharacter(const UnicodeString &padChar);
00727
00746 virtual EPadPosition getPadPosition(void);
00747
00768 virtual void setPadPosition(EPadPosition padPos);
00769
00780 virtual UBool isScientificNotation(void);
00781
00797 virtual void setScientificNotation(UBool useScientific);
00798
00809 virtual int8_t getMinimumExponentDigits(void);
00810
00823 virtual void setMinimumExponentDigits(int8_t minExpDig);
00824
00837 virtual UBool isExponentSignAlwaysShown(void);
00838
00852 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00853
00865 int32_t getGroupingSize(void) const;
00866
00878 virtual void setGroupingSize(int32_t newValue);
00879
00898 int32_t getSecondaryGroupingSize(void) const;
00899
00911 virtual void setSecondaryGroupingSize(int32_t newValue);
00912
00921 UBool isDecimalSeparatorAlwaysShown(void) const;
00922
00931 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00932
00943 virtual UnicodeString& toPattern(UnicodeString& result) const;
00944
00955 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00956
00986 virtual void applyPattern(const UnicodeString& pattern,
00987 UParseError& parseError,
00988 UErrorCode& status);
00997 virtual void applyPattern(const UnicodeString& pattern,
00998 UErrorCode& status);
00999
01030 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01031 UParseError& parseError,
01032 UErrorCode& status);
01033
01043 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01044 UErrorCode& status);
01045
01046
01056 virtual void setMaximumIntegerDigits(int32_t newValue);
01057
01067 virtual void setMinimumIntegerDigits(int32_t newValue);
01068
01078 virtual void setMaximumFractionDigits(int32_t newValue);
01079
01089 virtual void setMinimumFractionDigits(int32_t newValue);
01090
01101 virtual void setCurrency(const UChar* theCurrency);
01102
01108 static const char fgNumberPatterns[];
01109
01110 public:
01111
01123 static UClassID getStaticClassID(void);
01124
01136 virtual UClassID getDynamicClassID(void) const;
01137
01138 private:
01139 DecimalFormat();
01140
01141 int32_t precision(UBool isIntegral) const;
01142
01146 void construct(UErrorCode& status,
01147 UParseError& parseErr,
01148 const UnicodeString* pattern = 0,
01149 DecimalFormatSymbols* symbolsToAdopt = 0
01150 );
01151
01160 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01161
01172 void applyPattern(const UnicodeString& pattern,
01173 UBool localized,
01174 UParseError& parseError,
01175 UErrorCode& status);
01187 UnicodeString& subformat(UnicodeString& appendTo,
01188 FieldPosition& fieldPosition,
01189 DigitList& digits,
01190 UBool isInteger) const;
01191
01192 enum {
01193 fgStatusInfinite,
01194 fgStatusLength
01195 } StatusFlags;
01196
01209 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01210 DigitList& digits, UBool* status) const;
01211
01212 int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01213
01214 int32_t compareAffix(const UnicodeString& input,
01215 int32_t pos,
01216 UBool isNegative,
01217 UBool isPrefix) const;
01218
01219 static int32_t compareSimpleAffix(const UnicodeString& affix,
01220 const UnicodeString& input,
01221 int32_t pos);
01222
01223 static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01224
01225 static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01226
01227 int32_t compareComplexAffix(const UnicodeString& affixPat,
01228 const UnicodeString& input,
01229 int32_t pos) const;
01230
01231 static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01232
01233 static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01234
01240 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01241
01242 int32_t appendAffix(UnicodeString& buf, double number,
01243 UBool isNegative, UBool isPrefix) const;
01244
01250 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
01251 UBool localized) const;
01252
01253 void appendAffixPattern(UnicodeString& appendTo,
01254 const UnicodeString* affixPattern,
01255 const UnicodeString& expAffix, UBool localized) const;
01256
01257 void expandAffix(const UnicodeString& pattern,
01258 UnicodeString& affix,
01259 double number,
01260 UBool doFormat) const;
01261
01262 void expandAffixes();
01263
01264 static double round(double a, ERoundingMode mode, UBool isNegative);
01265
01266 void addPadding(UnicodeString& appendTo,
01267 FieldPosition& fieldPosition,
01268 int32_t prefixLen, int32_t suffixLen) const;
01269
01270 UBool isGroupingPosition(int32_t pos) const;
01271
01272 void setCurrencyForSymbols();
01273
01274 void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01275
01279
01280
01281
01282
01283 UnicodeString fPositivePrefix;
01284 UnicodeString fPositiveSuffix;
01285 UnicodeString fNegativePrefix;
01286 UnicodeString fNegativeSuffix;
01287 UnicodeString* fPosPrefixPattern;
01288 UnicodeString* fPosSuffixPattern;
01289 UnicodeString* fNegPrefixPattern;
01290 UnicodeString* fNegSuffixPattern;
01291
01297 ChoiceFormat* fCurrencyChoice;
01298
01299 int32_t fMultiplier;
01300 int32_t fGroupingSize;
01301 int32_t fGroupingSize2;
01302 UBool fDecimalSeparatorAlwaysShown;
01303 UBool fIsCurrencyFormat;
01304 DecimalFormatSymbols* fSymbols;
01305
01306 UBool fUseExponentialNotation;
01307 int8_t fMinExponentDigits;
01308 UBool fExponentSignAlwaysShown;
01309
01310
01311
01312
01313
01314 DigitList* fRoundingIncrement;
01315 double fRoundingDouble;
01316 ERoundingMode fRoundingMode;
01317
01318 UChar32 fPad;
01319 int32_t fFormatWidth;
01320 EPadPosition fPadPosition;
01321
01322 protected:
01326 static const int32_t kDoubleIntegerDigits;
01330 static const int32_t kDoubleFractionDigits;
01331
01341 static const int32_t kMaxScientificIntegerDigits;
01342 };
01343
01344 inline UnicodeString&
01345 DecimalFormat::format(const Formattable& obj,
01346 UnicodeString& appendTo,
01347 UErrorCode& status) const {
01348
01349
01350 return NumberFormat::format(obj, appendTo, status);
01351 }
01352
01353 inline UnicodeString&
01354 DecimalFormat::format(double number,
01355 UnicodeString& appendTo) const {
01356 FieldPosition pos(0);
01357 return format(number, appendTo, pos);
01358 }
01359
01360 inline UnicodeString&
01361 DecimalFormat::format(int32_t number,
01362 UnicodeString& appendTo) const {
01363 FieldPosition pos(0);
01364 return format((int64_t)number, appendTo, pos);
01365 }
01366
01367 inline const UnicodeString &
01368 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01369 return fSymbols->getConstSymbol(symbol);
01370 }
01371
01372 U_NAMESPACE_END
01373
01374 #endif
01375
01376 #endif // _DECIMFMT
01377