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,
00243 kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD,
00245 kCompactField = UNUM_COMPACT_FIELD,
00246
00252 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00254 FRACTION_FIELD = UNUM_FRACTION_FIELD
00255 };
00256
00261 virtual ~NumberFormat();
00262
00269 virtual NumberFormat* clone() const = 0;
00270
00277 virtual UBool operator==(const Format& other) const;
00278
00279
00280 using Format::format;
00281
00297 virtual UnicodeString& format(const Formattable& obj,
00298 UnicodeString& appendTo,
00299 FieldPosition& pos,
00300 UErrorCode& status) const;
00301
00318 virtual UnicodeString& format(const Formattable& obj,
00319 UnicodeString& appendTo,
00320 FieldPositionIterator* posIter,
00321 UErrorCode& status) const;
00322
00351 virtual void parseObject(const UnicodeString& source,
00352 Formattable& result,
00353 ParsePosition& parse_pos) const;
00354
00365 UnicodeString& format( double number,
00366 UnicodeString& appendTo) const;
00367
00378 UnicodeString& format( int32_t number,
00379 UnicodeString& appendTo) const;
00380
00391 UnicodeString& format( int64_t number,
00392 UnicodeString& appendTo) const;
00393
00406 virtual UnicodeString& format(double number,
00407 UnicodeString& appendTo,
00408 FieldPosition& pos) const = 0;
00423 virtual UnicodeString& format(double number,
00424 UnicodeString& appendTo,
00425 FieldPosition& pos,
00426 UErrorCode &status) const;
00441 virtual UnicodeString& format(double number,
00442 UnicodeString& appendTo,
00443 FieldPositionIterator* posIter,
00444 UErrorCode& status) const;
00457 virtual UnicodeString& format(int32_t number,
00458 UnicodeString& appendTo,
00459 FieldPosition& pos) const = 0;
00460
00474 virtual UnicodeString& format(int32_t number,
00475 UnicodeString& appendTo,
00476 FieldPosition& pos,
00477 UErrorCode &status) const;
00478
00493 virtual UnicodeString& format(int32_t number,
00494 UnicodeString& appendTo,
00495 FieldPositionIterator* posIter,
00496 UErrorCode& status) const;
00510 virtual UnicodeString& format(int64_t number,
00511 UnicodeString& appendTo,
00512 FieldPosition& pos) const;
00513
00528 virtual UnicodeString& format(int64_t number,
00529 UnicodeString& appendTo,
00530 FieldPosition& pos,
00531 UErrorCode& status) const;
00546 virtual UnicodeString& format(int64_t number,
00547 UnicodeString& appendTo,
00548 FieldPositionIterator* posIter,
00549 UErrorCode& status) const;
00550
00567 virtual UnicodeString& format(StringPiece number,
00568 UnicodeString& appendTo,
00569 FieldPositionIterator* posIter,
00570 UErrorCode& status) const;
00571
00572
00573
00591 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00592 UnicodeString& appendTo,
00593 FieldPositionIterator* posIter,
00594 UErrorCode& status) const;
00595
00613 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00614 UnicodeString& appendTo,
00615 FieldPosition& pos,
00616 UErrorCode& status) const;
00617
00637 virtual void parse(const UnicodeString& text,
00638 Formattable& result,
00639 ParsePosition& parsePosition) const = 0;
00640
00656 virtual void parse(const UnicodeString& text,
00657 Formattable& result,
00658 UErrorCode& status) const;
00659
00679 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00680 ParsePosition& pos) const;
00681
00693 UBool isParseIntegerOnly(void) const;
00694
00702 virtual void setParseIntegerOnly(UBool value);
00703
00711 virtual void setLenient(UBool enable);
00712
00721 virtual UBool isLenient(void) const;
00722
00731 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00732
00742 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00743 UErrorCode&);
00744
00756 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00757 UNumberFormatStyle style,
00758 UErrorCode& errorCode);
00759
00760 #ifndef U_HIDE_INTERNAL_API
00761
00767 static NumberFormat* internalCreateInstance(
00768 const Locale& desiredLocale,
00769 UNumberFormatStyle style,
00770 UErrorCode& errorCode);
00771
00779 static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
00780 const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
00781
00782 #endif
00783
00791 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00792
00801 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00802 UErrorCode&);
00803
00811 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00812
00821 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00822 UErrorCode&);
00823
00831 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00832
00841 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00842 UErrorCode&);
00843
00849 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00850
00851 #if !UCONFIG_NO_SERVICE
00852
00862 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00863
00876 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00877
00884 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00885 #endif
00886
00896 UBool isGroupingUsed(void) const;
00897
00904 virtual void setGroupingUsed(UBool newValue);
00905
00914 int32_t getMaximumIntegerDigits(void) const;
00915
00928 virtual void setMaximumIntegerDigits(int32_t newValue);
00929
00938 int32_t getMinimumIntegerDigits(void) const;
00939
00950 virtual void setMinimumIntegerDigits(int32_t newValue);
00951
00960 int32_t getMaximumFractionDigits(void) const;
00961
00972 virtual void setMaximumFractionDigits(int32_t newValue);
00973
00982 int32_t getMinimumFractionDigits(void) const;
00983
00994 virtual void setMinimumFractionDigits(int32_t newValue);
00995
01008 virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
01009
01017 const char16_t* getCurrency() const;
01018
01028 virtual void setContext(UDisplayContext value, UErrorCode& status);
01029
01040 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
01041
01048 virtual ERoundingMode getRoundingMode(void) const;
01049
01055 virtual void setRoundingMode(ERoundingMode roundingMode);
01056
01057 public:
01058
01067 static UClassID U_EXPORT2 getStaticClassID(void);
01068
01080 virtual UClassID getDynamicClassID(void) const = 0;
01081
01082 protected:
01083
01088 NumberFormat();
01089
01094 NumberFormat(const NumberFormat&);
01095
01100 NumberFormat& operator=(const NumberFormat&);
01101
01110 virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
01111
01112 #ifndef U_HIDE_INTERNAL_API
01113
01119 static NumberFormat* makeInstance(const Locale& desiredLocale,
01120 UNumberFormatStyle style,
01121 UBool mustBeDecimalFormat,
01122 UErrorCode& errorCode);
01123 #endif
01124
01125 private:
01126
01127 static UBool isStyleSupported(UNumberFormatStyle style);
01128
01136 static NumberFormat* makeInstance(const Locale& desiredLocale,
01137 UNumberFormatStyle style,
01138 UErrorCode& errorCode);
01139
01140 UBool fGroupingUsed;
01141 int32_t fMaxIntegerDigits;
01142 int32_t fMinIntegerDigits;
01143 int32_t fMaxFractionDigits;
01144 int32_t fMinFractionDigits;
01145
01146 protected:
01148 static const int32_t gDefaultMaxIntegerDigits;
01150 static const int32_t gDefaultMinIntegerDigits;
01151
01152 private:
01153 UBool fParseIntegerOnly;
01154 UBool fLenient;
01155
01156
01157 char16_t fCurrency[4];
01158
01159 UDisplayContext fCapitalizationContext;
01160
01161 friend class ICUNumberFormatFactory;
01162 friend class ICUNumberFormatService;
01163 friend class ::NumberFormatTest;
01164 };
01165
01166 #if !UCONFIG_NO_SERVICE
01167
01175 class U_I18N_API NumberFormatFactory : public UObject {
01176 public:
01177
01182 virtual ~NumberFormatFactory();
01183
01190 virtual UBool visible(void) const = 0;
01191
01197 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01198
01206 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01207 };
01208
01213 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01214 protected:
01219 const UBool _visible;
01220
01225 UnicodeString _id;
01226
01227 public:
01231 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01232
01236 virtual ~SimpleNumberFormatFactory();
01237
01241 virtual UBool visible(void) const;
01242
01246 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01247 };
01248 #endif
01249
01250
01251
01252 inline UBool
01253 NumberFormat::isParseIntegerOnly() const
01254 {
01255 return fParseIntegerOnly;
01256 }
01257
01258 inline UBool
01259 NumberFormat::isLenient() const
01260 {
01261 return fLenient;
01262 }
01263
01264 U_NAMESPACE_END
01265
01266 #endif
01267
01268 #endif
01269
01270 #endif // _NUMFMT
01271