00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef NUMFMT_H
00022 #define NUMFMT_H
00023
00024
00025 #include "unicode/utypes.h"
00026
00032 #if !UCONFIG_NO_FORMATTING
00033
00034 #include "unicode/unistr.h"
00035 #include "unicode/format.h"
00036 #include "unicode/unum.h"
00037 #include "unicode/locid.h"
00038 #include "unicode/stringpiece.h"
00039 #include "unicode/curramt.h"
00040 #include "unicode/udisplaycontext.h"
00041
00042 class NumberFormatTest;
00043
00044 U_NAMESPACE_BEGIN
00045
00046 class SharedNumberFormat;
00047
00048 #if !UCONFIG_NO_SERVICE
00049 class NumberFormatFactory;
00050 class StringEnumeration;
00051 #endif
00052
00167 class U_I18N_API NumberFormat : public Format {
00168 public:
00184 enum EAlignmentFields {
00186 kIntegerField = UNUM_INTEGER_FIELD,
00188 kFractionField = UNUM_FRACTION_FIELD,
00190 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
00192 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
00194 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
00196 kExponentField = UNUM_EXPONENT_FIELD,
00198 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
00200 kCurrencyField = UNUM_CURRENCY_FIELD,
00202 kPercentField = UNUM_PERCENT_FIELD,
00204 kPermillField = UNUM_PERMILL_FIELD,
00206 kSignField = UNUM_SIGN_FIELD,
00207
00213 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00215 FRACTION_FIELD = UNUM_FRACTION_FIELD
00216 };
00217
00222 virtual ~NumberFormat();
00223
00230 virtual UBool operator==(const Format& other) const;
00231
00232
00233 using Format::format;
00234
00250 virtual UnicodeString& format(const Formattable& obj,
00251 UnicodeString& appendTo,
00252 FieldPosition& pos,
00253 UErrorCode& status) const;
00254
00271 virtual UnicodeString& format(const Formattable& obj,
00272 UnicodeString& appendTo,
00273 FieldPositionIterator* posIter,
00274 UErrorCode& status) const;
00275
00304 virtual void parseObject(const UnicodeString& source,
00305 Formattable& result,
00306 ParsePosition& parse_pos) const;
00307
00318 UnicodeString& format( double number,
00319 UnicodeString& appendTo) const;
00320
00331 UnicodeString& format( int32_t number,
00332 UnicodeString& appendTo) const;
00333
00344 UnicodeString& format( int64_t number,
00345 UnicodeString& appendTo) const;
00346
00359 virtual UnicodeString& format(double number,
00360 UnicodeString& appendTo,
00361 FieldPosition& pos) const = 0;
00376 virtual UnicodeString& format(double number,
00377 UnicodeString& appendTo,
00378 FieldPosition& pos,
00379 UErrorCode &status) const;
00394 virtual UnicodeString& format(double number,
00395 UnicodeString& appendTo,
00396 FieldPositionIterator* posIter,
00397 UErrorCode& status) const;
00410 virtual UnicodeString& format(int32_t number,
00411 UnicodeString& appendTo,
00412 FieldPosition& pos) const = 0;
00413
00427 virtual UnicodeString& format(int32_t number,
00428 UnicodeString& appendTo,
00429 FieldPosition& pos,
00430 UErrorCode &status) const;
00431
00446 virtual UnicodeString& format(int32_t number,
00447 UnicodeString& appendTo,
00448 FieldPositionIterator* posIter,
00449 UErrorCode& status) const;
00463 virtual UnicodeString& format(int64_t number,
00464 UnicodeString& appendTo,
00465 FieldPosition& pos) const;
00466
00481 virtual UnicodeString& format(int64_t number,
00482 UnicodeString& appendTo,
00483 FieldPosition& pos,
00484 UErrorCode& status) const;
00499 virtual UnicodeString& format(int64_t number,
00500 UnicodeString& appendTo,
00501 FieldPositionIterator* posIter,
00502 UErrorCode& status) const;
00503
00520 virtual UnicodeString& format(const StringPiece &number,
00521 UnicodeString& appendTo,
00522 FieldPositionIterator* posIter,
00523 UErrorCode& status) const;
00524 public:
00542 virtual UnicodeString& format(const DigitList &number,
00543 UnicodeString& appendTo,
00544 FieldPositionIterator* posIter,
00545 UErrorCode& status) const;
00546
00564 virtual UnicodeString& format(const DigitList &number,
00565 UnicodeString& appendTo,
00566 FieldPosition& pos,
00567 UErrorCode& status) const;
00568
00569 public:
00570
00590 virtual void parse(const UnicodeString& text,
00591 Formattable& result,
00592 ParsePosition& parsePosition) const = 0;
00593
00607 virtual void parse(const UnicodeString& text,
00608 Formattable& result,
00609 UErrorCode& status) const;
00610
00630 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00631 ParsePosition& pos) const;
00632
00644 UBool isParseIntegerOnly(void) const;
00645
00653 virtual void setParseIntegerOnly(UBool value);
00654
00662 virtual void setLenient(UBool enable);
00663
00672 virtual UBool isLenient(void) const;
00673
00679 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00680
00687 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00688 UErrorCode&);
00689
00698 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00699 UNumberFormatStyle style,
00700 UErrorCode& errorCode);
00701
00702 #ifndef U_HIDE_INTERNAL_API
00703
00709 static NumberFormat* internalCreateInstance(
00710 const Locale& desiredLocale,
00711 UNumberFormatStyle style,
00712 UErrorCode& errorCode);
00713
00721 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00722 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00723
00724 #endif
00725
00730 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00731
00737 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00738 UErrorCode&);
00739
00744 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00745
00751 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00752 UErrorCode&);
00753
00758 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00759
00765 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00766 UErrorCode&);
00767
00773 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00774
00775 #if !UCONFIG_NO_SERVICE
00776
00786 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00787
00800 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00801
00808 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00809 #endif
00810
00820 UBool isGroupingUsed(void) const;
00821
00828 virtual void setGroupingUsed(UBool newValue);
00829
00838 int32_t getMaximumIntegerDigits(void) const;
00839
00852 virtual void setMaximumIntegerDigits(int32_t newValue);
00853
00862 int32_t getMinimumIntegerDigits(void) const;
00863
00874 virtual void setMinimumIntegerDigits(int32_t newValue);
00875
00884 int32_t getMaximumFractionDigits(void) const;
00885
00896 virtual void setMaximumFractionDigits(int32_t newValue);
00897
00906 int32_t getMinimumFractionDigits(void) const;
00907
00918 virtual void setMinimumFractionDigits(int32_t newValue);
00919
00932 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
00933
00941 const UChar* getCurrency() const;
00942
00952 virtual void setContext(UDisplayContext value, UErrorCode& status);
00953
00964 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
00965
00966 public:
00967
00976 static UClassID U_EXPORT2 getStaticClassID(void);
00977
00989 virtual UClassID getDynamicClassID(void) const = 0;
00990
00991 protected:
00992
00997 NumberFormat();
00998
01003 NumberFormat(const NumberFormat&);
01004
01009 NumberFormat& operator=(const NumberFormat&);
01010
01019 virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
01020
01021 #ifndef U_HIDE_INTERNAL_API
01022
01028 static NumberFormat* makeInstance(const Locale& desiredLocale,
01029 UNumberFormatStyle style,
01030 UBool mustBeDecimalFormat,
01031 UErrorCode& errorCode);
01032 #endif
01033
01034 private:
01035
01036 static UBool isStyleSupported(UNumberFormatStyle style);
01037
01045 static NumberFormat* makeInstance(const Locale& desiredLocale,
01046 UNumberFormatStyle style,
01047 UErrorCode& errorCode);
01048
01049 UBool fGroupingUsed;
01050 int32_t fMaxIntegerDigits;
01051 int32_t fMinIntegerDigits;
01052 int32_t fMaxFractionDigits;
01053 int32_t fMinFractionDigits;
01054
01055 protected:
01057 static const int32_t gDefaultMaxIntegerDigits;
01059 static const int32_t gDefaultMinIntegerDigits;
01060
01061 private:
01062 UBool fParseIntegerOnly;
01063 UBool fLenient;
01064
01065
01066 UChar fCurrency[4];
01067
01068 UDisplayContext fCapitalizationContext;
01069
01070 friend class ICUNumberFormatFactory;
01071 friend class ICUNumberFormatService;
01072 friend class ::NumberFormatTest;
01073 };
01074
01075 #if !UCONFIG_NO_SERVICE
01076
01084 class U_I18N_API NumberFormatFactory : public UObject {
01085 public:
01086
01091 virtual ~NumberFormatFactory();
01092
01099 virtual UBool visible(void) const = 0;
01100
01106 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01107
01115 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01116 };
01117
01122 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01123 protected:
01128 const UBool _visible;
01129
01134 UnicodeString _id;
01135
01136 public:
01140 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01141
01145 virtual ~SimpleNumberFormatFactory();
01146
01150 virtual UBool visible(void) const;
01151
01155 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01156 };
01157 #endif
01158
01159
01160
01161 inline UBool
01162 NumberFormat::isParseIntegerOnly() const
01163 {
01164 return fParseIntegerOnly;
01165 }
01166
01167 inline UBool
01168 NumberFormat::isLenient() const
01169 {
01170 return fLenient;
01171 }
01172
01173 U_NAMESPACE_END
01174
01175 #endif
01176
01177 #endif // _NUMFMT
01178