ICU 4.8.1.1  4.8.1.1
rbnf.h
Go to the documentation of this file.
00001 /*
00002 *******************************************************************************
00003 * Copyright (C) 1997-2010, International Business Machines Corporation and others.
00004 * All Rights Reserved.
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/coll.h"
00031 #include "unicode/dcfmtsym.h"
00032 #include "unicode/fmtable.h"
00033 #include "unicode/locid.h"
00034 #include "unicode/numfmt.h"
00035 #include "unicode/unistr.h"
00036 #include "unicode/strenum.h"
00037 
00038 U_NAMESPACE_BEGIN
00039 
00040 class NFRuleSet;
00041 class LocalizationInfo;
00042 
00048 enum URBNFRuleSetTag {
00049     URBNF_SPELLOUT,
00050     URBNF_ORDINAL,
00051     URBNF_DURATION,
00052     URBNF_NUMBERING_SYSTEM,
00053     URBNF_COUNT
00054 };
00055 
00056 #if UCONFIG_NO_COLLATION
00057 class Collator;
00058 #endif
00059 
00503 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00504 public:
00505 
00506   //-----------------------------------------------------------------------
00507   // constructors
00508   //-----------------------------------------------------------------------
00509 
00520     RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00521 
00545     RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00546                         UParseError& perror, UErrorCode& status);
00547 
00563   RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale,
00564                         UParseError& perror, UErrorCode& status);
00565 
00592     RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations,
00593                         const Locale& locale, UParseError& perror, UErrorCode& status);
00594 
00610   RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00611 
00612   //-----------------------------------------------------------------------
00613   // boilerplate
00614   //-----------------------------------------------------------------------
00615 
00621   RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00622 
00628   RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00629 
00634   virtual ~RuleBasedNumberFormat();
00635 
00642   virtual Format* clone(void) const;
00643 
00651   virtual UBool operator==(const Format& other) const;
00652 
00653 //-----------------------------------------------------------------------
00654 // public API functions
00655 //-----------------------------------------------------------------------
00656 
00662   virtual UnicodeString getRules() const;
00663 
00669   virtual int32_t getNumberOfRuleSetNames() const;
00670 
00678   virtual UnicodeString getRuleSetName(int32_t index) const;
00679 
00685   virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const;
00686 
00695   virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const;
00696 
00710   virtual UnicodeString getRuleSetDisplayName(int32_t index,
00711                           const Locale& locale = Locale::getDefault());
00712 
00721   virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName,
00722                           const Locale& locale = Locale::getDefault());
00723 
00724 
00725   using NumberFormat::format;
00726 
00735   virtual UnicodeString& format(int32_t number,
00736                                 UnicodeString& toAppendTo,
00737                                 FieldPosition& pos) const;
00738 
00747   virtual UnicodeString& format(int64_t number,
00748                                 UnicodeString& toAppendTo,
00749                                 FieldPosition& pos) const;
00758   virtual UnicodeString& format(double number,
00759                                 UnicodeString& toAppendTo,
00760                                 FieldPosition& pos) const;
00761 
00773   virtual UnicodeString& format(int32_t number,
00774                                 const UnicodeString& ruleSetName,
00775                                 UnicodeString& toAppendTo,
00776                                 FieldPosition& pos,
00777                                 UErrorCode& status) const;
00789   virtual UnicodeString& format(int64_t number,
00790                                 const UnicodeString& ruleSetName,
00791                                 UnicodeString& toAppendTo,
00792                                 FieldPosition& pos,
00793                                 UErrorCode& status) const;
00805   virtual UnicodeString& format(double number,
00806                                 const UnicodeString& ruleSetName,
00807                                 UnicodeString& toAppendTo,
00808                                 FieldPosition& pos,
00809                                 UErrorCode& status) const;
00810 
00820   virtual UnicodeString& format(const Formattable& obj,
00821                                 UnicodeString& toAppendTo,
00822                                 FieldPosition& pos,
00823                                 UErrorCode& status) const;
00832   UnicodeString& format(const Formattable& obj,
00833                         UnicodeString& result,
00834                         UErrorCode& status) const;
00835 
00843    UnicodeString& format(double number,
00844                          UnicodeString& output) const;
00845 
00853    UnicodeString& format(int32_t number,
00854                          UnicodeString& output) const;
00855 
00870   virtual void parse(const UnicodeString& text,
00871                      Formattable& result,
00872                      ParsePosition& parsePosition) const;
00873 
00874 
00882   virtual inline void parse(const UnicodeString& text,
00883                       Formattable& result,
00884                       UErrorCode& status) const;
00885 
00886 #if !UCONFIG_NO_COLLATION
00887 
00921   virtual void setLenient(UBool enabled);
00922 
00930   virtual inline UBool isLenient(void) const;
00931 
00932 #endif
00933 
00942   virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00943 
00950   virtual UnicodeString getDefaultRuleSetName() const;
00951 
00952 public:
00958     static UClassID U_EXPORT2 getStaticClassID(void);
00959 
00965     virtual UClassID getDynamicClassID(void) const;
00966 
00967 private:
00968     RuleBasedNumberFormat(); // default constructor not implemented
00969 
00970     // this will ref the localizations if they are not NULL
00971     // caller must deref to get adoption
00972     RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations,
00973               const Locale& locale, UParseError& perror, UErrorCode& status);
00974 
00975     void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status);
00976     void dispose();
00977     void stripWhitespace(UnicodeString& src);
00978     void initDefaultRuleSet();
00979     void format(double number, NFRuleSet& ruleSet);
00980     NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00981 
00982     /* friend access */
00983     friend class NFSubstitution;
00984     friend class NFRule;
00985     friend class FractionalPartSubstitution;
00986 
00987     inline NFRuleSet * getDefaultRuleSet() const;
00988     Collator * getCollator() const;
00989     DecimalFormatSymbols * getDecimalFormatSymbols() const;
00990 
00991 private:
00992     NFRuleSet **ruleSets;
00993     NFRuleSet *defaultRuleSet;
00994     Locale locale;
00995     Collator* collator;
00996     DecimalFormatSymbols* decimalFormatSymbols;
00997     UBool lenient;
00998     UnicodeString* lenientParseRules;
00999     LocalizationInfo* localizations;
01000 
01001     // Temporary workaround - when noParse is true, do noting in parse.
01002     // TODO: We need a real fix - see #6895/#6896
01003     UBool noParse;
01004 };
01005 
01006 // ---------------
01007 
01008 inline UnicodeString&
01009 RuleBasedNumberFormat::format(const Formattable& obj,
01010                               UnicodeString& result,
01011                               UErrorCode& status) const
01012 {
01013     // Don't use Format:: - use immediate base class only,
01014     // in case immediate base modifies behavior later.
01015     // dlf - the above comment is bogus, if there were a reason to modify
01016     // it, it would be virtual, and there's no reason because it is
01017     // a one-line macro in NumberFormat anyway, just like this one.
01018     return NumberFormat::format(obj, result, status);
01019 }
01020 
01021 inline UnicodeString&
01022 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
01023     FieldPosition pos(0);
01024     return format(number, output, pos);
01025 }
01026 
01027 inline UnicodeString&
01028 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
01029     FieldPosition pos(0);
01030     return format(number, output, pos);
01031 }
01032 
01033 inline void
01034 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
01035 {
01036     NumberFormat::parse(text, result, status);
01037 }
01038 
01039 #if !UCONFIG_NO_COLLATION
01040 
01041 inline UBool
01042 RuleBasedNumberFormat::isLenient(void) const {
01043     return lenient;
01044 }
01045 
01046 #endif
01047 
01048 inline NFRuleSet*
01049 RuleBasedNumberFormat::getDefaultRuleSet() const {
01050     return defaultRuleSet;
01051 }
01052 
01053 U_NAMESPACE_END
01054 
01055 /* U_HAVE_RBNF */
01056 #endif
01057 
01058 /* RBNF_H */
01059 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines