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
00029 #if U_SHOW_CPLUSPLUS_API
00030
00036 #if !UCONFIG_NO_FORMATTING
00037
00038 #include "unicode/unistr.h"
00039 #include "unicode/format.h"
00040 #include "unicode/unum.h"
00041 #include "unicode/locid.h"
00042 #include "unicode/stringpiece.h"
00043 #include "unicode/curramt.h"
00044 #include "unicode/udisplaycontext.h"
00045
00046 class NumberFormatTest;
00047
00048 U_NAMESPACE_BEGIN
00049
00050 class SharedNumberFormat;
00051
00052 #if !UCONFIG_NO_SERVICE
00053 class NumberFormatFactory;
00054 class StringEnumeration;
00055 #endif
00056
00175 class U_I18N_API NumberFormat : public Format {
00176 public:
00186 enum ERoundingMode {
00187 kRoundCeiling,
00188 kRoundFloor,
00189 kRoundDown,
00190 kRoundUp,
00191 kRoundHalfEven,
00193 kRoundHalfDown,
00195 kRoundHalfUp,
00201 kRoundUnnecessary
00202 };
00203
00219 enum EAlignmentFields {
00221 kIntegerField = UNUM_INTEGER_FIELD,
00223 kFractionField = UNUM_FRACTION_FIELD,
00225 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
00227 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
00229 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
00231 kExponentField = UNUM_EXPONENT_FIELD,
00233 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
00235 kCurrencyField = UNUM_CURRENCY_FIELD,
00237 kPercentField = UNUM_PERCENT_FIELD,
00239 kPermillField = UNUM_PERMILL_FIELD,
00241 kSignField = UNUM_SIGN_FIELD,
00242 #ifndef U_HIDE_DRAFT_API
00243
00244 kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD,
00246 kCompactField = UNUM_COMPACT_FIELD,
00247 #endif // U_HIDE_DRAFT_API
00248
00254 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00256 FRACTION_FIELD = UNUM_FRACTION_FIELD
00257 };
00258
00263 virtual ~NumberFormat();
00264
00271 virtual NumberFormat* clone() const = 0;
00272
00279 virtual UBool operator==(const Format& other) const;
00280
00281
00282 using Format::format;
00283
00299 virtual UnicodeString& format(const Formattable& obj,
00300 UnicodeString& appendTo,
00301 FieldPosition& pos,
00302 UErrorCode& status) const;
00303
00320 virtual UnicodeString& format(const Formattable& obj,
00321 UnicodeString& appendTo,
00322 FieldPositionIterator* posIter,
00323 UErrorCode& status) const;
00324
00353 virtual void parseObject(const UnicodeString& source,
00354 Formattable& result,
00355 ParsePosition& parse_pos) const;
00356
00367 UnicodeString& format( double number,
00368 UnicodeString& appendTo) const;
00369
00380 UnicodeString& format( int32_t number,
00381 UnicodeString& appendTo) const;
00382
00393 UnicodeString& format( int64_t number,
00394 UnicodeString& appendTo) const;
00395
00408 virtual UnicodeString& format(double number,
00409 UnicodeString& appendTo,
00410 FieldPosition& pos) const = 0;
00425 virtual UnicodeString& format(double number,
00426 UnicodeString& appendTo,
00427 FieldPosition& pos,
00428 UErrorCode &status) const;
00443 virtual UnicodeString& format(double number,
00444 UnicodeString& appendTo,
00445 FieldPositionIterator* posIter,
00446 UErrorCode& status) const;
00459 virtual UnicodeString& format(int32_t number,
00460 UnicodeString& appendTo,
00461 FieldPosition& pos) const = 0;
00462
00476 virtual UnicodeString& format(int32_t number,
00477 UnicodeString& appendTo,
00478 FieldPosition& pos,
00479 UErrorCode &status) const;
00480
00495 virtual UnicodeString& format(int32_t number,
00496 UnicodeString& appendTo,
00497 FieldPositionIterator* posIter,
00498 UErrorCode& status) const;
00512 virtual UnicodeString& format(int64_t number,
00513 UnicodeString& appendTo,
00514 FieldPosition& pos) const;
00515
00530 virtual UnicodeString& format(int64_t number,
00531 UnicodeString& appendTo,
00532 FieldPosition& pos,
00533 UErrorCode& status) const;
00548 virtual UnicodeString& format(int64_t number,
00549 UnicodeString& appendTo,
00550 FieldPositionIterator* posIter,
00551 UErrorCode& status) const;
00552
00569 virtual UnicodeString& format(StringPiece number,
00570 UnicodeString& appendTo,
00571 FieldPositionIterator* posIter,
00572 UErrorCode& status) const;
00573
00574
00575
00593 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00594 UnicodeString& appendTo,
00595 FieldPositionIterator* posIter,
00596 UErrorCode& status) const;
00597
00615 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00616 UnicodeString& appendTo,
00617 FieldPosition& pos,
00618 UErrorCode& status) const;
00619
00639 virtual void parse(const UnicodeString& text,
00640 Formattable& result,
00641 ParsePosition& parsePosition) const = 0;
00642
00658 virtual void parse(const UnicodeString& text,
00659 Formattable& result,
00660 UErrorCode& status) const;
00661
00681 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00682 ParsePosition& pos) const;
00683
00695 UBool isParseIntegerOnly(void) const;
00696
00704 virtual void setParseIntegerOnly(UBool value);
00705
00713 virtual void setLenient(UBool enable);
00714
00723 virtual UBool isLenient(void) const;
00724
00733 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00734
00744 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00745 UErrorCode&);
00746
00758 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00759 UNumberFormatStyle style,
00760 UErrorCode& errorCode);
00761
00762 #ifndef U_HIDE_INTERNAL_API
00763
00769 static NumberFormat* internalCreateInstance(
00770 const Locale& desiredLocale,
00771 UNumberFormatStyle style,
00772 UErrorCode& errorCode);
00773
00781 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00782 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00783
00784 #endif
00785
00793 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00794
00803 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00804 UErrorCode&);
00805
00813 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00814
00823 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00824 UErrorCode&);
00825
00833 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00834
00843 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00844 UErrorCode&);
00845
00851 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00852
00853 #if !UCONFIG_NO_SERVICE
00854
00864 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00865
00878 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00879
00886 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00887 #endif
00888
00898 UBool isGroupingUsed(void) const;
00899
00906 virtual void setGroupingUsed(UBool newValue);
00907
00916 int32_t getMaximumIntegerDigits(void) const;
00917
00930 virtual void setMaximumIntegerDigits(int32_t newValue);
00931
00940 int32_t getMinimumIntegerDigits(void) const;
00941
00952 virtual void setMinimumIntegerDigits(int32_t newValue);
00953
00962 int32_t getMaximumFractionDigits(void) const;
00963
00974 virtual void setMaximumFractionDigits(int32_t newValue);
00975
00984 int32_t getMinimumFractionDigits(void) const;
00985
00996 virtual void setMinimumFractionDigits(int32_t newValue);
00997
01010 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
01011
01019 const char16_t* getCurrency() const;
01020
01030 virtual void setContext(UDisplayContext value, UErrorCode& status);
01031
01042 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
01043
01050 virtual ERoundingMode getRoundingMode(void) const;
01051
01057 virtual void setRoundingMode(ERoundingMode roundingMode);
01058
01059 public:
01060
01069 static UClassID U_EXPORT2 getStaticClassID(void);
01070
01082 virtual UClassID getDynamicClassID(void) const = 0;
01083
01084 protected:
01085
01090 NumberFormat();
01091
01096 NumberFormat(const NumberFormat&);
01097
01102 NumberFormat& operator=(const NumberFormat&);
01103
01112 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
01113
01114 #ifndef U_HIDE_INTERNAL_API
01115
01121 static NumberFormat* makeInstance(const Locale& desiredLocale,
01122 UNumberFormatStyle style,
01123 UBool mustBeDecimalFormat,
01124 UErrorCode& errorCode);
01125 #endif
01126
01127 private:
01128
01129 static UBool isStyleSupported(UNumberFormatStyle style);
01130
01138 static NumberFormat* makeInstance(const Locale& desiredLocale,
01139 UNumberFormatStyle style,
01140 UErrorCode& errorCode);
01141
01142 UBool fGroupingUsed;
01143 int32_t fMaxIntegerDigits;
01144 int32_t fMinIntegerDigits;
01145 int32_t fMaxFractionDigits;
01146 int32_t fMinFractionDigits;
01147
01148 protected:
01150 static const int32_t gDefaultMaxIntegerDigits;
01152 static const int32_t gDefaultMinIntegerDigits;
01153
01154 private:
01155 UBool fParseIntegerOnly;
01156 UBool fLenient;
01157
01158
01159 char16_t fCurrency[4];
01160
01161 UDisplayContext fCapitalizationContext;
01162
01163 friend class ICUNumberFormatFactory;
01164 friend class ICUNumberFormatService;
01165 friend class ::NumberFormatTest;
01166 };
01167
01168 #if !UCONFIG_NO_SERVICE
01169
01177 class U_I18N_API NumberFormatFactory : public UObject {
01178 public:
01179
01184 virtual ~NumberFormatFactory();
01185
01192 virtual UBool visible(void) const = 0;
01193
01199 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01200
01208 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01209 };
01210
01215 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01216 protected:
01221 const UBool _visible;
01222
01227 UnicodeString _id;
01228
01229 public:
01233 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01234
01238 virtual ~SimpleNumberFormatFactory();
01239
01243 virtual UBool visible(void) const;
01244
01248 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01249 };
01250 #endif
01251
01252
01253
01254 inline UBool
01255 NumberFormat::isParseIntegerOnly() const
01256 {
01257 return fParseIntegerOnly;
01258 }
01259
01260 inline UBool
01261 NumberFormat::isLenient() const
01262 {
01263 return fLenient;
01264 }
01265
01266 U_NAMESPACE_END
01267
01268 #endif
01269
01270 #endif
01271
01272 #endif // _NUMFMT
01273