00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #include "unicode/utypes.h"
00012
00013 #if defined(U_INT64_T_UNAVAILABLE) || UCONFIG_NO_FORMATTING
00014 #define U_HAVE_RBNF 0
00015 #else
00016 #define U_HAVE_RBNF 1
00017
00018 #include "unicode/coll.h"
00019 #include "unicode/dcfmtsym.h"
00020 #include "unicode/fmtable.h"
00021 #include "unicode/locid.h"
00022 #include "unicode/numfmt.h"
00023 #include "unicode/unistr.h"
00024
00025 U_NAMESPACE_BEGIN
00026
00027 class NFRuleSet;
00028
00030 enum URBNFRuleSetTag {
00031 URBNF_SPELLOUT,
00032 URBNF_ORDINAL,
00033 URBNF_DURATION,
00034 URBNF_COUNT
00035 };
00036
00037 #if UCONFIG_NO_COLLATION
00038 class Collator;
00039 #endif
00040
00465 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00466 public:
00467
00468
00469
00470
00471
00487 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00488 UParseError& perror, UErrorCode& status);
00489
00503 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00504
00505
00506
00507
00508
00514 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00515
00521 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00522
00527 virtual ~RuleBasedNumberFormat();
00528
00535 virtual Format* clone(void) const;
00536
00544 virtual UBool operator==(const Format& other) const;
00545
00546
00547
00548
00549
00555 virtual UnicodeString getRules() const;
00556
00564 virtual UnicodeString getRuleSetName(int32_t index) const;
00565
00571 virtual int32_t getNumberOfRuleSetNames() const;
00572
00581 virtual UnicodeString& format(int32_t number,
00582 UnicodeString& toAppendTo,
00583 FieldPosition& pos) const;
00584
00593 virtual UnicodeString& format(int64_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(int64_t number,
00636 const UnicodeString& ruleSetName,
00637 UnicodeString& toAppendTo,
00638 FieldPosition& pos,
00639 UErrorCode& status) const;
00651 virtual UnicodeString& format(double number,
00652 const UnicodeString& ruleSetName,
00653 UnicodeString& toAppendTo,
00654 FieldPosition& pos,
00655 UErrorCode& status) const;
00656
00666 virtual UnicodeString& format(const Formattable& obj,
00667 UnicodeString& toAppendTo,
00668 FieldPosition& pos,
00669 UErrorCode& status) const;
00678 UnicodeString& format(const Formattable& obj,
00679 UnicodeString& result,
00680 UErrorCode& status) const;
00681
00689 UnicodeString& format(double number,
00690 UnicodeString& output) const;
00691
00699 UnicodeString& format(int32_t number,
00700 UnicodeString& output) const;
00701
00716 virtual void parse(const UnicodeString& text,
00717 Formattable& result,
00718 ParsePosition& parsePosition) const;
00719
00720
00728 virtual inline void parse(const UnicodeString& text,
00729 Formattable& result,
00730 UErrorCode& status) const;
00731
00732 #if !UCONFIG_NO_COLLATION
00733
00767 virtual void setLenient(UBool enabled);
00768
00776 virtual inline UBool isLenient(void) const;
00777
00778 #endif
00779
00788 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00789
00790 private:
00791 RuleBasedNumberFormat();
00792
00793 void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00794 void dispose();
00795 void stripWhitespace(UnicodeString& src);
00796 void initDefaultRuleSet();
00797 void format(double number, NFRuleSet& ruleSet);
00798 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00799
00800
00801 friend class NFSubstitution;
00802 friend class NFRule;
00803 friend class FractionalPartSubstitution;
00804
00805 inline NFRuleSet * getDefaultRuleSet() const;
00806 Collator * getCollator() const;
00807 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00808
00809 private:
00810 static const char fgClassID;
00811
00812 public:
00813 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00814 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00815
00816 private:
00817 NFRuleSet **ruleSets;
00818 NFRuleSet *defaultRuleSet;
00819 Locale locale;
00820 Collator* collator;
00821 DecimalFormatSymbols* decimalFormatSymbols;
00822 UBool lenient;
00823 UnicodeString* lenientParseRules;
00824 };
00825
00826
00827
00828 inline UnicodeString&
00829 RuleBasedNumberFormat::format(const Formattable& obj,
00830 UnicodeString& result,
00831 UErrorCode& status) const
00832 {
00833
00834
00835
00836
00837
00838 return NumberFormat::format(obj, result, status);
00839 }
00840
00841 inline UnicodeString&
00842 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00843 FieldPosition pos(0);
00844 return format(number, output, pos);
00845 }
00846
00847 inline UnicodeString&
00848 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00849 FieldPosition pos(0);
00850 return format(number, output, pos);
00851 }
00852
00853 inline void
00854 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00855 {
00856 NumberFormat::parse(text, result, status);
00857 }
00858
00859 #if !UCONFIG_NO_COLLATION
00860
00861 inline UBool
00862 RuleBasedNumberFormat::isLenient(void) const {
00863 return lenient;
00864 }
00865
00866 #endif
00867
00868 inline NFRuleSet*
00869 RuleBasedNumberFormat::getDefaultRuleSet() const {
00870 return defaultRuleSet;
00871 }
00872
00873 U_NAMESPACE_END
00874
00875
00876 #endif
00877
00878
00879 #endif