ICU 73.2  73.2
rbnf.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /*
00004 *******************************************************************************
00005 * Copyright (C) 1997-2015, International Business Machines Corporation and others.
00006 * All Rights Reserved.
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 {
00061     URBNF_SPELLOUT,
00066     URBNF_ORDINAL,
00071     URBNF_DURATION,
00078     URBNF_NUMBERING_SYSTEM,
00079 #ifndef U_HIDE_DEPRECATED_API
00080 
00084     URBNF_COUNT
00085 #endif  // U_HIDE_DEPRECATED_API
00086 };
00087 
00580 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00581 public:
00582 
00583   //-----------------------------------------------------------------------
00584   // constructors
00585   //-----------------------------------------------------------------------
00586 
00597     RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00598 
00622     RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00623                         UParseError& perror, UErrorCode& status);
00624 
00640   RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00641                         UParseError& perror, UErrorCode& status);
00642 
00669     RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00670                         const Locale& locale, UParseError& perror, UErrorCode& status);
00671 
00690   RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00691 
00692   //-----------------------------------------------------------------------
00693   // boilerplate
00694   //-----------------------------------------------------------------------
00695 
00701   RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00702 
00708   RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00709 
00714   virtual ~RuleBasedNumberFormat();
00715 
00722   virtual RuleBasedNumberFormat* clone() const override;
00723 
00731   virtual bool operator==(const Format& other) const override;
00732 
00733 //-----------------------------------------------------------------------
00734 // public API functions
00735 //-----------------------------------------------------------------------
00736 
00742   virtual UnicodeString getRules() const;
00743 
00749   virtual int32_t getNumberOfRuleSetNames() const;
00750 
00758   virtual UnicodeString getRuleSetName(int32_t index) const;
00759 
00765   virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00766 
00775   virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00776 
00790   virtual UnicodeString getRuleSetDisplayName(int32_t index,
00791                           const Locale& locale = Locale::getDefault());
00792 
00801   virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00802                           const Locale& locale = Locale::getDefault());
00803 
00804 
00805   using NumberFormat::format;
00806 
00815   virtual UnicodeString& format(int32_t number,
00816                                 UnicodeString& toAppendTo,
00817                                 FieldPosition& pos) const override;
00818 
00827   virtual UnicodeString& format(int64_t number,
00828                                 UnicodeString& toAppendTo,
00829                                 FieldPosition& pos) const override;
00838   virtual UnicodeString& format(double number,
00839                                 UnicodeString& toAppendTo,
00840                                 FieldPosition& pos) const override;
00841 
00853   virtual UnicodeString& format(int32_t number,
00854                                 const UnicodeString& ruleSetName,
00855                                 UnicodeString& toAppendTo,
00856                                 FieldPosition& pos,
00857                                 UErrorCode& status) const;
00869   virtual UnicodeString& format(int64_t number,
00870                                 const UnicodeString& ruleSetName,
00871                                 UnicodeString& toAppendTo,
00872                                 FieldPosition& pos,
00873                                 UErrorCode& status) const;
00885   virtual UnicodeString& format(double number,
00886                                 const UnicodeString& ruleSetName,
00887                                 UnicodeString& toAppendTo,
00888                                 FieldPosition& pos,
00889                                 UErrorCode& status) const;
00890 
00891 protected:
00909     virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
00910                                   UnicodeString& appendTo,
00911                                   FieldPosition& pos,
00912                                   UErrorCode& status) const override;
00913 public:
00914 
00915   using NumberFormat::parse;
00916 
00931   virtual void parse(const UnicodeString& text,
00932                      Formattable& result,
00933                      ParsePosition& parsePosition) const override;
00934 
00935 #if !UCONFIG_NO_COLLATION
00936 
00970   virtual void setLenient(UBool enabled) override;
00971 
00979   virtual inline UBool isLenient(void) const override;
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) override;
01012 
01018     virtual ERoundingMode getRoundingMode(void) const override;
01019 
01025     virtual void setRoundingMode(ERoundingMode roundingMode) override;
01026 
01027 public:
01033     static UClassID U_EXPORT2 getStaticClassID(void);
01034 
01040     virtual UClassID getDynamicClassID(void) const override;
01041 
01050     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01051 
01061     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01062 
01063 private:
01064     RuleBasedNumberFormat() = delete; // default constructor not implemented
01065 
01066     // this will ref the localizations if they are not nullptr
01067     // caller must deref to get adoption
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     /* friend access */
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 **fRuleSets;
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 fRoundingMode;
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 /* U_HAVE_RBNF */
01137 #endif
01138 
01139 #endif /* U_SHOW_CPLUSPLUS_API */
01140 
01141 /* RBNF_H */
01142 #endif