00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #include "unicode/utypes.h"
00012
00020 #if defined(U_INT64_T_UNAVAILABLE) || UCONFIG_NO_FORMATTING
00021 #define U_HAVE_RBNF 0
00022 #else
00023 #define U_HAVE_RBNF 1
00024
00025 #include "unicode/coll.h"
00026 #include "unicode/dcfmtsym.h"
00027 #include "unicode/fmtable.h"
00028 #include "unicode/locid.h"
00029 #include "unicode/numfmt.h"
00030 #include "unicode/unistr.h"
00031 #include "unicode/strenum.h"
00032
00033 U_NAMESPACE_BEGIN
00034
00035 class NFRuleSet;
00036 class LocalizationInfo;
00037
00043 enum URBNFRuleSetTag {
00044 URBNF_SPELLOUT,
00045 URBNF_ORDINAL,
00046 URBNF_DURATION,
00047 URBNF_COUNT
00048 };
00049
00050 #if UCONFIG_NO_COLLATION
00051 class Collator;
00052 #endif
00053
00501 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00502 public:
00503
00504
00505
00506
00507
00518 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00519
00543 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00544 UParseError& perror, UErrorCode& status);
00545
00561 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00562 UParseError& perror, UErrorCode& status);
00563
00590 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00591 const Locale& locale, UParseError& perror, UErrorCode& status);
00592
00606 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00607
00608
00609
00610
00611
00617 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00618
00624 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00625
00630 virtual ~RuleBasedNumberFormat();
00631
00638 virtual Format* clone(void) const;
00639
00647 virtual UBool operator==(const Format& other) const;
00648
00649
00650
00651
00652
00658 virtual UnicodeString getRules() const;
00659
00665 virtual int32_t getNumberOfRuleSetNames() const;
00666
00674 virtual UnicodeString getRuleSetName(int32_t index) const;
00675
00681 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00682
00691 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00692
00706 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00707 const Locale& locale = Locale::getDefault());
00708
00717 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00718 const Locale& locale = Locale::getDefault());
00719
00728 virtual UnicodeString& format(int32_t number,
00729 UnicodeString& toAppendTo,
00730 FieldPosition& pos) const;
00731
00740 virtual UnicodeString& format(int64_t number,
00741 UnicodeString& toAppendTo,
00742 FieldPosition& pos) const;
00751 virtual UnicodeString& format(double number,
00752 UnicodeString& toAppendTo,
00753 FieldPosition& pos) const;
00754
00766 virtual UnicodeString& format(int32_t number,
00767 const UnicodeString& ruleSetName,
00768 UnicodeString& toAppendTo,
00769 FieldPosition& pos,
00770 UErrorCode& status) const;
00782 virtual UnicodeString& format(int64_t number,
00783 const UnicodeString& ruleSetName,
00784 UnicodeString& toAppendTo,
00785 FieldPosition& pos,
00786 UErrorCode& status) const;
00798 virtual UnicodeString& format(double number,
00799 const UnicodeString& ruleSetName,
00800 UnicodeString& toAppendTo,
00801 FieldPosition& pos,
00802 UErrorCode& status) const;
00803
00813 virtual UnicodeString& format(const Formattable& obj,
00814 UnicodeString& toAppendTo,
00815 FieldPosition& pos,
00816 UErrorCode& status) const;
00825 UnicodeString& format(const Formattable& obj,
00826 UnicodeString& result,
00827 UErrorCode& status) const;
00828
00836 UnicodeString& format(double number,
00837 UnicodeString& output) const;
00838
00846 UnicodeString& format(int32_t number,
00847 UnicodeString& output) const;
00848
00863 virtual void parse(const UnicodeString& text,
00864 Formattable& result,
00865 ParsePosition& parsePosition) const;
00866
00867
00875 virtual inline void parse(const UnicodeString& text,
00876 Formattable& result,
00877 UErrorCode& status) const;
00878
00879 #if !UCONFIG_NO_COLLATION
00880
00914 virtual void setLenient(UBool enabled);
00915
00923 virtual inline UBool isLenient(void) const;
00924
00925 #endif
00926
00935 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00936
00943 virtual UnicodeString getDefaultRuleSetName() const;
00944
00945 public:
00951 static UClassID U_EXPORT2 getStaticClassID(void);
00952
00958 virtual UClassID getDynamicClassID(void) const;
00959
00960 private:
00961 RuleBasedNumberFormat();
00962
00963
00964
00965 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
00966 const Locale& locale, UParseError& perror, UErrorCode& status);
00967
00968 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
00969 void dispose();
00970 void stripWhitespace(UnicodeString& src);
00971 void initDefaultRuleSet();
00972 void format(double number, NFRuleSet& ruleSet);
00973 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00974
00975
00976 friend class NFSubstitution;
00977 friend class NFRule;
00978 friend class FractionalPartSubstitution;
00979
00980 inline NFRuleSet * getDefaultRuleSet() const;
00981 Collator * getCollator() const;
00982 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00983
00984 private:
00985 NFRuleSet **ruleSets;
00986 NFRuleSet *defaultRuleSet;
00987 Locale locale;
00988 Collator* collator;
00989 DecimalFormatSymbols* decimalFormatSymbols;
00990 UBool lenient;
00991 UnicodeString* lenientParseRules;
00992 LocalizationInfo* localizations;
00993 };
00994
00995
00996
00997 inline UnicodeString&
00998 RuleBasedNumberFormat::format(const Formattable& obj,
00999 UnicodeString& result,
01000 UErrorCode& status) const
01001 {
01002
01003
01004
01005
01006
01007 return NumberFormat::format(obj, result, status);
01008 }
01009
01010 inline UnicodeString&
01011 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
01012 FieldPosition pos(0);
01013 return format(number, output, pos);
01014 }
01015
01016 inline UnicodeString&
01017 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
01018 FieldPosition pos(0);
01019 return format(number, output, pos);
01020 }
01021
01022 inline void
01023 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
01024 {
01025 NumberFormat::parse(text, result, status);
01026 }
01027
01028 #if !UCONFIG_NO_COLLATION
01029
01030 inline UBool
01031 RuleBasedNumberFormat::isLenient(void) const {
01032 return lenient;
01033 }
01034
01035 #endif
01036
01037 inline NFRuleSet*
01038 RuleBasedNumberFormat::getDefaultRuleSet() const {
01039 return defaultRuleSet;
01040 }
01041
01042 U_NAMESPACE_END
01043
01044
01045 #endif
01046
01047
01048 #endif