00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RBNF_H
00009 #define RBNF_H
00010
00011 #include "unicode/utypes.h"
00012
00025 #if UCONFIG_NO_FORMATTING
00026 #define U_HAVE_RBNF 0
00027 #else
00028 #define U_HAVE_RBNF 1
00029
00030 #include "unicode/dcfmtsym.h"
00031 #include "unicode/fmtable.h"
00032 #include "unicode/locid.h"
00033 #include "unicode/numfmt.h"
00034 #include "unicode/unistr.h"
00035 #include "unicode/strenum.h"
00036 #include "unicode/brkiter.h"
00037 #include "unicode/upluralrules.h"
00038
00039 U_NAMESPACE_BEGIN
00040
00041 class NFRule;
00042 class NFRuleSet;
00043 class LocalizationInfo;
00044 class PluralFormat;
00045 class RuleBasedCollator;
00046
00052 enum URBNFRuleSetTag {
00053 URBNF_SPELLOUT,
00054 URBNF_ORDINAL,
00055 URBNF_DURATION,
00056 URBNF_NUMBERING_SYSTEM,
00057 URBNF_COUNT
00058 };
00059
00553 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00554 public:
00555
00556
00557
00558
00559
00570 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00571
00595 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00596 UParseError& perror, UErrorCode& status);
00597
00613 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00614 UParseError& perror, UErrorCode& status);
00615
00642 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00643 const Locale& locale, UParseError& perror, UErrorCode& status);
00644
00660 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00661
00662
00663
00664
00665
00671 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00672
00678 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00679
00684 virtual ~RuleBasedNumberFormat();
00685
00692 virtual Format* clone(void) const;
00693
00701 virtual UBool operator==(const Format& other) const;
00702
00703
00704
00705
00706
00712 virtual UnicodeString getRules() const;
00713
00719 virtual int32_t getNumberOfRuleSetNames() const;
00720
00728 virtual UnicodeString getRuleSetName(int32_t index) const;
00729
00735 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00736
00745 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00746
00760 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00761 const Locale& locale = Locale::getDefault());
00762
00771 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00772 const Locale& locale = Locale::getDefault());
00773
00774
00775 using NumberFormat::format;
00776
00785 virtual UnicodeString& format(int32_t number,
00786 UnicodeString& toAppendTo,
00787 FieldPosition& pos) const;
00788
00797 virtual UnicodeString& format(int64_t number,
00798 UnicodeString& toAppendTo,
00799 FieldPosition& pos) const;
00808 virtual UnicodeString& format(double number,
00809 UnicodeString& toAppendTo,
00810 FieldPosition& pos) const;
00811
00823 virtual UnicodeString& format(int32_t number,
00824 const UnicodeString& ruleSetName,
00825 UnicodeString& toAppendTo,
00826 FieldPosition& pos,
00827 UErrorCode& status) const;
00839 virtual UnicodeString& format(int64_t number,
00840 const UnicodeString& ruleSetName,
00841 UnicodeString& toAppendTo,
00842 FieldPosition& pos,
00843 UErrorCode& status) const;
00855 virtual UnicodeString& format(double number,
00856 const UnicodeString& ruleSetName,
00857 UnicodeString& toAppendTo,
00858 FieldPosition& pos,
00859 UErrorCode& status) const;
00860
00861 using NumberFormat::parse;
00862
00877 virtual void parse(const UnicodeString& text,
00878 Formattable& result,
00879 ParsePosition& parsePosition) const;
00880
00881 #if !UCONFIG_NO_COLLATION
00882
00916 virtual void setLenient(UBool enabled);
00917
00925 virtual inline UBool isLenient(void) const;
00926
00927 #endif
00928
00937 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00938
00945 virtual UnicodeString getDefaultRuleSetName() const;
00946
00957 virtual void setContext(UDisplayContext value, UErrorCode& status);
00958
00959 public:
00965 static UClassID U_EXPORT2 getStaticClassID(void);
00966
00972 virtual UClassID getDynamicClassID(void) const;
00973
00982 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00983
00993 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00994
00995 private:
00996 RuleBasedNumberFormat();
00997
00998
00999
01000 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
01001 const Locale& locale, UParseError& perror, UErrorCode& status);
01002
01003 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
01004 void initCapitalizationContextInfo(const Locale& thelocale);
01005 void dispose();
01006 void stripWhitespace(UnicodeString& src);
01007 void initDefaultRuleSet();
01008 void format(double number, NFRuleSet& ruleSet);
01009 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
01010
01011
01012 friend class NFSubstitution;
01013 friend class NFRule;
01014 friend class NFRuleSet;
01015 friend class FractionalPartSubstitution;
01016
01017 inline NFRuleSet * getDefaultRuleSet() const;
01018 const RuleBasedCollator * getCollator() const;
01019 DecimalFormatSymbols * initializeDecimalFormatSymbols(UErrorCode &status);
01020 const DecimalFormatSymbols * getDecimalFormatSymbols() const;
01021 NFRule * initializeDefaultInfinityRule(UErrorCode &status);
01022 const NFRule * getDefaultInfinityRule() const;
01023 NFRule * initializeDefaultNaNRule(UErrorCode &status);
01024 const NFRule * getDefaultNaNRule() const;
01025 PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const;
01026 UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult) const;
01027
01028 private:
01029 NFRuleSet **ruleSets;
01030 UnicodeString* ruleSetDescriptions;
01031 int32_t numRuleSets;
01032 NFRuleSet *defaultRuleSet;
01033 Locale locale;
01034 RuleBasedCollator* collator;
01035 DecimalFormatSymbols* decimalFormatSymbols;
01036 NFRule *defaultInfinityRule;
01037 NFRule *defaultNaNRule;
01038 UBool lenient;
01039 UnicodeString* lenientParseRules;
01040 LocalizationInfo* localizations;
01041 UnicodeString originalDescription;
01042 UBool capitalizationInfoSet;
01043 UBool capitalizationForUIListMenu;
01044 UBool capitalizationForStandAlone;
01045 BreakIterator* capitalizationBrkIter;
01046 };
01047
01048
01049
01050 #if !UCONFIG_NO_COLLATION
01051
01052 inline UBool
01053 RuleBasedNumberFormat::isLenient(void) const {
01054 return lenient;
01055 }
01056
01057 #endif
01058
01059 inline NFRuleSet*
01060 RuleBasedNumberFormat::getDefaultRuleSet() const {
01061 return defaultRuleSet;
01062 }
01063
01064 U_NAMESPACE_END
01065
01066
01067 #endif
01068
01069
01070 #endif