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
00599 class U_I18N_API DecimalFormat:
public NumberFormat {
00600
public:
00605
enum ERoundingMode {
00606 kRoundCeiling,
00607 kRoundFloor,
00608 kRoundDown,
00609 kRoundUp,
00610 kRoundHalfEven,
00612 kRoundHalfDown,
00614 kRoundHalfUp
00616
00617 };
00618
00623
enum EPadPosition {
00624 kPadBeforePrefix,
00625 kPadAfterPrefix,
00626 kPadBeforeSuffix,
00627 kPadAfterSuffix
00628 };
00629
00643 DecimalFormat(UErrorCode& status);
00644
00659 DecimalFormat(
const UnicodeString& pattern,
00660 UErrorCode& status);
00661
00680 DecimalFormat(
const UnicodeString& pattern,
00681
DecimalFormatSymbols* symbolsToAdopt,
00682 UErrorCode& status);
00683
00703 DecimalFormat(
const UnicodeString& pattern,
00704
DecimalFormatSymbols* symbolsToAdopt,
00705
UParseError& parseError,
00706 UErrorCode& status);
00724 DecimalFormat(
const UnicodeString& pattern,
00725
const DecimalFormatSymbols& symbols,
00726 UErrorCode& status);
00727
00734 DecimalFormat(
const DecimalFormat& source);
00735
00742 DecimalFormat& operator=(
const DecimalFormat& rhs);
00743
00748
virtual ~DecimalFormat();
00749
00757
virtual Format*
clone(
void) const;
00758
00767 virtual UBool operator==(const
Format& other) const;
00768
00780 virtual
UnicodeString& format(
double number,
00781
UnicodeString& appendTo,
00782
FieldPosition& pos) const;
00794 virtual
UnicodeString& format(int32_t number,
00795
UnicodeString& appendTo,
00796
FieldPosition& pos) const;
00808 virtual
UnicodeString& format(
int64_t number,
00809
UnicodeString& appendTo,
00810
FieldPosition& pos) const;
00811
00824 virtual
UnicodeString& format(const
Formattable& obj,
00825
UnicodeString& appendTo,
00826
FieldPosition& pos,
00827 UErrorCode& status) const;
00828
00840
UnicodeString& format(const
Formattable& obj,
00841
UnicodeString& appendTo,
00842 UErrorCode& status) const;
00843
00854
UnicodeString& format(
double number,
00855
UnicodeString& appendTo) const;
00856
00868
UnicodeString& format(int32_t number,
00869
UnicodeString& appendTo) const;
00870
00882
UnicodeString& format(int64_t number,
00883
UnicodeString& appendTo) const;
00903 virtual
void parse(const
UnicodeString& text,
00904
Formattable& result,
00905
ParsePosition& parsePosition) const;
00906
00907
00916 virtual
void parse(const
UnicodeString& text,
00917
Formattable& result,
00918 UErrorCode& status) const;
00919
00939 virtual
Formattable& parseCurrency(const
UnicodeString& text,
00940
Formattable& result,
00941
ParsePosition& pos) const;
00942
00950 virtual const
DecimalFormatSymbols* getDecimalFormatSymbols(
void) const;
00951
00958 virtual
void adoptDecimalFormatSymbols(
DecimalFormatSymbols* symbolsToAdopt);
00959
00966 virtual
void setDecimalFormatSymbols(const
DecimalFormatSymbols& symbols);
00967
00968
00977
UnicodeString& getPositivePrefix(
UnicodeString& result) const;
00978
00986 virtual
void setPositivePrefix(const
UnicodeString& newValue);
00987
00996
UnicodeString& getNegativePrefix(
UnicodeString& result) const;
00997
01005 virtual
void setNegativePrefix(const
UnicodeString& newValue);
01006
01015
UnicodeString& getPositiveSuffix(
UnicodeString& result) const;
01016
01024 virtual
void setPositiveSuffix(const
UnicodeString& newValue);
01025
01034
UnicodeString& getNegativeSuffix(
UnicodeString& result) const;
01035
01043 virtual
void setNegativeSuffix(const
UnicodeString& newValue);
01044
01055 int32_t getMultiplier(
void) const;
01056
01067 virtual
void setMultiplier(int32_t newValue);
01068
01078 virtual
double getRoundingIncrement(
void) const;
01079
01090 virtual
void setRoundingIncrement(
double newValue);
01091
01100 virtual ERoundingMode getRoundingMode(
void) const;
01101
01111 virtual
void setRoundingMode(ERoundingMode roundingMode);
01112
01124 virtual int32_t getFormatWidth(
void) const;
01125
01140 virtual
void setFormatWidth(int32_t width);
01141
01154 virtual
UnicodeString getPadCharacterString() const;
01155
01170 virtual
void setPadCharacter(const
UnicodeString &padChar);
01171
01190 virtual EPadPosition getPadPosition(
void) const;
01191
01211 virtual
void setPadPosition(EPadPosition padPos);
01212
01223 virtual UBool isScientificNotation(
void);
01224
01240 virtual
void setScientificNotation(UBool useScientific);
01241
01252 virtual int8_t getMinimumExponentDigits(
void) const;
01253
01266 virtual
void setMinimumExponentDigits(int8_t minExpDig);
01267
01280 virtual UBool isExponentSignAlwaysShown(
void);
01281
01295 virtual
void setExponentSignAlwaysShown(UBool expSignAlways);
01296
01308 int32_t getGroupingSize(
void) const;
01309
01321 virtual
void setGroupingSize(int32_t newValue);
01322
01341 int32_t getSecondaryGroupingSize(
void) const;
01342
01354 virtual
void setSecondaryGroupingSize(int32_t newValue);
01355
01364 UBool isDecimalSeparatorAlwaysShown(
void) const;
01365
01374 virtual
void setDecimalSeparatorAlwaysShown(UBool newValue);
01375
01386 virtual
UnicodeString& toPattern(
UnicodeString& result) const;
01387
01398 virtual
UnicodeString& toLocalizedPattern(
UnicodeString& result) const;
01399
01429 virtual
void applyPattern(const
UnicodeString& pattern,
01430
UParseError& parseError,
01431 UErrorCode& status);
01440 virtual
void applyPattern(const
UnicodeString& pattern,
01441 UErrorCode& status);
01442
01473 virtual
void applyLocalizedPattern(const
UnicodeString& pattern,
01474
UParseError& parseError,
01475 UErrorCode& status);
01476
01486 virtual
void applyLocalizedPattern(const
UnicodeString& pattern,
01487 UErrorCode& status);
01488
01489
01499 virtual
void setMaximumIntegerDigits(int32_t newValue);
01500
01510 virtual
void setMinimumIntegerDigits(int32_t newValue);
01511
01521 virtual
void setMaximumFractionDigits(int32_t newValue);
01522
01532 virtual
void setMinimumFractionDigits(int32_t newValue);
01533
01541 int32_t getMinimumSignificantDigits() const;
01542
01550 int32_t getMaximumSignificantDigits() const;
01551
01561
void setMinimumSignificantDigits(int32_t min);
01562
01573
void setMaximumSignificantDigits(int32_t max);
01574
01581 UBool areSignificantDigitsUsed() const;
01582
01590
void setSignificantDigitsUsed(UBool useSignificantDigits);
01591
01592 public:
01605 virtual
void setCurrency(const UChar* theCurrency, UErrorCode& ec);
01606
01612 virtual
void setCurrency(const UChar* theCurrency);
01613
01619 static const
char fgNumberPatterns[];
01620
01621 public:
01622
01634 static UClassID getStaticClassID(
void);
01635
01647 virtual UClassID getDynamicClassID(
void) const;
01648
01649 private:
01650 DecimalFormat();
01651
01652 int32_t precision(UBool isIntegral) const;
01653
01657
void construct(UErrorCode& status,
01658
UParseError& parseErr,
01659 const
UnicodeString* pattern = 0,
01660
DecimalFormatSymbols* symbolsToAdopt = 0
01661 );
01662
01671
UnicodeString& toPattern(
UnicodeString& result, UBool localized) const;
01672
01683
void applyPattern(const
UnicodeString& pattern,
01684 UBool localized,
01685
UParseError& parseError,
01686 UErrorCode& status);
01698
UnicodeString& subformat(
UnicodeString& appendTo,
01699
FieldPosition& fieldPosition,
01700 DigitList& digits,
01701 UBool isInteger) const;
01702
01703
void parse(const
UnicodeString& text,
01704
Formattable& result,
01705
ParsePosition& pos,
01706 UBool parseCurrency) const;
01707
01708 enum {
01709 fgStatusInfinite,
01710 fgStatusLength
01711 } StatusFlags;
01712
01713
UBool subparse(
const UnicodeString& text,
ParsePosition& parsePosition,
01714 DigitList& digits, UBool* status,
01715 UChar* currency)
const;
01716
01717
int32_t skipPadding(
const UnicodeString& text, int32_t position)
const;
01718
01719
int32_t compareAffix(
const UnicodeString& input,
01720 int32_t pos,
01721 UBool isNegative,
01722 UBool isPrefix,
01723 UChar* currency)
const;
01724
01725
static int32_t compareSimpleAffix(
const UnicodeString& affix,
01726
const UnicodeString& input,
01727 int32_t pos);
01728
01729
static int32_t skipRuleWhiteSpace(
const UnicodeString& text, int32_t pos);
01730
01731
static int32_t skipUWhiteSpace(
const UnicodeString& text, int32_t pos);
01732
01733
int32_t compareComplexAffix(
const UnicodeString& affixPat,
01734
const UnicodeString& input,
01735 int32_t pos,
01736 UChar* currency)
const;
01737
01738
static int32_t match(
const UnicodeString& text, int32_t pos, UChar32 ch);
01739
01740
static int32_t match(
const UnicodeString& text, int32_t pos,
const UnicodeString& str);
01741
01747
inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol)
const;
01748
01749
int32_t appendAffix(
UnicodeString& buf,
double number,
01750 UBool isNegative, UBool isPrefix)
const;
01751
01757
void appendAffixPattern(
UnicodeString& appendTo,
const UnicodeString& affix,
01758 UBool localized)
const;
01759
01760
void appendAffixPattern(
UnicodeString& appendTo,
01761
const UnicodeString* affixPattern,
01762
const UnicodeString& expAffix, UBool localized)
const;
01763
01764
void expandAffix(
const UnicodeString& pattern,
01765
UnicodeString& affix,
01766
double number,
01767 UBool doFormat)
const;
01768
01769
void expandAffixes();
01770
01771
static double round(
double a, ERoundingMode mode, UBool isNegative);
01772
01773
void addPadding(
UnicodeString& appendTo,
01774
FieldPosition& fieldPosition,
01775 int32_t prefixLen, int32_t suffixLen)
const;
01776
01777
UBool isGroupingPosition(int32_t pos)
const;
01778
01779
void setCurrencyForSymbols();
01780
01781
void setCurrencyForLocale(
const char* locale, UErrorCode& ec);
01782
01786
01787
01788
01789
01790
UnicodeString fPositivePrefix;
01791
UnicodeString fPositiveSuffix;
01792
UnicodeString fNegativePrefix;
01793
UnicodeString fNegativeSuffix;
01794
UnicodeString* fPosPrefixPattern;
01795
UnicodeString* fPosSuffixPattern;
01796
UnicodeString* fNegPrefixPattern;
01797
UnicodeString* fNegSuffixPattern;
01798
01804
ChoiceFormat* fCurrencyChoice;
01805
01806
int32_t fMultiplier;
01807
int32_t fGroupingSize;
01808
int32_t fGroupingSize2;
01809
UBool fDecimalSeparatorAlwaysShown;
01810
UBool fIsCurrencyFormat;
01811
DecimalFormatSymbols* fSymbols;
01812
01813
UBool fUseSignificantDigits;
01814
int32_t fMinSignificantDigits;
01815
int32_t fMaxSignificantDigits;
01816
01817
UBool fUseExponentialNotation;
01818
int8_t fMinExponentDigits;
01819
UBool fExponentSignAlwaysShown;
01820
01821
01822
01823
01824
01825 DigitList* fRoundingIncrement;
01826
double fRoundingDouble;
01827 ERoundingMode fRoundingMode;
01828
01829
UChar32 fPad;
01830
int32_t fFormatWidth;
01831 EPadPosition fPadPosition;
01832
01833
protected:
01834
01843
virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec)
const;
01844
01848
static const int32_t kDoubleIntegerDigits;
01852
static const int32_t kDoubleFractionDigits;
01853
01864
static const int32_t kMaxScientificIntegerDigits;
01865 };
01866
01867
inline UnicodeString&
01868
DecimalFormat::format(
const Formattable& obj,
01869
UnicodeString& appendTo,
01870 UErrorCode& status)
const {
01871
01872
01873
return NumberFormat::format(obj, appendTo, status);
01874 }
01875
01876
inline UnicodeString&
01877
DecimalFormat::format(
double number,
01878
UnicodeString& appendTo)
const {
01879
FieldPosition pos(0);
01880
return format(number, appendTo, pos);
01881 }
01882
01883
inline UnicodeString&
01884
DecimalFormat::format(int32_t number,
01885
UnicodeString& appendTo)
const {
01886
FieldPosition pos(0);
01887
return format((int64_t)number, appendTo, pos);
01888 }
01889
01890
inline const UnicodeString &
01891 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol)
const {
01892
return fSymbols->
getConstSymbol(symbol);
01893 }
01894
01895
U_NAMESPACE_END
01896
01897
#endif
01898
01899
#endif // _DECIMFMT
01900