00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #include "unicode/utypes.h"
00012 #ifdef U_INT64_T_UNAVAILABLE
00013 #define U_HAVE_RBNF 0
00014 #else
00015 #define U_HAVE_RBNF 1
00016
00017 #include "unicode/coll.h"
00018 #include "unicode/dcfmtsym.h"
00019 #include "unicode/fmtable.h"
00020 #include "unicode/locid.h"
00021 #include "unicode/numfmt.h"
00022 #include "unicode/unistr.h"
00023
00024 U_NAMESPACE_BEGIN
00025
00026 class NFRuleSet;
00027
00029 enum URBNFRuleSetTag {
00030 URBNF_SPELLOUT,
00031 URBNF_ORDINAL,
00032 URBNF_DURATION,
00033 URBNF_COUNT
00034 };
00035
00493 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00494 public:
00495
00496
00497
00498
00499
00515 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00516 UParseError& perror, UErrorCode& status);
00517
00531 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00532
00533
00534
00535
00536
00541 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00542
00547 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00548
00552 virtual ~RuleBasedNumberFormat();
00553
00559 virtual Format* clone(void) const;
00560
00567 virtual UBool operator==(const Format& other) const;
00568
00569
00570
00571
00572
00578 virtual UnicodeString getRules() const;
00579
00587 virtual UnicodeString getRuleSetName(int32_t index) const;
00588
00594 virtual int32_t getNumberOfRuleSetNames() const;
00595
00604 virtual UnicodeString& format(int32_t number,
00605 UnicodeString& toAppendTo,
00606 FieldPosition& pos) const;
00607
00616 virtual UnicodeString& format(int64_t number,
00617 UnicodeString& toAppendTo,
00618 FieldPosition& pos) const;
00627 virtual UnicodeString& format(double number,
00628 UnicodeString& toAppendTo,
00629 FieldPosition& pos) const;
00630
00642 virtual UnicodeString& format(int32_t number,
00643 const UnicodeString& ruleSetName,
00644 UnicodeString& toAppendTo,
00645 FieldPosition& pos,
00646 UErrorCode& status) const;
00658 virtual UnicodeString& format(int64_t number,
00659 const UnicodeString& ruleSetName,
00660 UnicodeString& toAppendTo,
00661 FieldPosition& pos,
00662 UErrorCode& status) const;
00674 virtual UnicodeString& format(double number,
00675 const UnicodeString& ruleSetName,
00676 UnicodeString& toAppendTo,
00677 FieldPosition& pos,
00678 UErrorCode& status) const;
00679
00689 virtual UnicodeString& format(const Formattable& obj,
00690 UnicodeString& toAppendTo,
00691 FieldPosition& pos,
00692 UErrorCode& status) const;
00701 UnicodeString& format(const Formattable& obj,
00702 UnicodeString& result,
00703 UErrorCode& status) const;
00704
00712 UnicodeString& format(double number,
00713 UnicodeString& output) const;
00714
00722 UnicodeString& format(int32_t number,
00723 UnicodeString& output) const;
00724
00739 virtual void parse(const UnicodeString& text,
00740 Formattable& result,
00741 ParsePosition& parsePosition) const;
00742
00743
00751 virtual inline void parse(const UnicodeString& text,
00752 Formattable& result,
00753 UErrorCode& status) const;
00754
00755
00789 virtual void setLenient(UBool enabled);
00790
00798 virtual inline UBool isLenient(void) const;
00799
00806 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00807
00808 private:
00809 void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00810 void dispose();
00811 void stripWhitespace(UnicodeString& src);
00812 void initDefaultRuleSet();
00813 void format(double number, NFRuleSet& ruleSet);
00814 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00815
00816
00817 friend class NFSubstitution;
00818 friend class NFRule;
00819 friend class FractionalPartSubstitution;
00820
00821 inline NFRuleSet * getDefaultRuleSet() const;
00822 Collator * getCollator() const;
00823 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00824
00825 private:
00826 static const char fgClassID;
00827
00828 public:
00829 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00830 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00831
00832 private:
00833 NFRuleSet **ruleSets;
00834 NFRuleSet *defaultRuleSet;
00835 Locale locale;
00836 Collator* collator;
00837 DecimalFormatSymbols* decimalFormatSymbols;
00838 UBool lenient;
00839 UnicodeString* lenientParseRules;
00840 };
00841
00842
00843
00844 inline UnicodeString&
00845 RuleBasedNumberFormat::format(const Formattable& obj,
00846 UnicodeString& result,
00847 UErrorCode& status) const
00848 {
00849
00850
00851
00852
00853
00854 return NumberFormat::format(obj, result, status);
00855 }
00856
00857 inline UnicodeString&
00858 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00859 FieldPosition pos(0);
00860 return format(number, output, pos);
00861 }
00862
00863 inline UnicodeString&
00864 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00865 FieldPosition pos(0);
00866 return format(number, output, pos);
00867 }
00868
00869 inline void
00870 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00871 {
00872 NumberFormat::parse(text, result, status);
00873 }
00874
00875 inline UBool
00876 RuleBasedNumberFormat::isLenient(void) const {
00877 return lenient;
00878 }
00879
00880 inline NFRuleSet*
00881 RuleBasedNumberFormat::getDefaultRuleSet() const {
00882 return defaultRuleSet;
00883 }
00884
00885 U_NAMESPACE_END
00886
00887
00888 #endif
00889
00890
00891 #endif