Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

rbnf.h

00001 /*
00002 *******************************************************************************
00003 * Copyright (C) 1997-2001, International Business Machines Corporation and others. All Rights Reserved.
00004 *******************************************************************************
00005 */
00006 
00007 #ifndef RBNF_H
00008 #define RBNF_H
00009 
00010 #include "unicode/coll.h"
00011 #include "unicode/dcfmtsym.h"
00012 #include "unicode/fmtable.h"
00013 #include "unicode/locid.h"
00014 #include "unicode/numfmt.h"
00015 #include "unicode/unistr.h"
00016 #include "unicode/utypes.h"
00017 
00018 U_NAMESPACE_BEGIN
00019 
00020 class NFRuleSet;
00021 
00023 enum URBNFRuleSetTag {
00024     URBNF_SPELLOUT,
00025     URBNF_ORDINAL,
00026     URBNF_DURATION,
00027     URBNF_COUNT
00028 };
00029 
00487 class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
00488 public:
00489 
00490   //-----------------------------------------------------------------------
00491   // constructors
00492   //-----------------------------------------------------------------------
00493 
00509   RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale, 
00510                         UParseError& perror, UErrorCode& status);
00511 
00525   RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status);
00526 
00527   //-----------------------------------------------------------------------
00528   // boilerplate
00529   //-----------------------------------------------------------------------
00530 
00534   RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs);
00535 
00539   RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs);
00540 
00544   virtual ~RuleBasedNumberFormat();
00545 
00550   virtual Format* clone(void) const;
00551 
00556   virtual UBool operator==(const Format& other) const;
00557 
00558 //-----------------------------------------------------------------------
00559 // public API functions
00560 //-----------------------------------------------------------------------
00561 
00567   virtual UnicodeString getRules() const;
00568 
00576   virtual UnicodeString getRuleSetName(int32_t index) const;
00577 
00583   virtual int32_t getNumberOfRuleSetNames() const;
00584 
00593   virtual UnicodeString& format(int32_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(double number,
00636                                 const UnicodeString& ruleSetName,
00637                                 UnicodeString& toAppendTo,
00638                                 FieldPosition& pos,
00639                                 UErrorCode& status) const;
00640 
00650   virtual UnicodeString& format(const Formattable& obj,
00651                                 UnicodeString& toAppendTo,
00652                                 FieldPosition& pos,
00653                                 UErrorCode& status) const;
00658   UnicodeString& format(const Formattable& obj,
00659                         UnicodeString& result,
00660                         UErrorCode& status) const;
00661 
00666    UnicodeString& format(double number,
00667                          UnicodeString& output) const;
00668 
00673    UnicodeString& format(int32_t number,
00674                          UnicodeString& output) const;
00675 
00690   virtual void parse(const UnicodeString& text,
00691                      Formattable& result,
00692                      ParsePosition& parsePosition) const;
00693 
00694   
00699   virtual inline void parse(const UnicodeString& text,
00700                       Formattable& result,
00701                       UErrorCode& status) const;
00702 
00703 
00737   virtual void setLenient(UBool enabled);
00738 
00746   virtual inline UBool isLenient(void) const;
00747 
00748 private:
00749   void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
00750   void dispose();
00751   void stripWhitespace(UnicodeString& src);
00752   void setDefaultRuleSet();
00753   void format(double number, NFRuleSet& ruleSet);
00754   NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
00755 
00756   /* friend access */
00757   friend class NFSubstitution;
00758   friend class NFRule;
00759   friend class FractionalPartSubstitution;
00760 
00761   inline NFRuleSet * getDefaultRuleSet() const;
00762   Collator * getCollator() const;
00763   DecimalFormatSymbols * getDecimalFormatSymbols() const;
00764 
00765 private:
00766     static const char fgClassID;
00767 
00768 public:
00769     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00770     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00771 
00772 private:
00773     NFRuleSet **ruleSets;
00774     NFRuleSet *defaultRuleSet;
00775     Locale locale;
00776     Collator* collator;
00777     DecimalFormatSymbols* decimalFormatSymbols;
00778     UBool lenient;
00779     UnicodeString* lenientParseRules;
00780 };
00781 
00782 // ---------------
00783 
00784 inline UnicodeString&
00785 RuleBasedNumberFormat::format(const Formattable& obj,
00786                               UnicodeString& result,
00787                               UErrorCode& status) const
00788 {
00789     // Don't use Format:: - use immediate base class only,
00790     // in case immediate base modifies behavior later.
00791     // dlf - the above comment is bogus, if there were a reason to modify
00792     // it, it would be virtual, and there's no reason because it is
00793     // a one-line macro in NumberFormat anyway, just like this one.
00794     return NumberFormat::format(obj, result, status);
00795 }
00796 
00797 inline UnicodeString&
00798 RuleBasedNumberFormat::format(double number, UnicodeString& output) const {
00799     FieldPosition pos(0);
00800     return format(number, output, pos);
00801 }
00802 
00803 inline UnicodeString&
00804 RuleBasedNumberFormat::format(int32_t number, UnicodeString& output) const {
00805     FieldPosition pos(0);
00806     return format(number, output, pos);
00807 }
00808 
00809 inline void
00810 RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const
00811 {
00812     NumberFormat::parse(text, result, status);
00813 }
00814 
00815 inline UBool 
00816 RuleBasedNumberFormat::isLenient(void) const { 
00817     return lenient; 
00818 }
00819 
00820 inline NFRuleSet* 
00821 RuleBasedNumberFormat::getDefaultRuleSet() const { 
00822     return defaultRuleSet; 
00823 }
00824 
00825 U_NAMESPACE_END
00826 
00827 /* RBNF_H */
00828 #endif

Generated on Sun Mar 10 02:54:02 2002 for ICU 2.0 by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002