00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #ifdef U_INT64_T_UNAVAILABLE
00012 #define U_HAVE_RBNF 0
00013 #else
00014 #define U_HAVE_RBNF 1
00015
00016 #include "unicode/coll.h"
00017 #include "unicode/dcfmtsym.h"
00018 #include "unicode/fmtable.h"
00019 #include "unicode/locid.h"
00020 #include "unicode/numfmt.h"
00021 #include "unicode/unistr.h"
00022 #include "unicode/utypes.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
00540 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00541
00545 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00546
00550 virtual ~RuleBasedNumberFormat();
00551
00556 virtual Format* clone(void) const;
00557
00562 virtual UBool operator==(const Format& other) const;
00563
00564
00565
00566
00567
00573 virtual UnicodeString getRules() const;
00574
00582 virtual UnicodeString getRuleSetName(int32_t index) const;
00583
00589 virtual int32_t getNumberOfRuleSetNames() const;
00590
00599 virtual UnicodeString& format(int32_t number,
00600 UnicodeString& toAppendTo,
00601 FieldPosition& pos) const;
00602
00611 virtual UnicodeString& format(int64_t number,
00612 UnicodeString& toAppendTo,
00613 FieldPosition& pos) const;
00622 virtual UnicodeString& format(double number,
00623 UnicodeString& toAppendTo,
00624 FieldPosition& pos) const;
00625
00637 virtual UnicodeString& format(int32_t number,
00638 const UnicodeString& ruleSetName,
00639 UnicodeString& toAppendTo,
00640 FieldPosition& pos,
00641 UErrorCode& status) const;
00653 virtual UnicodeString& format(int64_t number,
00654 const UnicodeString& ruleSetName,
00655 UnicodeString& toAppendTo,
00656 FieldPosition& pos,
00657 UErrorCode& status) const;
00669 virtual UnicodeString& format(double number,
00670 const UnicodeString& ruleSetName,
00671 UnicodeString& toAppendTo,
00672 FieldPosition& pos,
00673 UErrorCode& status) const;
00674
00684 virtual UnicodeString& format(const Formattable& obj,
00685 UnicodeString& toAppendTo,
00686 FieldPosition& pos,
00687 UErrorCode& status) const;
00692 UnicodeString& format(const Formattable& obj,
00693 UnicodeString& result,
00694 UErrorCode& status) const;
00695
00700 UnicodeString& format(double number,
00701 UnicodeString& output) const;
00702
00707 UnicodeString& format(int32_t number,
00708 UnicodeString& output) const;
00709
00724 virtual void parse(const UnicodeString& text,
00725 Formattable& result,
00726 ParsePosition& parsePosition) const;
00727
00728
00733 virtual inline void parse(const UnicodeString& text,
00734 Formattable& result,
00735 UErrorCode& status) const;
00736
00737
00771 virtual void setLenient(UBool enabled);
00772
00780 virtual inline UBool isLenient(void) const;
00781
00782 private:
00783 void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00784 void dispose();
00785 void stripWhitespace(UnicodeString& src);
00786 void setDefaultRuleSet();
00787 void format(double number, NFRuleSet& ruleSet);
00788 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00789
00790
00791 friend class NFSubstitution;
00792 friend class NFRule;
00793 friend class FractionalPartSubstitution;
00794
00795 inline NFRuleSet * getDefaultRuleSet() const;
00796 Collator * getCollator() const;
00797 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00798
00799 private:
00800 static const char fgClassID;
00801
00802 public:
00803 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00804 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00805
00806 private:
00807 NFRuleSet **ruleSets;
00808 NFRuleSet *defaultRuleSet;
00809 Locale locale;
00810 Collator* collator;
00811 DecimalFormatSymbols* decimalFormatSymbols;
00812 UBool lenient;
00813 UnicodeString* lenientParseRules;
00814 };
00815
00816
00817
00818 inline UnicodeString&
00819 RuleBasedNumberFormat::format(const Formattable& obj,
00820 UnicodeString& result,
00821 UErrorCode& status) const
00822 {
00823
00824
00825
00826
00827
00828 return NumberFormat::format(obj, result, status);
00829 }
00830
00831 inline UnicodeString&
00832 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00833 FieldPosition pos(0);
00834 return format(number, output, pos);
00835 }
00836
00837 inline UnicodeString&
00838 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00839 FieldPosition pos(0);
00840 return format(number, output, pos);
00841 }
00842
00843 inline void
00844 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00845 {
00846 NumberFormat::parse(text, result, status);
00847 }
00848
00849 inline UBool
00850 RuleBasedNumberFormat::isLenient(void) const {
00851 return lenient;
00852 }
00853
00854 inline NFRuleSet*
00855 RuleBasedNumberFormat::getDefaultRuleSet() const {
00856 return defaultRuleSet;
00857 }
00858
00859 U_NAMESPACE_END
00860
00861
00862 #endif
00863
00864
00865 #endif