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
00975 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00976
00986 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00987
00988 private:
00989 RuleBasedNumberFormat();
00990
00991
00992
00993 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
00994 const Locale& locale, UParseError& perror, UErrorCode& status);
00995
00996 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
00997 void dispose();
00998 void stripWhitespace(UnicodeString& src);
00999 void initDefaultRuleSet();
01000 void format(double number, NFRuleSet& ruleSet);
01001 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
01002
01003
01004 friend class NFSubstitution;
01005 friend class NFRule;
01006 friend class FractionalPartSubstitution;
01007
01008 inline NFRuleSet * getDefaultRuleSet() const;
01009 Collator * getCollator() const;
01010 DecimalFormatSymbols * getDecimalFormatSymbols() const;
01011
01012 private:
01013 NFRuleSet **ruleSets;
01014 UnicodeString* ruleSetDescriptions;
01015 int32_t numRuleSets;
01016 NFRuleSet *defaultRuleSet;
01017 Locale locale;
01018 Collator* collator;
01019 DecimalFormatSymbols* decimalFormatSymbols;
01020 UBool lenient;
01021 UnicodeString* lenientParseRules;
01022 LocalizationInfo* localizations;
01023 };
01024
01025
01026
01027 inline UnicodeString&
01028 RuleBasedNumberFormat::format(const Formattable& obj,
01029 UnicodeString& result,
01030 UErrorCode& status) const
01031 {
01032
01033
01034
01035
01036
01037 return NumberFormat::format(obj, result, status);
01038 }
01039
01040 inline UnicodeString&
01041 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
01042 FieldPosition pos(0);
01043 return format(number, output, pos);
01044 }
01045
01046 inline UnicodeString&
01047 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
01048 FieldPosition pos(0);
01049 return format(number, output, pos);
01050 }
01051
01052 inline void
01053 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
01054 {
01055 NumberFormat::parse(text, result, status);
01056 }
01057
01058 #if !UCONFIG_NO_COLLATION
01059
01060 inline UBool
01061 RuleBasedNumberFormat::isLenient(void) const {
01062 return lenient;
01063 }
01064
01065 #endif
01066
01067 inline NFRuleSet*
01068 RuleBasedNumberFormat::getDefaultRuleSet() const {
01069 return defaultRuleSet;
01070 }
01071
01072 U_NAMESPACE_END
01073
01074
01075 #endif
01076
01077
01078 #endif