00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef RBNF_H
00011 #define RBNF_H
00012
00013 #include "unicode/utypes.h"
00014
00027 #if UCONFIG_NO_FORMATTING
00028 #define U_HAVE_RBNF 0
00029 #else
00030 #define U_HAVE_RBNF 1
00031
00032 #include "unicode/dcfmtsym.h"
00033 #include "unicode/fmtable.h"
00034 #include "unicode/locid.h"
00035 #include "unicode/numfmt.h"
00036 #include "unicode/unistr.h"
00037 #include "unicode/strenum.h"
00038 #include "unicode/brkiter.h"
00039 #include "unicode/upluralrules.h"
00040
00041 U_NAMESPACE_BEGIN
00042
00043 class NFRule;
00044 class NFRuleSet;
00045 class LocalizationInfo;
00046 class PluralFormat;
00047 class RuleBasedCollator;
00048
00054 enum URBNFRuleSetTag {
00055 URBNF_SPELLOUT,
00056 URBNF_ORDINAL,
00057 URBNF_DURATION,
00058 URBNF_NUMBERING_SYSTEM,
00059 #ifndef U_HIDE_DEPRECATED_API
00060
00064 URBNF_COUNT
00065 #endif // U_HIDE_DEPRECATED_API
00066 };
00067
00561 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00562 public:
00563
00564
00565
00566
00567
00578 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00579
00603 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00604 UParseError& perror, UErrorCode& status);
00605
00621 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00622 UParseError& perror, UErrorCode& status);
00623
00650 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00651 const Locale& locale, UParseError& perror, UErrorCode& status);
00652
00668 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00669
00670
00671
00672
00673
00679 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00680
00686 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00687
00692 virtual ~RuleBasedNumberFormat();
00693
00700 virtual Format* clone(void) const;
00701
00709 virtual UBool operator==(const Format& other) const;
00710
00711
00712
00713
00714
00720 virtual UnicodeString getRules() const;
00721
00727 virtual int32_t getNumberOfRuleSetNames() const;
00728
00736 virtual UnicodeString getRuleSetName(int32_t index) const;
00737
00743 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00744
00753 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00754
00768 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00769 const Locale& locale = Locale::getDefault());
00770
00779 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00780 const Locale& locale = Locale::getDefault());
00781
00782
00783 using NumberFormat::format;
00784
00793 virtual UnicodeString& format(int32_t number,
00794 UnicodeString& toAppendTo,
00795 FieldPosition& pos) const;
00796
00805 virtual UnicodeString& format(int64_t number,
00806 UnicodeString& toAppendTo,
00807 FieldPosition& pos) const;
00816 virtual UnicodeString& format(double number,
00817 UnicodeString& toAppendTo,
00818 FieldPosition& pos) const;
00819
00831 virtual UnicodeString& format(int32_t number,
00832 const UnicodeString& ruleSetName,
00833 UnicodeString& toAppendTo,
00834 FieldPosition& pos,
00835 UErrorCode& status) const;
00847 virtual UnicodeString& format(int64_t number,
00848 const UnicodeString& ruleSetName,
00849 UnicodeString& toAppendTo,
00850 FieldPosition& pos,
00851 UErrorCode& status) const;
00863 virtual UnicodeString& format(double number,
00864 const UnicodeString& ruleSetName,
00865 UnicodeString& toAppendTo,
00866 FieldPosition& pos,
00867 UErrorCode& status) const;
00868
00869 protected:
00887 virtual UnicodeString& format(const DigitList &number,
00888 UnicodeString& appendTo,
00889 FieldPositionIterator* posIter,
00890 UErrorCode& status) const;
00891
00909 virtual UnicodeString& format(const DigitList &number,
00910 UnicodeString& appendTo,
00911 FieldPosition& pos,
00912 UErrorCode& status) const;
00913 public:
00914
00915 using NumberFormat::parse;
00916
00931 virtual void parse(const UnicodeString& text,
00932 Formattable& result,
00933 ParsePosition& parsePosition) const;
00934
00935 #if !UCONFIG_NO_COLLATION
00936
00970 virtual void setLenient(UBool enabled);
00971
00979 virtual inline UBool isLenient(void) const;
00980
00981 #endif
00982
00991 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00992
00999 virtual UnicodeString getDefaultRuleSetName() const;
01000
01011 virtual void setContext(UDisplayContext value, UErrorCode& status);
01012
01018 virtual ERoundingMode getRoundingMode(void) const;
01019
01025 virtual void setRoundingMode(ERoundingMode roundingMode);
01026
01027 public:
01033 static UClassID U_EXPORT2 getStaticClassID(void);
01034
01040 virtual UClassID getDynamicClassID(void) const;
01041
01050 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01051
01061 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01062
01063 private:
01064 RuleBasedNumberFormat();
01065
01066
01067
01068 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
01069 const Locale& locale, UParseError& perror, UErrorCode& status);
01070
01071 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
01072 void initCapitalizationContextInfo(const Locale& thelocale);
01073 void dispose();
01074 void stripWhitespace(UnicodeString& src);
01075 void initDefaultRuleSet();
01076 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
01077
01078
01079 friend class NFSubstitution;
01080 friend class NFRule;
01081 friend class NFRuleSet;
01082 friend class FractionalPartSubstitution;
01083
01084 inline NFRuleSet * getDefaultRuleSet() const;
01085 const RuleBasedCollator * getCollator() const;
01086 DecimalFormatSymbols * initializeDecimalFormatSymbols(UErrorCode &status);
01087 const DecimalFormatSymbols * getDecimalFormatSymbols() const;
01088 NFRule * initializeDefaultInfinityRule(UErrorCode &status);
01089 const NFRule * getDefaultInfinityRule() const;
01090 NFRule * initializeDefaultNaNRule(UErrorCode &status);
01091 const NFRule * getDefaultNaNRule() const;
01092 PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const;
01093 UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const;
01094 UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const;
01095 void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const;
01096
01097 private:
01098 NFRuleSet **ruleSets;
01099 UnicodeString* ruleSetDescriptions;
01100 int32_t numRuleSets;
01101 NFRuleSet *defaultRuleSet;
01102 Locale locale;
01103 RuleBasedCollator* collator;
01104 DecimalFormatSymbols* decimalFormatSymbols;
01105 NFRule *defaultInfinityRule;
01106 NFRule *defaultNaNRule;
01107 ERoundingMode roundingMode;
01108 UBool lenient;
01109 UnicodeString* lenientParseRules;
01110 LocalizationInfo* localizations;
01111 UnicodeString originalDescription;
01112 UBool capitalizationInfoSet;
01113 UBool capitalizationForUIListMenu;
01114 UBool capitalizationForStandAlone;
01115 BreakIterator* capitalizationBrkIter;
01116 };
01117
01118
01119
01120 #if !UCONFIG_NO_COLLATION
01121
01122 inline UBool
01123 RuleBasedNumberFormat::isLenient(void) const {
01124 return lenient;
01125 }
01126
01127 #endif
01128
01129 inline NFRuleSet*
01130 RuleBasedNumberFormat::getDefaultRuleSet() const {
01131 return defaultRuleSet;
01132 }
01133
01134 U_NAMESPACE_END
01135
01136
01137 #endif
01138
01139
01140 #endif