Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

rbnf.h

00001 /*
00002 *******************************************************************************
00003 * Copyright (C) 1997-2003, 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 
00013 #if defined(U_INT64_T_UNAVAILABLE) || UCONFIG_NO_FORMATTING
00014 #define U_HAVE_RBNF 0
00015 #else
00016 #define U_HAVE_RBNF 1
00017 
00018 #include "unicode/coll.h"
00019 #include "unicode/dcfmtsym.h"
00020 #include "unicode/fmtable.h"
00021 #include "unicode/locid.h"
00022 #include "unicode/numfmt.h"
00023 #include "unicode/unistr.h"
00024 
00025 U_NAMESPACE_BEGIN
00026 
00027 class NFRuleSet;
00028 
00030 enum URBNFRuleSetTag {
00031     URBNF_SPELLOUT,
00032     URBNF_ORDINAL,
00033     URBNF_DURATION,
00034     URBNF_COUNT
00035 };
00036 
00037 #if UCONFIG_NO_COLLATION
00038 class Collator;
00039 #endif
00040 
00465 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00466 public:
00467 
00468   //-----------------------------------------------------------------------
00469   // constructors
00470   //-----------------------------------------------------------------------
00471 
00487   RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale, 
00488                         UParseError& perror, UErrorCode& status);
00489 
00503   RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00504 
00505   //-----------------------------------------------------------------------
00506   // boilerplate
00507   //-----------------------------------------------------------------------
00508 
00514   RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00515 
00521   RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00522 
00527   virtual ~RuleBasedNumberFormat();
00528 
00535   virtual Format* clone(void) const;
00536 
00544   virtual UBool operator==(const Format& other) const;
00545 
00546 //-----------------------------------------------------------------------
00547 // public API functions
00548 //-----------------------------------------------------------------------
00549 
00555   virtual UnicodeString getRules() const;
00556 
00564   virtual UnicodeString getRuleSetName(int32_t index) const;
00565 
00571   virtual int32_t getNumberOfRuleSetNames() const;
00572 
00581   virtual UnicodeString& format(int32_t number,
00582                                 UnicodeString& toAppendTo,
00583                                 FieldPosition& pos) const;
00584 
00593   virtual UnicodeString& format(int64_t number,
00594                                 UnicodeString& toAppendTo,
00595                                 FieldPosition& pos) const;
00604   virtual UnicodeString& format(double number,
00605                                 UnicodeString& toAppendTo,
00606                                 FieldPosition& pos) const;
00607 
00619   virtual UnicodeString& format(int32_t number,
00620                                 const UnicodeString& ruleSetName,
00621                                 UnicodeString& toAppendTo,
00622                                 FieldPosition& pos,
00623                                 UErrorCode& status) const;
00635   virtual UnicodeString& format(int64_t number,
00636                                 const UnicodeString& ruleSetName,
00637                                 UnicodeString& toAppendTo,
00638                                 FieldPosition& pos,
00639                                 UErrorCode& status) const;
00651   virtual UnicodeString& format(double number,
00652                                 const UnicodeString& ruleSetName,
00653                                 UnicodeString& toAppendTo,
00654                                 FieldPosition& pos,
00655                                 UErrorCode& status) const;
00656 
00666   virtual UnicodeString& format(const Formattable& obj,
00667                                 UnicodeString& toAppendTo,
00668                                 FieldPosition& pos,
00669                                 UErrorCode& status) const;
00678   UnicodeString& format(const Formattable& obj,
00679                         UnicodeString& result,
00680                         UErrorCode& status) const;
00681 
00689    UnicodeString& format(double number,
00690                          UnicodeString& output) const;
00691 
00699    UnicodeString& format(int32_t number,
00700                          UnicodeString& output) const;
00701 
00716   virtual void parse(const UnicodeString& text,
00717                      Formattable& result,
00718                      ParsePosition& parsePosition) const;
00719 
00720   
00728   virtual inline void parse(const UnicodeString& text,
00729                       Formattable& result,
00730                       UErrorCode& status) const;
00731 
00732 #if !UCONFIG_NO_COLLATION
00733 
00767   virtual void setLenient(UBool enabled);
00768 
00776   virtual inline UBool isLenient(void) const;
00777 
00778 #endif
00779 
00788   virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
00789 
00790 private:
00791   RuleBasedNumberFormat(); // default constructor not implemented
00792 
00793   void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00794   void dispose();
00795   void stripWhitespace(UnicodeString& src);
00796   void initDefaultRuleSet();
00797   void format(double number, NFRuleSet& ruleSet);
00798   NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00799 
00800   /* friend access */
00801   friend class NFSubstitution;
00802   friend class NFRule;
00803   friend class FractionalPartSubstitution;
00804 
00805   inline NFRuleSet * getDefaultRuleSet() const;
00806   Collator * getCollator() const;
00807   DecimalFormatSymbols * getDecimalFormatSymbols() const;
00808 
00809 private:
00810     static const char fgClassID;
00811 
00812 public:
00813     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00814     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00815 
00816 private:
00817     NFRuleSet **ruleSets;
00818     NFRuleSet *defaultRuleSet;
00819     Locale locale;
00820     Collator* collator;
00821     DecimalFormatSymbols* decimalFormatSymbols;
00822     UBool lenient;
00823     UnicodeString* lenientParseRules;
00824 };
00825 
00826 // ---------------
00827 
00828 inline UnicodeString&
00829 RuleBasedNumberFormat::format(const Formattable& obj,
00830                               UnicodeString& result,
00831                               UErrorCode& status) const
00832 {
00833     // Don't use Format:: - use immediate base class only,
00834     // in case immediate base modifies behavior later.
00835     // dlf - the above comment is bogus, if there were a reason to modify
00836     // it, it would be virtual, and there's no reason because it is
00837     // a one-line macro in NumberFormat anyway, just like this one.
00838     return NumberFormat::format(obj, result, status);
00839 }
00840 
00841 inline UnicodeString&
00842 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00843     FieldPosition pos(0);
00844     return format(number, output, pos);
00845 }
00846 
00847 inline UnicodeString&
00848 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00849     FieldPosition pos(0);
00850     return format(number, output, pos);
00851 }
00852 
00853 inline void
00854 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00855 {
00856     NumberFormat::parse(text, result, status);
00857 }
00858 
00859 #if !UCONFIG_NO_COLLATION
00860 
00861 inline UBool 
00862 RuleBasedNumberFormat::isLenient(void) const { 
00863     return lenient; 
00864 }
00865 
00866 #endif
00867 
00868 inline NFRuleSet* 
00869 RuleBasedNumberFormat::getDefaultRuleSet() const { 
00870     return defaultRuleSet; 
00871 }
00872 
00873 U_NAMESPACE_END
00874 
00875 /* U_HAVE_RBNF */
00876 #endif
00877 
00878 /* RBNF_H */
00879 #endif

Generated on Wed Sep 3 17:47:09 2003 for ICU 2.6 by doxygen 1.3.2