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
00498 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00499 public:
00500
00501
00502
00503
00504
00520 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00521 UParseError& perror, UErrorCode& status);
00522
00536 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00537
00538
00539
00540
00541
00546 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00547
00552 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00553
00557 virtual ~RuleBasedNumberFormat();
00558
00564 virtual Format* clone(void) const;
00565
00572 virtual UBool operator==(const Format& other) const;
00573
00574
00575
00576
00577
00583 virtual UnicodeString getRules() const;
00584
00592 virtual UnicodeString getRuleSetName(int32_t index) const;
00593
00599 virtual int32_t getNumberOfRuleSetNames() const;
00600
00609 virtual UnicodeString& format(int32_t number,
00610 UnicodeString& toAppendTo,
00611 FieldPosition& pos) const;
00612
00621 virtual UnicodeString& format(int64_t number,
00622 UnicodeString& toAppendTo,
00623 FieldPosition& pos) const;
00632 virtual UnicodeString& format(double number,
00633 UnicodeString& toAppendTo,
00634 FieldPosition& pos) const;
00635
00647 virtual UnicodeString& format(int32_t number,
00648 const UnicodeString& ruleSetName,
00649 UnicodeString& toAppendTo,
00650 FieldPosition& pos,
00651 UErrorCode& status) const;
00663 virtual UnicodeString& format(int64_t number,
00664 const UnicodeString& ruleSetName,
00665 UnicodeString& toAppendTo,
00666 FieldPosition& pos,
00667 UErrorCode& status) const;
00679 virtual UnicodeString& format(double number,
00680 const UnicodeString& ruleSetName,
00681 UnicodeString& toAppendTo,
00682 FieldPosition& pos,
00683 UErrorCode& status) const;
00684
00694 virtual UnicodeString& format(const Formattable& obj,
00695 UnicodeString& toAppendTo,
00696 FieldPosition& pos,
00697 UErrorCode& status) const;
00706 UnicodeString& format(const Formattable& obj,
00707 UnicodeString& result,
00708 UErrorCode& status) const;
00709
00717 UnicodeString& format(double number,
00718 UnicodeString& output) const;
00719
00727 UnicodeString& format(int32_t number,
00728 UnicodeString& output) const;
00729
00744 virtual void parse(const UnicodeString& text,
00745 Formattable& result,
00746 ParsePosition& parsePosition) const;
00747
00748
00756 virtual inline void parse(const UnicodeString& text,
00757 Formattable& result,
00758 UErrorCode& status) const;
00759
00760 #if !UCONFIG_NO_COLLATION
00761
00795 virtual void setLenient(UBool enabled);
00796
00804 virtual inline UBool isLenient(void) const;
00805
00806 #endif
00807
00814 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00815
00816 private:
00817 void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00818 void dispose();
00819 void stripWhitespace(UnicodeString& src);
00820 void initDefaultRuleSet();
00821 void format(double number, NFRuleSet& ruleSet);
00822 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00823
00824
00825 friend class NFSubstitution;
00826 friend class NFRule;
00827 friend class FractionalPartSubstitution;
00828
00829 inline NFRuleSet * getDefaultRuleSet() const;
00830 Collator * getCollator() const;
00831 DecimalFormatSymbols * getDecimalFormatSymbols() const;
00832
00833 private:
00834 static const char fgClassID;
00835
00836 public:
00837 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00838 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00839
00840 private:
00841 NFRuleSet **ruleSets;
00842 NFRuleSet *defaultRuleSet;
00843 Locale locale;
00844 Collator* collator;
00845 DecimalFormatSymbols* decimalFormatSymbols;
00846 UBool lenient;
00847 UnicodeString* lenientParseRules;
00848 };
00849
00850
00851
00852 inline UnicodeString&
00853 RuleBasedNumberFormat::format(const Formattable& obj,
00854 UnicodeString& result,
00855 UErrorCode& status) const
00856 {
00857
00858
00859
00860
00861
00862 return NumberFormat::format(obj, result, status);
00863 }
00864
00865 inline UnicodeString&
00866 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00867 FieldPosition pos(0);
00868 return format(number, output, pos);
00869 }
00870
00871 inline UnicodeString&
00872 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00873 FieldPosition pos(0);
00874 return format(number, output, pos);
00875 }
00876
00877 inline void
00878 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00879 {
00880 NumberFormat::parse(text, result, status);
00881 }
00882
00883 #if !UCONFIG_NO_COLLATION
00884
00885 inline UBool
00886 RuleBasedNumberFormat::isLenient(void) const {
00887 return lenient;
00888 }
00889
00890 #endif
00891
00892 inline NFRuleSet*
00893 RuleBasedNumberFormat::getDefaultRuleSet() const {
00894 return defaultRuleSet;
00895 }
00896
00897 U_NAMESPACE_END
00898
00899
00900 #endif
00901
00902
00903 #endif