00001
00002
00003
00004
00005
00006
00007 #ifndef RBNF_H
00008 #define RBNF_H
00009
00010 #include "unicode/coll.h"
00011 #include "unicode/dcfmtsym.h"
00012 #include "unicode/fmtable.h"
00013 #include "unicode/locid.h"
00014 #include "unicode/numfmt.h"
00015 #include "unicode/unistr.h"
00016 #include "unicode/utypes.h"
00017
00018 U_NAMESPACE_BEGIN
00019
00020 class NFRuleSet;
00021
00023 enum URBNFRuleSetTag {
00024 URBNF_SPELLOUT,
00025 URBNF_ORDINAL,
00026 URBNF_DURATION,
00027 URBNF_COUNT
00028 };
00029
00487 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00488 public:
00489
00490
00491
00492
00493
00509 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00510 UParseError& perror, UErrorCode& status);
00511
00525 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00526
00527
00528
00529
00530
00534 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00535
00539 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00540
00544 virtual ~RuleBasedNumberFormat();
00545
00550 virtual Format* clone(void) const;
00551
00556 virtual UBool operator==(const Format& other) const;
00557
00558
00559
00560
00561
00567 virtual UnicodeString getRules() const;
00568
00576 virtual UnicodeString getRuleSetName(int32_t index) const;
00577
00583 virtual int32_t getNumberOfRuleSetNames() const;
00584
00593 virtual UnicodeString& format(int32_t number,
00594 UnicodeString& toAppendTo,
00595 FieldPosition& pos) const;
00604 virtual UnicodeString& format(double number,
00605 UnicodeString& toAppendTo,
00606 FieldPosition& pos) const;
00607
00619 virtual UnicodeString& format(int32_t number,
00620 const UnicodeString& ruleSetName,
00621 UnicodeString& toAppendTo,
00622 FieldPosition& pos,
00623 UErrorCode& status) const;
00635 virtual UnicodeString& format(double number,
00636 const UnicodeString& ruleSetName,
00637 UnicodeString& toAppendTo,
00638 FieldPosition& pos,
00639 UErrorCode& status) const;
00640
00650 virtual UnicodeString& format(const Formattable& obj,
00651 UnicodeString& toAppendTo,
00652 FieldPosition& pos,
00653 UErrorCode& status) const;
00658 UnicodeString& format(const Formattable& obj,
00659 UnicodeString& result,
00660 UErrorCode& status) const;
00661
00666 UnicodeString& format(double number,
00667 UnicodeString& output) const;
00668
00673 UnicodeString& format(int32_t number,
00674 UnicodeString& output) const;
00675
00690 virtual void parse(const UnicodeString& text,
00691 Formattable& result,
00692 ParsePosition& parsePosition) const;
00693
00694
00699 virtual inline void parse(const UnicodeString& text,
00700 Formattable& result,
00701 UErrorCode& status) const;
00702
00703
00737 virtual void setLenient(UBool enabled);
00738
00746 virtual inline UBool isLenient(void) const;
00747
00748 private:
00749 void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00750 void dispose();
00751 void stripWhitespace(UnicodeString& src);
00752 void setDefaultRuleSet();
00753 void format(double number, NFRuleSet& ruleSet);
00754 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00755
00756
00757 friend class NFSubstitution;
00758 friend class NFRule;
00759 friend class FractionalPartSubstitution;
00760
00761 inline NFRuleSet * getDefaultRuleSet() const;
00762 Collator * getCollator() const;
00763 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00764
00765 private:
00766 static const char fgClassID;
00767
00768 public:
00769 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00770 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00771
00772 private:
00773 NFRuleSet **ruleSets;
00774 NFRuleSet *defaultRuleSet;
00775 Locale locale;
00776 Collator* collator;
00777 DecimalFormatSymbols* decimalFormatSymbols;
00778 UBool lenient;
00779 UnicodeString* lenientParseRules;
00780 };
00781
00782
00783
00784 inline UnicodeString&
00785 RuleBasedNumberFormat::format(const Formattable& obj,
00786 UnicodeString& result,
00787 UErrorCode& status) const
00788 {
00789
00790
00791
00792
00793
00794 return NumberFormat::format(obj, result, status);
00795 }
00796
00797 inline UnicodeString&
00798 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00799 FieldPosition pos(0);
00800 return format(number, output, pos);
00801 }
00802
00803 inline UnicodeString&
00804 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00805 FieldPosition pos(0);
00806 return format(number, output, pos);
00807 }
00808
00809 inline void
00810 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00811 {
00812 NumberFormat::parse(text, result, status);
00813 }
00814
00815 inline UBool
00816 RuleBasedNumberFormat::isLenient(void) const {
00817 return lenient;
00818 }
00819
00820 inline NFRuleSet*
00821 RuleBasedNumberFormat::getDefaultRuleSet() const {
00822 return defaultRuleSet;
00823 }
00824
00825 U_NAMESPACE_END
00826
00827
00828 #endif