00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef RBNF_H
00011 #define RBNF_H
00012
00013 #include "unicode/utypes.h"
00014
00015 #if U_SHOW_CPLUSPLUS_API
00016
00029 #if UCONFIG_NO_FORMATTING
00030 #define U_HAVE_RBNF 0
00031 #else
00032 #define U_HAVE_RBNF 1
00033
00034 #include "unicode/dcfmtsym.h"
00035 #include "unicode/fmtable.h"
00036 #include "unicode/locid.h"
00037 #include "unicode/numfmt.h"
00038 #include "unicode/unistr.h"
00039 #include "unicode/strenum.h"
00040 #include "unicode/brkiter.h"
00041 #include "unicode/upluralrules.h"
00042
00043 U_NAMESPACE_BEGIN
00044
00045 class NFRule;
00046 class NFRuleSet;
00047 class LocalizationInfo;
00048 class PluralFormat;
00049 class RuleBasedCollator;
00050
00056 enum URBNFRuleSetTag {
00057 URBNF_SPELLOUT,
00058 URBNF_ORDINAL,
00059 URBNF_DURATION,
00060 URBNF_NUMBERING_SYSTEM,
00061 #ifndef U_HIDE_DEPRECATED_API
00062
00066 URBNF_COUNT
00067 #endif // U_HIDE_DEPRECATED_API
00068 };
00069
00562 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00563 public:
00564
00565
00566
00567
00568
00579 RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00580
00604 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00605 UParseError& perror, UErrorCode& status);
00606
00622 RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00623 UParseError& perror, UErrorCode& status);
00624
00651 RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00652 const Locale& locale, UParseError& perror, UErrorCode& status);
00653
00669 RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00670
00671
00672
00673
00674
00680 RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00681
00687 RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00688
00693 virtual ~RuleBasedNumberFormat();
00694
00701 virtual RuleBasedNumberFormat* clone() const;
00702
00710 virtual UBool operator==(const Format& other) const;
00711
00712
00713
00714
00715
00721 virtual UnicodeString getRules() const;
00722
00728 virtual int32_t getNumberOfRuleSetNames() const;
00729
00737 virtual UnicodeString getRuleSetName(int32_t index) const;
00738
00744 virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00745
00754 virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00755
00769 virtual UnicodeString getRuleSetDisplayName(int32_t index,
00770 const Locale& locale = Locale::getDefault());
00771
00780 virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00781 const Locale& locale = Locale::getDefault());
00782
00783
00784 using NumberFormat::format;
00785
00794 virtual UnicodeString& format(int32_t number,
00795 UnicodeString& toAppendTo,
00796 FieldPosition& pos) const;
00797
00806 virtual UnicodeString& format(int64_t number,
00807 UnicodeString& toAppendTo,
00808 FieldPosition& pos) const;
00817 virtual UnicodeString& format(double number,
00818 UnicodeString& toAppendTo,
00819 FieldPosition& pos) const;
00820
00832 virtual UnicodeString& format(int32_t number,
00833 const UnicodeString& ruleSetName,
00834 UnicodeString& toAppendTo,
00835 FieldPosition& pos,
00836 UErrorCode& status) const;
00848 virtual UnicodeString& format(int64_t number,
00849 const UnicodeString& ruleSetName,
00850 UnicodeString& toAppendTo,
00851 FieldPosition& pos,
00852 UErrorCode& status) const;
00864 virtual UnicodeString& format(double number,
00865 const UnicodeString& ruleSetName,
00866 UnicodeString& toAppendTo,
00867 FieldPosition& pos,
00868 UErrorCode& status) const;
00869
00870 protected:
00888 virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00889 UnicodeString& appendTo,
00890 FieldPosition& pos,
00891 UErrorCode& status) const;
00892 public:
00893
00894 using NumberFormat::parse;
00895
00910 virtual void parse(const UnicodeString& text,
00911 Formattable& result,
00912 ParsePosition& parsePosition) const;
00913
00914 #if !UCONFIG_NO_COLLATION
00915
00949 virtual void setLenient(UBool enabled);
00950
00958 virtual inline UBool isLenient(void) const;
00959
00960 #endif
00961
00970 virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00971
00978 virtual UnicodeString getDefaultRuleSetName() const;
00979
00990 virtual void setContext(UDisplayContext value, UErrorCode& status);
00991
00997 virtual ERoundingMode getRoundingMode(void) const;
00998
01004 virtual void setRoundingMode(ERoundingMode roundingMode);
01005
01006 public:
01012 static UClassID U_EXPORT2 getStaticClassID(void);
01013
01019 virtual UClassID getDynamicClassID(void) const;
01020
01029 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01030
01040 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01041
01042 private:
01043 RuleBasedNumberFormat();
01044
01045
01046
01047 RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
01048 const Locale& locale, UParseError& perror, UErrorCode& status);
01049
01050 void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
01051 void initCapitalizationContextInfo(const Locale& thelocale);
01052 void dispose();
01053 void stripWhitespace(UnicodeString& src);
01054 void initDefaultRuleSet();
01055 NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
01056
01057
01058 friend class NFSubstitution;
01059 friend class NFRule;
01060 friend class NFRuleSet;
01061 friend class FractionalPartSubstitution;
01062
01063 inline NFRuleSet * getDefaultRuleSet() const;
01064 const RuleBasedCollator * getCollator() const;
01065 DecimalFormatSymbols * initializeDecimalFormatSymbols(UErrorCode &status);
01066 const DecimalFormatSymbols * getDecimalFormatSymbols() const;
01067 NFRule * initializeDefaultInfinityRule(UErrorCode &status);
01068 const NFRule * getDefaultInfinityRule() const;
01069 NFRule * initializeDefaultNaNRule(UErrorCode &status);
01070 const NFRule * getDefaultNaNRule() const;
01071 PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const;
01072 UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const;
01073 UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const;
01074 void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const;
01075
01076 private:
01077 NFRuleSet **fRuleSets;
01078 UnicodeString* ruleSetDescriptions;
01079 int32_t numRuleSets;
01080 NFRuleSet *defaultRuleSet;
01081 Locale locale;
01082 RuleBasedCollator* collator;
01083 DecimalFormatSymbols* decimalFormatSymbols;
01084 NFRule *defaultInfinityRule;
01085 NFRule *defaultNaNRule;
01086 ERoundingMode fRoundingMode;
01087 UBool lenient;
01088 UnicodeString* lenientParseRules;
01089 LocalizationInfo* localizations;
01090 UnicodeString originalDescription;
01091 UBool capitalizationInfoSet;
01092 UBool capitalizationForUIListMenu;
01093 UBool capitalizationForStandAlone;
01094 BreakIterator* capitalizationBrkIter;
01095 };
01096
01097
01098
01099 #if !UCONFIG_NO_COLLATION
01100
01101 inline UBool
01102 RuleBasedNumberFormat::isLenient(void) const {
01103 return lenient;
01104 }
01105
01106 #endif
01107
01108 inline NFRuleSet*
01109 RuleBasedNumberFormat::getDefaultRuleSet() const {
01110 return defaultRuleSet;
01111 }
01112
01113 U_NAMESPACE_END
01114
01115
01116 #endif
01117
01118 #endif
01119
01120
01121 #endif