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 #ifndef U_HIDE_DRAFT_API
00241
00242 kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD,
00244 kCompactField = UNUM_COMPACT_FIELD,
00245 #endif // U_HIDE_DRAFT_API
00246
00252 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00254 FRACTION_FIELD = UNUM_FRACTION_FIELD
00255 };
00256
00261 virtual ~NumberFormat();
00262
00269 virtual UBool operator==(const Format& other) const;
00270
00271
00272 using Format::format;
00273
00289 virtual UnicodeString& format(const Formattable& obj,
00290 UnicodeString& appendTo,
00291 FieldPosition& pos,
00292 UErrorCode& status) const;
00293
00310 virtual UnicodeString& format(const Formattable& obj,
00311 UnicodeString& appendTo,
00312 FieldPositionIterator* posIter,
00313 UErrorCode& status) const;
00314
00343 virtual void parseObject(const UnicodeString& source,
00344 Formattable& result,
00345 ParsePosition& parse_pos) const;
00346
00357 UnicodeString& format( double number,
00358 UnicodeString& appendTo) const;
00359
00370 UnicodeString& format( int32_t number,
00371 UnicodeString& appendTo) const;
00372
00383 UnicodeString& format( int64_t number,
00384 UnicodeString& appendTo) const;
00385
00398 virtual UnicodeString& format(double number,
00399 UnicodeString& appendTo,
00400 FieldPosition& pos) const = 0;
00415 virtual UnicodeString& format(double number,
00416 UnicodeString& appendTo,
00417 FieldPosition& pos,
00418 UErrorCode &status) const;
00433 virtual UnicodeString& format(double number,
00434 UnicodeString& appendTo,
00435 FieldPositionIterator* posIter,
00436 UErrorCode& status) const;
00449 virtual UnicodeString& format(int32_t number,
00450 UnicodeString& appendTo,
00451 FieldPosition& pos) const = 0;
00452
00466 virtual UnicodeString& format(int32_t number,
00467 UnicodeString& appendTo,
00468 FieldPosition& pos,
00469 UErrorCode &status) const;
00470
00485 virtual UnicodeString& format(int32_t number,
00486 UnicodeString& appendTo,
00487 FieldPositionIterator* posIter,
00488 UErrorCode& status) const;
00502 virtual UnicodeString& format(int64_t number,
00503 UnicodeString& appendTo,
00504 FieldPosition& pos) const;
00505
00520 virtual UnicodeString& format(int64_t number,
00521 UnicodeString& appendTo,
00522 FieldPosition& pos,
00523 UErrorCode& status) const;
00538 virtual UnicodeString& format(int64_t number,
00539 UnicodeString& appendTo,
00540 FieldPositionIterator* posIter,
00541 UErrorCode& status) const;
00542
00559 virtual UnicodeString& format(StringPiece number,
00560 UnicodeString& appendTo,
00561 FieldPositionIterator* posIter,
00562 UErrorCode& status) const;
00563
00564
00565
00583 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00584 UnicodeString& appendTo,
00585 FieldPositionIterator* posIter,
00586 UErrorCode& status) const;
00587
00605 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00606 UnicodeString& appendTo,
00607 FieldPosition& pos,
00608 UErrorCode& status) const;
00609
00629 virtual void parse(const UnicodeString& text,
00630 Formattable& result,
00631 ParsePosition& parsePosition) const = 0;
00632
00646 virtual void parse(const UnicodeString& text,
00647 Formattable& result,
00648 UErrorCode& status) const;
00649
00669 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00670 ParsePosition& pos) const;
00671
00683 UBool isParseIntegerOnly(void) const;
00684
00692 virtual void setParseIntegerOnly(UBool value);
00693
00701 virtual void setLenient(UBool enable);
00702
00711 virtual UBool isLenient(void) const;
00712
00721 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00722
00732 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00733 UErrorCode&);
00734
00746 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00747 UNumberFormatStyle style,
00748 UErrorCode& errorCode);
00749
00750 #ifndef U_HIDE_INTERNAL_API
00751
00757 static NumberFormat* internalCreateInstance(
00758 const Locale& desiredLocale,
00759 UNumberFormatStyle style,
00760 UErrorCode& errorCode);
00761
00769 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00770 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00771
00772 #endif
00773
00781 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00782
00791 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00792 UErrorCode&);
00793
00801 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00802
00811 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00812 UErrorCode&);
00813
00821 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00822
00831 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00832 UErrorCode&);
00833
00839 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00840
00841 #if !UCONFIG_NO_SERVICE
00842
00852 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00853
00866 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00867
00874 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00875 #endif
00876
00886 UBool isGroupingUsed(void) const;
00887
00894 virtual void setGroupingUsed(UBool newValue);
00895
00904 int32_t getMaximumIntegerDigits(void) const;
00905
00918 virtual void setMaximumIntegerDigits(int32_t newValue);
00919
00928 int32_t getMinimumIntegerDigits(void) const;
00929
00940 virtual void setMinimumIntegerDigits(int32_t newValue);
00941
00950 int32_t getMaximumFractionDigits(void) const;
00951
00962 virtual void setMaximumFractionDigits(int32_t newValue);
00963
00972 int32_t getMinimumFractionDigits(void) const;
00973
00984 virtual void setMinimumFractionDigits(int32_t newValue);
00985
00998 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
00999
01007 const char16_t* getCurrency() const;
01008
01018 virtual void setContext(UDisplayContext value, UErrorCode& status);
01019
01030 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
01031
01038 virtual ERoundingMode getRoundingMode(void) const;
01039
01045 virtual void setRoundingMode(ERoundingMode roundingMode);
01046
01047 public:
01048
01057 static UClassID U_EXPORT2 getStaticClassID(void);
01058
01070 virtual UClassID getDynamicClassID(void) const = 0;
01071
01072 protected:
01073
01078 NumberFormat();
01079
01084 NumberFormat(const NumberFormat&);
01085
01090 NumberFormat& operator=(const NumberFormat&);
01091
01100 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
01101
01102 #ifndef U_HIDE_INTERNAL_API
01103
01109 static NumberFormat* makeInstance(const Locale& desiredLocale,
01110 UNumberFormatStyle style,
01111 UBool mustBeDecimalFormat,
01112 UErrorCode& errorCode);
01113 #endif
01114
01115 private:
01116
01117 static UBool isStyleSupported(UNumberFormatStyle style);
01118
01126 static NumberFormat* makeInstance(const Locale& desiredLocale,
01127 UNumberFormatStyle style,
01128 UErrorCode& errorCode);
01129
01130 UBool fGroupingUsed;
01131 int32_t fMaxIntegerDigits;
01132 int32_t fMinIntegerDigits;
01133 int32_t fMaxFractionDigits;
01134 int32_t fMinFractionDigits;
01135
01136 protected:
01138 static const int32_t gDefaultMaxIntegerDigits;
01140 static const int32_t gDefaultMinIntegerDigits;
01141
01142 private:
01143 UBool fParseIntegerOnly;
01144 UBool fLenient;
01145
01146
01147 char16_t fCurrency[4];
01148
01149 UDisplayContext fCapitalizationContext;
01150
01151 friend class ICUNumberFormatFactory;
01152 friend class ICUNumberFormatService;
01153 friend class ::NumberFormatTest;
01154 };
01155
01156 #if !UCONFIG_NO_SERVICE
01157
01165 class U_I18N_API NumberFormatFactory : public UObject {
01166 public:
01167
01172 virtual ~NumberFormatFactory();
01173
01180 virtual UBool visible(void) const = 0;
01181
01187 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01188
01196 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01197 };
01198
01203 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01204 protected:
01209 const UBool _visible;
01210
01215 UnicodeString _id;
01216
01217 public:
01221 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01222
01226 virtual ~SimpleNumberFormatFactory();
01227
01231 virtual UBool visible(void) const;
01232
01236 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01237 };
01238 #endif
01239
01240
01241
01242 inline UBool
01243 NumberFormat::isParseIntegerOnly() const
01244 {
01245 return fParseIntegerOnly;
01246 }
01247
01248 inline UBool
01249 NumberFormat::isLenient() const
01250 {
01251 return fLenient;
01252 }
01253
01254 U_NAMESPACE_END
01255
01256 #endif
01257
01258 #endif // _NUMFMT
01259