Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

decimfmt.h

00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-2003, International Business Machines 00004 * Corporation and others. All Rights Reserved. 00005 ******************************************************************************** 00006 * 00007 * File DECIMFMT.H 00008 * 00009 * Modification History: 00010 * 00011 * Date Name Description 00012 * 02/19/97 aliu Converted from java. 00013 * 03/20/97 clhuang Updated per C++ implementation. 00014 * 04/03/97 aliu Rewrote parsing and formatting completely, and 00015 * cleaned up and debugged. Actually works now. 00016 * 04/17/97 aliu Changed DigitCount to int per code review. 00017 * 07/10/97 helena Made ParsePosition a class and get rid of the function 00018 * hiding problems. 00019 * 09/09/97 aliu Ported over support for exponential formats. 00020 * 07/20/98 stephen Changed documentation 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 // We don't support ROUND_UNNECESSARY 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 // Declare here again to get rid of function hiding problems. 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(); // default constructor not implemented 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 // Leave last in list. 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 //static const int8_t fgMaxDigit; // The largest digit, in this case 9 01280 01281 /*transient*/ //DigitList* fDigitList; 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 /*transient*/ UBool fIsCurrencyFormat; 01304 DecimalFormatSymbols* fSymbols; 01305 01306 UBool fUseExponentialNotation; 01307 int8_t fMinExponentDigits; 01308 UBool fExponentSignAlwaysShown; 01309 01310 /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to 01311 * fRoundingIncrement.getDouble(). Since this operation may be expensive, 01312 * we cache the result in fRoundingDouble. All methods that update 01313 * fRoundingIncrement also update fRoundingDouble. */ 01314 DigitList* fRoundingIncrement; 01315 /*transient*/ 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 // Don't use Format:: - use immediate base class only, 01349 // in case immediate base modifies behavior later. 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 /* #if !UCONFIG_NO_FORMATTING */ 01375 01376 #endif // _DECIMFMT 01377 //eof

Generated on Wed Sep 15 17:18:08 2004 for ICU 2.8 by doxygen 1.3.8