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
00560 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00561 public:
00562
00563
00564
00565
00566
00577 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00578
00602 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00603 UParseError& perror, UErrorCode& status);
00604
00620 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00621 UParseError& perror, UErrorCode& status);
00622
00649 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00650 const Locale& locale, UParseError& perror, UErrorCode& status);
00651
00667 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00668
00669
00670
00671
00672
00678 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00679
00685 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00686
00691 virtual ~RuleBasedNumberFormat();
00692
00699 virtual Format* clone(void) const;
00700
00708 virtual UBool operator==(const Format& other) const;
00709
00710
00711
00712
00713
00719 virtual UnicodeString getRules() const;
00720
00726 virtual int32_t getNumberOfRuleSetNames() const;
00727
00735 virtual UnicodeString getRuleSetName(int32_t index) const;
00736
00742 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00743
00752 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00753
00767 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00768 const Locale& locale = Locale::getDefault());
00769
00778 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00779 const Locale& locale = Locale::getDefault());
00780
00781
00782 using NumberFormat::format;
00783
00792 virtual UnicodeString& format(int32_t number,
00793 UnicodeString& toAppendTo,
00794 FieldPosition& pos) const;
00795
00804 virtual UnicodeString& format(int64_t number,
00805 UnicodeString& toAppendTo,
00806 FieldPosition& pos) const;
00815 virtual UnicodeString& format(double number,
00816 UnicodeString& toAppendTo,
00817 FieldPosition& pos) const;
00818
00830 virtual UnicodeString& format(int32_t number,
00831 const UnicodeString& ruleSetName,
00832 UnicodeString& toAppendTo,
00833 FieldPosition& pos,
00834 UErrorCode& status) const;
00846 virtual UnicodeString& format(int64_t number,
00847 const UnicodeString& ruleSetName,
00848 UnicodeString& toAppendTo,
00849 FieldPosition& pos,
00850 UErrorCode& status) const;
00862 virtual UnicodeString& format(double number,
00863 const UnicodeString& ruleSetName,
00864 UnicodeString& toAppendTo,
00865 FieldPosition& pos,
00866 UErrorCode& status) const;
00867
00868 protected:
00886 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00887 UnicodeString& appendTo,
00888 FieldPositionIterator* posIter,
00889 UErrorCode& status) const;
00890
00908 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00909 UnicodeString& appendTo,
00910 FieldPosition& pos,
00911 UErrorCode& status) const;
00912 public:
00913
00914 using NumberFormat::parse;
00915
00930 virtual void parse(const UnicodeString& text,
00931 Formattable& result,
00932 ParsePosition& parsePosition) const;
00933
00934 #if !UCONFIG_NO_COLLATION
00935
00969 virtual void setLenient(UBool enabled);
00970
00978 virtual inline UBool isLenient(void) const;
00979
00980 #endif
00981
00990 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00991
00998 virtual UnicodeString getDefaultRuleSetName() const;
00999
01010 virtual void setContext(UDisplayContext value, UErrorCode& status);
01011
01017 virtual ERoundingMode getRoundingMode(void) const;
01018
01024 virtual void setRoundingMode(ERoundingMode roundingMode);
01025
01026 public:
01032 static UClassID U_EXPORT2 getStaticClassID(void);
01033
01039 virtual UClassID getDynamicClassID(void) const;
01040
01049 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01050
01060 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01061
01062 private:
01063 RuleBasedNumberFormat();
01064
01065
01066
01067 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
01068 const Locale& locale, UParseError& perror, UErrorCode& status);
01069
01070 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
01071 void initCapitalizationContextInfo(const Locale& thelocale);
01072 void dispose();
01073 void stripWhitespace(UnicodeString& src);
01074 void initDefaultRuleSet();
01075 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
01076
01077
01078 friend class NFSubstitution;
01079 friend class NFRule;
01080 friend class NFRuleSet;
01081 friend class FractionalPartSubstitution;
01082
01083 inline NFRuleSet * getDefaultRuleSet() const;
01084 const RuleBasedCollator * getCollator() const;
01085 DecimalFormatSymbols * initializeDecimalFormatSymbols(UErrorCode &status);
01086 const DecimalFormatSymbols * getDecimalFormatSymbols() const;
01087 NFRule * initializeDefaultInfinityRule(UErrorCode &status);
01088 const NFRule * getDefaultInfinityRule() const;
01089 NFRule * initializeDefaultNaNRule(UErrorCode &status);
01090 const NFRule * getDefaultNaNRule() const;
01091 PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const;
01092 UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const;
01093 UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const;
01094 void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const;
01095
01096 private:
01097 NFRuleSet **fRuleSets;
01098 UnicodeString* ruleSetDescriptions;
01099 int32_t numRuleSets;
01100 NFRuleSet *defaultRuleSet;
01101 Locale locale;
01102 RuleBasedCollator* collator;
01103 DecimalFormatSymbols* decimalFormatSymbols;
01104 NFRule *defaultInfinityRule;
01105 NFRule *defaultNaNRule;
01106 ERoundingMode fRoundingMode;
01107 UBool lenient;
01108 UnicodeString* lenientParseRules;
01109 LocalizationInfo* localizations;
01110 UnicodeString originalDescription;
01111 UBool capitalizationInfoSet;
01112 UBool capitalizationForUIListMenu;
01113 UBool capitalizationForStandAlone;
01114 BreakIterator* capitalizationBrkIter;
01115 };
01116
01117
01118
01119 #if !UCONFIG_NO_COLLATION
01120
01121 inline UBool
01122 RuleBasedNumberFormat::isLenient(void) const {
01123 return lenient;
01124 }
01125
01126 #endif
01127
01128 inline NFRuleSet*
01129 RuleBasedNumberFormat::getDefaultRuleSet() const {
01130 return defaultRuleSet;
01131 }
01132
01133 U_NAMESPACE_END
01134
01135
01136 #endif
01137
01138
01139 #endif