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
00174 class U_I18N_API NumberFormat : public Format {
00175 public:
00185 enum ERoundingMode {
00186 kRoundCeiling,
00187 kRoundFloor,
00188 kRoundDown,
00189 kRoundUp,
00190 kRoundHalfEven,
00192 kRoundHalfDown,
00194 kRoundHalfUp,
00200 kRoundUnnecessary
00201 };
00202
00218 enum EAlignmentFields {
00220 kIntegerField = UNUM_INTEGER_FIELD,
00222 kFractionField = UNUM_FRACTION_FIELD,
00224 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
00226 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
00228 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
00230 kExponentField = UNUM_EXPONENT_FIELD,
00232 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
00234 kCurrencyField = UNUM_CURRENCY_FIELD,
00236 kPercentField = UNUM_PERCENT_FIELD,
00238 kPermillField = UNUM_PERMILL_FIELD,
00240 kSignField = UNUM_SIGN_FIELD,
00241
00247 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00249 FRACTION_FIELD = UNUM_FRACTION_FIELD
00250 };
00251
00256 virtual ~NumberFormat();
00257
00264 virtual UBool operator==(const Format& other) const;
00265
00266
00267 using Format::format;
00268
00284 virtual UnicodeString& format(const Formattable& obj,
00285 UnicodeString& appendTo,
00286 FieldPosition& pos,
00287 UErrorCode& status) const;
00288
00305 virtual UnicodeString& format(const Formattable& obj,
00306 UnicodeString& appendTo,
00307 FieldPositionIterator* posIter,
00308 UErrorCode& status) const;
00309
00338 virtual void parseObject(const UnicodeString& source,
00339 Formattable& result,
00340 ParsePosition& parse_pos) const;
00341
00352 UnicodeString& format( double number,
00353 UnicodeString& appendTo) const;
00354
00365 UnicodeString& format( int32_t number,
00366 UnicodeString& appendTo) const;
00367
00378 UnicodeString& format( int64_t number,
00379 UnicodeString& appendTo) const;
00380
00393 virtual UnicodeString& format(double number,
00394 UnicodeString& appendTo,
00395 FieldPosition& pos) const = 0;
00410 virtual UnicodeString& format(double number,
00411 UnicodeString& appendTo,
00412 FieldPosition& pos,
00413 UErrorCode &status) const;
00428 virtual UnicodeString& format(double number,
00429 UnicodeString& appendTo,
00430 FieldPositionIterator* posIter,
00431 UErrorCode& status) const;
00444 virtual UnicodeString& format(int32_t number,
00445 UnicodeString& appendTo,
00446 FieldPosition& pos) const = 0;
00447
00461 virtual UnicodeString& format(int32_t number,
00462 UnicodeString& appendTo,
00463 FieldPosition& pos,
00464 UErrorCode &status) const;
00465
00480 virtual UnicodeString& format(int32_t number,
00481 UnicodeString& appendTo,
00482 FieldPositionIterator* posIter,
00483 UErrorCode& status) const;
00497 virtual UnicodeString& format(int64_t number,
00498 UnicodeString& appendTo,
00499 FieldPosition& pos) const;
00500
00515 virtual UnicodeString& format(int64_t number,
00516 UnicodeString& appendTo,
00517 FieldPosition& pos,
00518 UErrorCode& status) const;
00533 virtual UnicodeString& format(int64_t number,
00534 UnicodeString& appendTo,
00535 FieldPositionIterator* posIter,
00536 UErrorCode& status) const;
00537
00554 virtual UnicodeString& format(StringPiece number,
00555 UnicodeString& appendTo,
00556 FieldPositionIterator* posIter,
00557 UErrorCode& status) const;
00558 public:
00576 virtual UnicodeString& format(const DigitList &number,
00577 UnicodeString& appendTo,
00578 FieldPositionIterator* posIter,
00579 UErrorCode& status) const;
00580
00598 virtual UnicodeString& format(const DigitList &number,
00599 UnicodeString& appendTo,
00600 FieldPosition& pos,
00601 UErrorCode& status) const;
00602
00603 public:
00604
00624 virtual void parse(const UnicodeString& text,
00625 Formattable& result,
00626 ParsePosition& parsePosition) const = 0;
00627
00641 virtual void parse(const UnicodeString& text,
00642 Formattable& result,
00643 UErrorCode& status) const;
00644
00664 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00665 ParsePosition& pos) const;
00666
00678 UBool isParseIntegerOnly(void) const;
00679
00687 virtual void setParseIntegerOnly(UBool value);
00688
00696 virtual void setLenient(UBool enable);
00697
00706 virtual UBool isLenient(void) const;
00707
00713 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00714
00721 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00722 UErrorCode&);
00723
00732 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00733 UNumberFormatStyle style,
00734 UErrorCode& errorCode);
00735
00736 #ifndef U_HIDE_INTERNAL_API
00737
00743 static NumberFormat* internalCreateInstance(
00744 const Locale& desiredLocale,
00745 UNumberFormatStyle style,
00746 UErrorCode& errorCode);
00747
00755 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00756 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00757
00758 #endif
00759
00764 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00765
00771 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00772 UErrorCode&);
00773
00778 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00779
00785 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00786 UErrorCode&);
00787
00792 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00793
00799 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00800 UErrorCode&);
00801
00807 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00808
00809 #if !UCONFIG_NO_SERVICE
00810
00820 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00821
00834 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00835
00842 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00843 #endif
00844
00854 UBool isGroupingUsed(void) const;
00855
00862 virtual void setGroupingUsed(UBool newValue);
00863
00872 int32_t getMaximumIntegerDigits(void) const;
00873
00886 virtual void setMaximumIntegerDigits(int32_t newValue);
00887
00896 int32_t getMinimumIntegerDigits(void) const;
00897
00908 virtual void setMinimumIntegerDigits(int32_t newValue);
00909
00918 int32_t getMaximumFractionDigits(void) const;
00919
00930 virtual void setMaximumFractionDigits(int32_t newValue);
00931
00940 int32_t getMinimumFractionDigits(void) const;
00941
00952 virtual void setMinimumFractionDigits(int32_t newValue);
00953
00966 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
00967
00975 const char16_t* getCurrency() const;
00976
00986 virtual void setContext(UDisplayContext value, UErrorCode& status);
00987
00998 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
00999
01006 virtual ERoundingMode getRoundingMode(void) const;
01007
01013 virtual void setRoundingMode(ERoundingMode roundingMode);
01014
01015 public:
01016
01025 static UClassID U_EXPORT2 getStaticClassID(void);
01026
01038 virtual UClassID getDynamicClassID(void) const = 0;
01039
01040 protected:
01041
01046 NumberFormat();
01047
01052 NumberFormat(const NumberFormat&);
01053
01058 NumberFormat& operator=(const NumberFormat&);
01059
01068 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
01069
01070 #ifndef U_HIDE_INTERNAL_API
01071
01077 static NumberFormat* makeInstance(const Locale& desiredLocale,
01078 UNumberFormatStyle style,
01079 UBool mustBeDecimalFormat,
01080 UErrorCode& errorCode);
01081 #endif
01082
01083 private:
01084
01085 static UBool isStyleSupported(UNumberFormatStyle style);
01086
01094 static NumberFormat* makeInstance(const Locale& desiredLocale,
01095 UNumberFormatStyle style,
01096 UErrorCode& errorCode);
01097
01098 UBool fGroupingUsed;
01099 int32_t fMaxIntegerDigits;
01100 int32_t fMinIntegerDigits;
01101 int32_t fMaxFractionDigits;
01102 int32_t fMinFractionDigits;
01103
01104 protected:
01106 static const int32_t gDefaultMaxIntegerDigits;
01108 static const int32_t gDefaultMinIntegerDigits;
01109
01110 private:
01111 UBool fParseIntegerOnly;
01112 UBool fLenient;
01113
01114
01115 char16_t fCurrency[4];
01116
01117 UDisplayContext fCapitalizationContext;
01118
01119 friend class ICUNumberFormatFactory;
01120 friend class ICUNumberFormatService;
01121 friend class ::NumberFormatTest;
01122 };
01123
01124 #if !UCONFIG_NO_SERVICE
01125
01133 class U_I18N_API NumberFormatFactory : public UObject {
01134 public:
01135
01140 virtual ~NumberFormatFactory();
01141
01148 virtual UBool visible(void) const = 0;
01149
01155 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01156
01164 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01165 };
01166
01171 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01172 protected:
01177 const UBool _visible;
01178
01183 UnicodeString _id;
01184
01185 public:
01189 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01190
01194 virtual ~SimpleNumberFormatFactory();
01195
01199 virtual UBool visible(void) const;
01200
01204 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01205 };
01206 #endif
01207
01208
01209
01210 inline UBool
01211 NumberFormat::isParseIntegerOnly() const
01212 {
01213 return fParseIntegerOnly;
01214 }
01215
01216 inline UBool
01217 NumberFormat::isLenient() const
01218 {
01219 return fLenient;
01220 }
01221
01222 U_NAMESPACE_END
01223
01224 #endif
01225
01226 #endif // _NUMFMT
01227