00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef NUMFMT_H
00024 #define NUMFMT_H
00025
00026
00027 #include "unicode/utypes.h"
00028
00034 #if !UCONFIG_NO_FORMATTING
00035
00036 #include "unicode/unistr.h"
00037 #include "unicode/format.h"
00038 #include "unicode/unum.h"
00039 #include "unicode/locid.h"
00040 #include "unicode/stringpiece.h"
00041 #include "unicode/curramt.h"
00042 #include "unicode/udisplaycontext.h"
00043
00044 class NumberFormatTest;
00045
00046 U_NAMESPACE_BEGIN
00047
00048 class SharedNumberFormat;
00049
00050 #if !UCONFIG_NO_SERVICE
00051 class NumberFormatFactory;
00052 class StringEnumeration;
00053 #endif
00054
00173 class U_I18N_API NumberFormat : public Format {
00174 public:
00184 enum ERoundingMode {
00185 kRoundCeiling,
00186 kRoundFloor,
00187 kRoundDown,
00188 kRoundUp,
00189 kRoundHalfEven,
00191 kRoundHalfDown,
00193 kRoundHalfUp,
00199 kRoundUnnecessary
00200 };
00201
00217 enum EAlignmentFields {
00219 kIntegerField = UNUM_INTEGER_FIELD,
00221 kFractionField = UNUM_FRACTION_FIELD,
00223 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
00225 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
00227 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
00229 kExponentField = UNUM_EXPONENT_FIELD,
00231 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
00233 kCurrencyField = UNUM_CURRENCY_FIELD,
00235 kPercentField = UNUM_PERCENT_FIELD,
00237 kPermillField = UNUM_PERMILL_FIELD,
00239 kSignField = UNUM_SIGN_FIELD,
00240
00246 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00248 FRACTION_FIELD = UNUM_FRACTION_FIELD
00249 };
00250
00255 virtual ~NumberFormat();
00256
00263 virtual UBool operator==(const Format& other) const;
00264
00265
00266 using Format::format;
00267
00283 virtual UnicodeString& format(const Formattable& obj,
00284 UnicodeString& appendTo,
00285 FieldPosition& pos,
00286 UErrorCode& status) const;
00287
00304 virtual UnicodeString& format(const Formattable& obj,
00305 UnicodeString& appendTo,
00306 FieldPositionIterator* posIter,
00307 UErrorCode& status) const;
00308
00337 virtual void parseObject(const UnicodeString& source,
00338 Formattable& result,
00339 ParsePosition& parse_pos) const;
00340
00351 UnicodeString& format( double number,
00352 UnicodeString& appendTo) const;
00353
00364 UnicodeString& format( int32_t number,
00365 UnicodeString& appendTo) const;
00366
00377 UnicodeString& format( int64_t number,
00378 UnicodeString& appendTo) const;
00379
00392 virtual UnicodeString& format(double number,
00393 UnicodeString& appendTo,
00394 FieldPosition& pos) const = 0;
00409 virtual UnicodeString& format(double number,
00410 UnicodeString& appendTo,
00411 FieldPosition& pos,
00412 UErrorCode &status) const;
00427 virtual UnicodeString& format(double number,
00428 UnicodeString& appendTo,
00429 FieldPositionIterator* posIter,
00430 UErrorCode& status) const;
00443 virtual UnicodeString& format(int32_t number,
00444 UnicodeString& appendTo,
00445 FieldPosition& pos) const = 0;
00446
00460 virtual UnicodeString& format(int32_t number,
00461 UnicodeString& appendTo,
00462 FieldPosition& pos,
00463 UErrorCode &status) const;
00464
00479 virtual UnicodeString& format(int32_t number,
00480 UnicodeString& appendTo,
00481 FieldPositionIterator* posIter,
00482 UErrorCode& status) const;
00496 virtual UnicodeString& format(int64_t number,
00497 UnicodeString& appendTo,
00498 FieldPosition& pos) const;
00499
00514 virtual UnicodeString& format(int64_t number,
00515 UnicodeString& appendTo,
00516 FieldPosition& pos,
00517 UErrorCode& status) const;
00532 virtual UnicodeString& format(int64_t number,
00533 UnicodeString& appendTo,
00534 FieldPositionIterator* posIter,
00535 UErrorCode& status) const;
00536
00553 virtual UnicodeString& format(StringPiece number,
00554 UnicodeString& appendTo,
00555 FieldPositionIterator* posIter,
00556 UErrorCode& status) const;
00557
00558
00559
00577 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00578 UnicodeString& appendTo,
00579 FieldPositionIterator* posIter,
00580 UErrorCode& status) const;
00581
00599 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00600 UnicodeString& appendTo,
00601 FieldPosition& pos,
00602 UErrorCode& status) const;
00603
00623 virtual void parse(const UnicodeString& text,
00624 Formattable& result,
00625 ParsePosition& parsePosition) const = 0;
00626
00640 virtual void parse(const UnicodeString& text,
00641 Formattable& result,
00642 UErrorCode& status) const;
00643
00663 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00664 ParsePosition& pos) const;
00665
00677 UBool isParseIntegerOnly(void) const;
00678
00686 virtual void setParseIntegerOnly(UBool value);
00687
00695 virtual void setLenient(UBool enable);
00696
00705 virtual UBool isLenient(void) const;
00706
00715 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00716
00726 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00727 UErrorCode&);
00728
00740 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00741 UNumberFormatStyle style,
00742 UErrorCode& errorCode);
00743
00744 #ifndef U_HIDE_INTERNAL_API
00745
00751 static NumberFormat* internalCreateInstance(
00752 const Locale& desiredLocale,
00753 UNumberFormatStyle style,
00754 UErrorCode& errorCode);
00755
00763 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00764 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00765
00766 #endif
00767
00775 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00776
00785 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00786 UErrorCode&);
00787
00795 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00796
00805 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00806 UErrorCode&);
00807
00815 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00816
00825 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00826 UErrorCode&);
00827
00833 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00834
00835 #if !UCONFIG_NO_SERVICE
00836
00846 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00847
00860 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00861
00868 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00869 #endif
00870
00880 UBool isGroupingUsed(void) const;
00881
00888 virtual void setGroupingUsed(UBool newValue);
00889
00898 int32_t getMaximumIntegerDigits(void) const;
00899
00912 virtual void setMaximumIntegerDigits(int32_t newValue);
00913
00922 int32_t getMinimumIntegerDigits(void) const;
00923
00934 virtual void setMinimumIntegerDigits(int32_t newValue);
00935
00944 int32_t getMaximumFractionDigits(void) const;
00945
00956 virtual void setMaximumFractionDigits(int32_t newValue);
00957
00966 int32_t getMinimumFractionDigits(void) const;
00967
00978 virtual void setMinimumFractionDigits(int32_t newValue);
00979
00992 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
00993
01001 const char16_t* getCurrency() const;
01002
01012 virtual void setContext(UDisplayContext value, UErrorCode& status);
01013
01024 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
01025
01032 virtual ERoundingMode getRoundingMode(void) const;
01033
01039 virtual void setRoundingMode(ERoundingMode roundingMode);
01040
01041 public:
01042
01051 static UClassID U_EXPORT2 getStaticClassID(void);
01052
01064 virtual UClassID getDynamicClassID(void) const = 0;
01065
01066 protected:
01067
01072 NumberFormat();
01073
01078 NumberFormat(const NumberFormat&);
01079
01084 NumberFormat& operator=(const NumberFormat&);
01085
01094 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
01095
01096 #ifndef U_HIDE_INTERNAL_API
01097
01103 static NumberFormat* makeInstance(const Locale& desiredLocale,
01104 UNumberFormatStyle style,
01105 UBool mustBeDecimalFormat,
01106 UErrorCode& errorCode);
01107 #endif
01108
01109 private:
01110
01111 static UBool isStyleSupported(UNumberFormatStyle style);
01112
01120 static NumberFormat* makeInstance(const Locale& desiredLocale,
01121 UNumberFormatStyle style,
01122 UErrorCode& errorCode);
01123
01124 UBool fGroupingUsed;
01125 int32_t fMaxIntegerDigits;
01126 int32_t fMinIntegerDigits;
01127 int32_t fMaxFractionDigits;
01128 int32_t fMinFractionDigits;
01129
01130 protected:
01132 static const int32_t gDefaultMaxIntegerDigits;
01134 static const int32_t gDefaultMinIntegerDigits;
01135
01136 private:
01137 UBool fParseIntegerOnly;
01138 UBool fLenient;
01139
01140
01141 char16_t fCurrency[4];
01142
01143 UDisplayContext fCapitalizationContext;
01144
01145 friend class ICUNumberFormatFactory;
01146 friend class ICUNumberFormatService;
01147 friend class ::NumberFormatTest;
01148 };
01149
01150 #if !UCONFIG_NO_SERVICE
01151
01159 class U_I18N_API NumberFormatFactory : public UObject {
01160 public:
01161
01166 virtual ~NumberFormatFactory();
01167
01174 virtual UBool visible(void) const = 0;
01175
01181 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01182
01190 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01191 };
01192
01197 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01198 protected:
01203 const UBool _visible;
01204
01209 UnicodeString _id;
01210
01211 public:
01215 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01216
01220 virtual ~SimpleNumberFormatFactory();
01221
01225 virtual UBool visible(void) const;
01226
01230 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01231 };
01232 #endif
01233
01234
01235
01236 inline UBool
01237 NumberFormat::isParseIntegerOnly() const
01238 {
01239 return fParseIntegerOnly;
01240 }
01241
01242 inline UBool
01243 NumberFormat::isLenient() const
01244 {
01245 return fLenient;
01246 }
01247
01248 U_NAMESPACE_END
01249
01250 #endif
01251
01252 #endif // _NUMFMT
01253