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
00183 class U_I18N_API DecimalFormat: public NumberFormat {
00184 public:
00188 enum ERoundingMode {
00189 kRoundCeiling,
00190 kRoundFloor,
00191 kRoundDown,
00192 kRoundUp,
00193 kRoundHalfEven,
00194 kRoundHalfDown,
00195 kRoundHalfUp
00196
00197 };
00198
00202 enum EPadPosition {
00203 kPadBeforePrefix,
00204 kPadAfterPrefix,
00205 kPadBeforeSuffix,
00206 kPadAfterSuffix
00207 };
00208
00222 DecimalFormat(UErrorCode& status);
00223
00238 DecimalFormat(const UnicodeString& pattern,
00239 UErrorCode& status);
00240
00259 DecimalFormat( const UnicodeString& pattern,
00260 DecimalFormatSymbols* symbolsToAdopt,
00261 UErrorCode& status);
00262
00282 DecimalFormat( const UnicodeString& pattern,
00283 DecimalFormatSymbols* symbolsToAdopt,
00284 UParseError& parseError,
00285 UErrorCode& status);
00303 DecimalFormat( const UnicodeString& pattern,
00304 const DecimalFormatSymbols& symbols,
00305 UErrorCode& status);
00306
00313 DecimalFormat(const DecimalFormat& source);
00314
00321 DecimalFormat& operator=(const DecimalFormat& rhs);
00322
00327 virtual ~DecimalFormat();
00328
00336 virtual Format* clone(void) const;
00337
00346 virtual UBool operator==(const Format& other) const;
00347
00359 virtual UnicodeString& format(double number,
00360 UnicodeString& appendTo,
00361 FieldPosition& pos) const;
00373 virtual UnicodeString& format(int32_t number,
00374 UnicodeString& appendTo,
00375 FieldPosition& pos) const;
00388 virtual UnicodeString& format(const Formattable& obj,
00389 UnicodeString& appendTo,
00390 FieldPosition& pos,
00391 UErrorCode& status) const;
00392
00404 UnicodeString& format(const Formattable& obj,
00405 UnicodeString& appendTo,
00406 UErrorCode& status) const;
00407
00418 UnicodeString& format(double number,
00419 UnicodeString& appendTo) const;
00420
00432 UnicodeString& format(int32_t number,
00433 UnicodeString& appendTo) const;
00434
00454 virtual void parse(const UnicodeString& text,
00455 Formattable& result,
00456 ParsePosition& parsePosition) const;
00457
00458
00467 virtual void parse(const UnicodeString& text,
00468 Formattable& result,
00469 UErrorCode& error) const;
00470
00478 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00479
00486 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00487
00494 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00495
00496
00505 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00506
00514 virtual void setPositivePrefix(const UnicodeString& newValue);
00515
00524 UnicodeString& getNegativePrefix(UnicodeString& result) const;
00525
00533 virtual void setNegativePrefix(const UnicodeString& newValue);
00534
00543 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00544
00552 virtual void setPositiveSuffix(const UnicodeString& newValue);
00553
00562 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00563
00571 virtual void setNegativeSuffix(const UnicodeString& newValue);
00572
00583 int32_t getMultiplier(void) const;
00584
00595 virtual void setMultiplier(int32_t newValue);
00596
00606 virtual double getRoundingIncrement(void);
00607
00618 virtual void setRoundingIncrement(double newValue);
00619
00628 virtual ERoundingMode getRoundingMode(void);
00629
00639 virtual void setRoundingMode(ERoundingMode roundingMode);
00640
00651 virtual int32_t getFormatWidth(void);
00652
00666 virtual void setFormatWidth(int32_t width);
00667
00681 virtual UnicodeString getPadCharacterString();
00682
00697 virtual void setPadCharacter(UnicodeString padChar);
00698
00717 virtual EPadPosition getPadPosition(void);
00718
00739 virtual void setPadPosition(EPadPosition padPos);
00740
00751 virtual UBool isScientificNotation(void);
00752
00764 virtual void setScientificNotation(UBool useScientific);
00765
00776 virtual int8_t getMinimumExponentDigits(void);
00777
00790 virtual void setMinimumExponentDigits(int8_t minExpDig);
00791
00804 virtual UBool isExponentSignAlwaysShown(void);
00805
00819 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00820
00832 int32_t getGroupingSize(void) const;
00833
00845 virtual void setGroupingSize(int32_t newValue);
00846
00865 int32_t getSecondaryGroupingSize(void) const;
00866
00878 virtual void setSecondaryGroupingSize(int32_t newValue);
00879
00888 UBool isDecimalSeparatorAlwaysShown(void) const;
00889
00898 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00899
00910 virtual UnicodeString& toPattern(UnicodeString& result) const;
00911
00922 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00923
00953 virtual void applyPattern(const UnicodeString& pattern,
00954 UParseError& parseError,
00955 UErrorCode& status);
00964 virtual void applyPattern(const UnicodeString& pattern,
00965 UErrorCode& status);
00966
00997 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00998 UParseError& parseError,
00999 UErrorCode& status);
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01011 UErrorCode& status);
01012
01013
01023 virtual void setMaximumIntegerDigits(int32_t newValue);
01024
01034 virtual void setMinimumIntegerDigits(int32_t newValue);
01035
01045 virtual void setMaximumFractionDigits(int32_t newValue);
01046
01056 virtual void setMinimumFractionDigits(int32_t newValue);
01057
01068 void setCurrency(const UChar* theCurrency);
01069
01082 const UChar* getCurrency() const;
01083
01089 static const char fgNumberPatterns[];
01090
01091 public:
01092
01104 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01105
01117 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
01118
01119 private:
01120 static const char fgClassID;
01124 void construct(UErrorCode& status,
01125 UParseError& parseErr,
01126 const UnicodeString* pattern = 0,
01127 DecimalFormatSymbols* symbolsToAdopt = 0
01128 );
01129
01138 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01139
01150 void applyPattern(const UnicodeString& pattern,
01151 UBool localized,
01152 UParseError& parseError,
01153 UErrorCode& status);
01165 UnicodeString& subformat(UnicodeString& appendTo,
01166 FieldPosition& fieldPosition,
01167 DigitList& digits,
01168 UBool isInteger) const;
01169
01170 enum {
01171 fgStatusInfinite,
01172 fgStatusLength
01173 } StatusFlags;
01174
01187 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01188 DigitList& digits, UBool* status) const;
01189
01195 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01196
01202 void appendAffix(UnicodeString& appendTo, const UnicodeString& affix,
01203 UBool localized) const;
01204
01205 void appendAffix(UnicodeString& appendTo,
01206 const UnicodeString* affixPattern,
01207 const UnicodeString& expAffix, UBool localized) const;
01208
01209 void expandAffix(const UnicodeString& pattern,
01210 UnicodeString& affix) const;
01211
01212 void expandAffixes(void);
01213
01214 static double round(double a, ERoundingMode mode, UBool isNegative);
01215
01216 void addPadding(UnicodeString& appendTo,
01217 FieldPosition& fieldPosition,
01218 UBool hasAffixes,
01219 UBool isNegative) const;
01220
01221 UBool isGroupingPosition(int32_t pos) const;
01222
01223 void setCurrencyForSymbols();
01224
01225 void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01226
01230
01231
01232
01233
01234 UnicodeString fPositivePrefix;
01235 UnicodeString fPositiveSuffix;
01236 UnicodeString fNegativePrefix;
01237 UnicodeString fNegativeSuffix;
01238 UnicodeString* fPosPrefixPattern;
01239 UnicodeString* fPosSuffixPattern;
01240 UnicodeString* fNegPrefixPattern;
01241 UnicodeString* fNegSuffixPattern;
01242 int32_t fMultiplier;
01243 int32_t fGroupingSize;
01244 int32_t fGroupingSize2;
01245 UBool fDecimalSeparatorAlwaysShown;
01246 UBool fIsCurrencyFormat;
01247 DecimalFormatSymbols* fSymbols;
01248
01249 UBool fUseExponentialNotation;
01250 int8_t fMinExponentDigits;
01251 UBool fExponentSignAlwaysShown;
01252
01253
01254
01255
01256
01257 DigitList* fRoundingIncrement;
01258 double fRoundingDouble;
01259 ERoundingMode fRoundingMode;
01260
01261 UnicodeString fPad;
01262 int32_t fFormatWidth;
01263 EPadPosition fPadPosition;
01264
01265
01266 UChar currency[4];
01267
01268
01269 static const UChar kPatternZeroDigit;
01270 static const UChar kPatternGroupingSeparator;
01271 static const UChar kPatternDecimalSeparator;
01272 static const UChar kPatternPerMill;
01273 static const UChar kPatternPercent;
01274 static const UChar kPatternDigit;
01275 static const UChar kPatternSeparator;
01276 static const UChar kPatternExponent;
01277 static const UChar kPatternPlus;
01278 static const UChar kPatternMinus;
01279 static const UChar kPatternPadEscape;
01280
01288 static const UChar kCurrencySign;
01289 static const UChar kQuote;
01290
01291 protected:
01295 static const int32_t kDoubleIntegerDigits;
01299 static const int32_t kDoubleFractionDigits;
01300 };
01301
01302 inline UnicodeString&
01303 DecimalFormat::format(const Formattable& obj,
01304 UnicodeString& appendTo,
01305 UErrorCode& status) const {
01306
01307
01308 return NumberFormat::format(obj, appendTo, status);
01309 }
01310
01311 inline UnicodeString&
01312 DecimalFormat::format(double number,
01313 UnicodeString& appendTo) const {
01314 FieldPosition pos(0);
01315 return format(number, appendTo, pos);
01316 }
01317
01318 inline UnicodeString&
01319 DecimalFormat::format(int32_t number,
01320 UnicodeString& appendTo) const {
01321 FieldPosition pos(0);
01322 return format(number, appendTo, pos);
01323 }
01324
01325 inline const UnicodeString &
01326 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01327 return fSymbols->getConstSymbol(symbol);
01328 }
01329
01330 U_NAMESPACE_END
01331
01332 #endif
01333
01334 #endif // _DECIMFMT
01335