00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef NUMFMT_H
00022 #define NUMFMT_H
00023
00024
00025 #include "unicode/utypes.h"
00026
00032 #if !UCONFIG_NO_FORMATTING
00033
00034 #include "unicode/unistr.h"
00035 #include "unicode/format.h"
00036 #include "unicode/unum.h"
00037 #include "unicode/locid.h"
00038 #include "unicode/stringpiece.h"
00039 #include "unicode/curramt.h"
00040
00041 class NumberFormatTest;
00042
00043 U_NAMESPACE_BEGIN
00044
00045 #if !UCONFIG_NO_SERVICE
00046 class NumberFormatFactory;
00047 class StringEnumeration;
00048 #endif
00049
00166 class U_I18N_API NumberFormat : public Format {
00167 public:
00183 enum EAlignmentFields {
00185 kIntegerField = UNUM_INTEGER_FIELD,
00187 kFractionField = UNUM_FRACTION_FIELD,
00189 kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
00191 kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
00193 kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
00195 kExponentField = UNUM_EXPONENT_FIELD,
00197 kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
00199 kCurrencyField = UNUM_CURRENCY_FIELD,
00201 kPercentField = UNUM_PERCENT_FIELD,
00203 kPermillField = UNUM_PERMILL_FIELD,
00205 kSignField = UNUM_SIGN_FIELD,
00206
00212 INTEGER_FIELD = UNUM_INTEGER_FIELD,
00214 FRACTION_FIELD = UNUM_FRACTION_FIELD
00215 };
00216
00221 virtual ~NumberFormat();
00222
00229 virtual UBool operator==(const Format& other) const;
00230
00231
00232 using Format::format;
00233
00249 virtual UnicodeString& format(const Formattable& obj,
00250 UnicodeString& appendTo,
00251 FieldPosition& pos,
00252 UErrorCode& status) const;
00253
00270 virtual UnicodeString& format(const Formattable& obj,
00271 UnicodeString& appendTo,
00272 FieldPositionIterator* posIter,
00273 UErrorCode& status) const;
00274
00303 virtual void parseObject(const UnicodeString& source,
00304 Formattable& result,
00305 ParsePosition& parse_pos) const;
00306
00317 UnicodeString& format( double number,
00318 UnicodeString& appendTo) const;
00319
00330 UnicodeString& format( int32_t number,
00331 UnicodeString& appendTo) const;
00332
00343 UnicodeString& format( int64_t number,
00344 UnicodeString& appendTo) const;
00345
00358 virtual UnicodeString& format(double number,
00359 UnicodeString& appendTo,
00360 FieldPosition& pos) const = 0;
00375 virtual UnicodeString& format(double number,
00376 UnicodeString& appendTo,
00377 FieldPosition& pos,
00378 UErrorCode &status) const;
00393 virtual UnicodeString& format(double number,
00394 UnicodeString& appendTo,
00395 FieldPositionIterator* posIter,
00396 UErrorCode& status) const;
00409 virtual UnicodeString& format(int32_t number,
00410 UnicodeString& appendTo,
00411 FieldPosition& pos) const = 0;
00412
00426 virtual UnicodeString& format(int32_t number,
00427 UnicodeString& appendTo,
00428 FieldPosition& pos,
00429 UErrorCode &status) const;
00430
00445 virtual UnicodeString& format(int32_t number,
00446 UnicodeString& appendTo,
00447 FieldPositionIterator* posIter,
00448 UErrorCode& status) const;
00462 virtual UnicodeString& format(int64_t number,
00463 UnicodeString& appendTo,
00464 FieldPosition& pos) const;
00465
00479 virtual UnicodeString& format(int64_t number,
00480 UnicodeString& appendTo,
00481 FieldPosition& pos,
00482 UErrorCode& status) const;
00497 virtual UnicodeString& format(int64_t number,
00498 UnicodeString& appendTo,
00499 FieldPositionIterator* posIter,
00500 UErrorCode& status) const;
00501
00518 virtual UnicodeString& format(const StringPiece &number,
00519 UnicodeString& appendTo,
00520 FieldPositionIterator* posIter,
00521 UErrorCode& status) const;
00522 public:
00540 virtual UnicodeString& format(const DigitList &number,
00541 UnicodeString& appendTo,
00542 FieldPositionIterator* posIter,
00543 UErrorCode& status) const;
00544
00562 virtual UnicodeString& format(const DigitList &number,
00563 UnicodeString& appendTo,
00564 FieldPosition& pos,
00565 UErrorCode& status) const;
00566
00567 public:
00568
00579 UnicodeString& format(const Formattable& obj,
00580 UnicodeString& appendTo,
00581 UErrorCode& status) const;
00582
00602 virtual void parse(const UnicodeString& text,
00603 Formattable& result,
00604 ParsePosition& parsePosition) const = 0;
00605
00619 virtual void parse(const UnicodeString& text,
00620 Formattable& result,
00621 UErrorCode& status) const;
00622
00623
00643 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
00644 ParsePosition& pos) const;
00645
00657 UBool isParseIntegerOnly(void) const;
00658
00666 virtual void setParseIntegerOnly(UBool value);
00667
00675 virtual void setLenient(UBool enable);
00676
00685 virtual UBool isLenient(void) const;
00686
00695 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
00696
00705 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
00706 UErrorCode&);
00707
00716 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
00717 UNumberFormatStyle style,
00718 UErrorCode& errorCode);
00719
00724 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
00725
00731 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
00732 UErrorCode&);
00733
00738 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
00739
00745 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
00746 UErrorCode&);
00747
00752 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
00753
00759 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
00760 UErrorCode&);
00761
00767 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00768
00769 #if !UCONFIG_NO_SERVICE
00770
00777 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
00778
00788 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
00789
00796 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
00797 #endif
00798
00808 UBool isGroupingUsed(void) const;
00809
00816 virtual void setGroupingUsed(UBool newValue);
00817
00826 int32_t getMaximumIntegerDigits(void) const;
00827
00840 virtual void setMaximumIntegerDigits(int32_t newValue);
00841
00850 int32_t getMinimumIntegerDigits(void) const;
00851
00862 virtual void setMinimumIntegerDigits(int32_t newValue);
00863
00872 int32_t getMaximumFractionDigits(void) const;
00873
00884 virtual void setMaximumFractionDigits(int32_t newValue);
00885
00894 int32_t getMinimumFractionDigits(void) const;
00895
00906 virtual void setMinimumFractionDigits(int32_t newValue);
00907
00920 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
00921
00929 const UChar* getCurrency() const;
00930
00931 public:
00932
00941 static UClassID U_EXPORT2 getStaticClassID(void);
00942
00954 virtual UClassID getDynamicClassID(void) const = 0;
00955
00956 protected:
00957
00962 NumberFormat();
00963
00968 NumberFormat(const NumberFormat&);
00969
00974 NumberFormat& operator=(const NumberFormat&);
00975
00984 virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
00985
00986 private:
00987
00988 static UBool isStyleSupported(UNumberFormatStyle style);
00989
00997 static NumberFormat* makeInstance(const Locale& desiredLocale,
00998 UNumberFormatStyle style,
00999 UErrorCode& errorCode);
01000
01001 UBool fGroupingUsed;
01002 int32_t fMaxIntegerDigits;
01003 int32_t fMinIntegerDigits;
01004 int32_t fMaxFractionDigits;
01005 int32_t fMinFractionDigits;
01006 UBool fParseIntegerOnly;
01007 UBool fLenient;
01008
01009
01010 UChar fCurrency[4];
01011
01012 friend class ICUNumberFormatFactory;
01013 friend class ICUNumberFormatService;
01014 friend class ::NumberFormatTest;
01015 };
01016
01017 #if !UCONFIG_NO_SERVICE
01018
01026 class U_I18N_API NumberFormatFactory : public UObject {
01027 public:
01028
01033 virtual ~NumberFormatFactory();
01034
01041 virtual UBool visible(void) const = 0;
01042
01048 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
01049
01057 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
01058 };
01059
01064 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
01065 protected:
01070 const UBool _visible;
01071
01076 UnicodeString _id;
01077
01078 public:
01082 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
01083
01087 virtual ~SimpleNumberFormatFactory();
01088
01092 virtual UBool visible(void) const;
01093
01097 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
01098 };
01099 #endif
01100
01101
01102
01103 inline UBool
01104 NumberFormat::isParseIntegerOnly() const
01105 {
01106 return fParseIntegerOnly;
01107 }
01108
01109 inline UBool
01110 NumberFormat::isLenient() const
01111 {
01112 return fLenient;
01113 }
01114
01115 inline UnicodeString&
01116 NumberFormat::format(const Formattable& obj,
01117 UnicodeString& appendTo,
01118 UErrorCode& status) const {
01119 return Format::format(obj, appendTo, status);
01120 }
01121
01122 U_NAMESPACE_END
01123
01124 #endif
01125
01126 #endif // _NUMFMT
01127