00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #include "unicode/utypes.h"
00012
00025 #if UCONFIG_NO_FORMATTING
00026 #define U_HAVE_RBNF 0
00027 #else
00028 #define U_HAVE_RBNF 1
00029
00030 #include "unicode/coll.h"
00031 #include "unicode/dcfmtsym.h"
00032 #include "unicode/fmtable.h"
00033 #include "unicode/locid.h"
00034 #include "unicode/numfmt.h"
00035 #include "unicode/unistr.h"
00036 #include "unicode/strenum.h"
00037
00038 U_NAMESPACE_BEGIN
00039
00040 class NFRuleSet;
00041 class LocalizationInfo;
00042
00048 enum URBNFRuleSetTag {
00049 URBNF_SPELLOUT,
00050 URBNF_ORDINAL,
00051 URBNF_DURATION,
00052 URBNF_NUMBERING_SYSTEM,
00053 URBNF_COUNT
00054 };
00055
00056 #if UCONFIG_NO_COLLATION
00057 class Collator;
00058 #endif
00059
00503 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00504 public:
00505
00506
00507
00508
00509
00520 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00521
00545 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00546 UParseError& perror, UErrorCode& status);
00547
00563 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00564 UParseError& perror, UErrorCode& status);
00565
00592 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00593 const Locale& locale, UParseError& perror, UErrorCode& status);
00594
00610 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00611
00612
00613
00614
00615
00621 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00622
00628 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00629
00634 virtual ~RuleBasedNumberFormat();
00635
00642 virtual Format* clone(void) const;
00643
00651 virtual UBool operator==(const Format& other) const;
00652
00653
00654
00655
00656
00662 virtual UnicodeString getRules() const;
00663
00669 virtual int32_t getNumberOfRuleSetNames() const;
00670
00678 virtual UnicodeString getRuleSetName(int32_t index) const;
00679
00685 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00686
00695 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00696
00710 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00711 const Locale& locale = Locale::getDefault());
00712
00721 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00722 const Locale& locale = Locale::getDefault());
00723
00724
00725 using NumberFormat::format;
00726
00735 virtual UnicodeString& format(int32_t number,
00736 UnicodeString& toAppendTo,
00737 FieldPosition& pos) const;
00738
00747 virtual UnicodeString& format(int64_t number,
00748 UnicodeString& toAppendTo,
00749 FieldPosition& pos) const;
00758 virtual UnicodeString& format(double number,
00759 UnicodeString& toAppendTo,
00760 FieldPosition& pos) const;
00761
00773 virtual UnicodeString& format(int32_t number,
00774 const UnicodeString& ruleSetName,
00775 UnicodeString& toAppendTo,
00776 FieldPosition& pos,
00777 UErrorCode& status) const;
00789 virtual UnicodeString& format(int64_t number,
00790 const UnicodeString& ruleSetName,
00791 UnicodeString& toAppendTo,
00792 FieldPosition& pos,
00793 UErrorCode& status) const;
00805 virtual UnicodeString& format(double number,
00806 const UnicodeString& ruleSetName,
00807 UnicodeString& toAppendTo,
00808 FieldPosition& pos,
00809 UErrorCode& status) const;
00810
00820 virtual UnicodeString& format(const Formattable& obj,
00821 UnicodeString& toAppendTo,
00822 FieldPosition& pos,
00823 UErrorCode& status) const;
00832 UnicodeString& format(const Formattable& obj,
00833 UnicodeString& result,
00834 UErrorCode& status) const;
00835
00843 UnicodeString& format(double number,
00844 UnicodeString& output) const;
00845
00853 UnicodeString& format(int32_t number,
00854 UnicodeString& output) const;
00855
00870 virtual void parse(const UnicodeString& text,
00871 Formattable& result,
00872 ParsePosition& parsePosition) const;
00873
00874
00882 virtual inline void parse(const UnicodeString& text,
00883 Formattable& result,
00884 UErrorCode& status) const;
00885
00886 #if !UCONFIG_NO_COLLATION
00887
00921 virtual void setLenient(UBool enabled);
00922
00930 virtual inline UBool isLenient(void) const;
00931
00932 #endif
00933
00942 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00943
00950 virtual UnicodeString getDefaultRuleSetName() const;
00951
00952 public:
00958 static UClassID U_EXPORT2 getStaticClassID(void);
00959
00965 virtual UClassID getDynamicClassID(void) const;
00966
00967 private:
00968 RuleBasedNumberFormat();
00969
00970
00971
00972 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
00973 const Locale& locale, UParseError& perror, UErrorCode& status);
00974
00975 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
00976 void dispose();
00977 void stripWhitespace(UnicodeString& src);
00978 void initDefaultRuleSet();
00979 void format(double number, NFRuleSet& ruleSet);
00980 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00981
00982
00983 friend class NFSubstitution;
00984 friend class NFRule;
00985 friend class FractionalPartSubstitution;
00986
00987 inline NFRuleSet * getDefaultRuleSet() const;
00988 Collator * getCollator() const;
00989 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00990
00991 private:
00992 NFRuleSet **ruleSets;
00993 NFRuleSet *defaultRuleSet;
00994 Locale locale;
00995 Collator* collator;
00996 DecimalFormatSymbols* decimalFormatSymbols;
00997 UBool lenient;
00998 UnicodeString* lenientParseRules;
00999 LocalizationInfo* localizations;
01000
01001
01002
01003 UBool noParse;
01004 };
01005
01006
01007
01008 inline UnicodeString&
01009 RuleBasedNumberFormat::format(const Formattable& obj,
01010 UnicodeString& result,
01011 UErrorCode& status) const
01012 {
01013
01014
01015
01016
01017
01018 return NumberFormat::format(obj, result, status);
01019 }
01020
01021 inline UnicodeString&
01022 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
01023 FieldPosition pos(0);
01024 return format(number, output, pos);
01025 }
01026
01027 inline UnicodeString&
01028 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
01029 FieldPosition pos(0);
01030 return format(number, output, pos);
01031 }
01032
01033 inline void
01034 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
01035 {
01036 NumberFormat::parse(text, result, status);
01037 }
01038
01039 #if !UCONFIG_NO_COLLATION
01040
01041 inline UBool
01042 RuleBasedNumberFormat::isLenient(void) const {
01043 return lenient;
01044 }
01045
01046 #endif
01047
01048 inline NFRuleSet*
01049 RuleBasedNumberFormat::getDefaultRuleSet() const {
01050 return defaultRuleSet;
01051 }
01052
01053 U_NAMESPACE_END
01054
01055
01056 #endif
01057
01058
01059 #endif