00001
00002
00003
00004
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
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
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
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
public:
00796
static UClassID getStaticClassID(
void);
00797
00803
virtual UClassID getDynamicClassID(
void)
const;
00804
00805
private:
00806 RuleBasedNumberFormat();
00807
00808
void init(
const UnicodeString& rules,
UParseError& perror,
UErrorCode& status);
00809
void dispose();
00810
void stripWhitespace(
UnicodeString& src);
00811
void initDefaultRuleSet();
00812
void format(
double number, NFRuleSet& ruleSet);
00813 NFRuleSet* findRuleSet(
const UnicodeString& name,
UErrorCode& status)
const;
00814
00815
00816
friend class NFSubstitution;
00817
friend class NFRule;
00818
friend class FractionalPartSubstitution;
00819
00820
inline NFRuleSet * getDefaultRuleSet()
const;
00821
Collator * getCollator()
const;
00822
DecimalFormatSymbols * getDecimalFormatSymbols()
const;
00823
00824
private:
00825 NFRuleSet **ruleSets;
00826 NFRuleSet *defaultRuleSet;
00827
Locale locale;
00828
Collator* collator;
00829
DecimalFormatSymbols* decimalFormatSymbols;
00830
UBool lenient;
00831
UnicodeString* lenientParseRules;
00832 };
00833
00834
00835
00836
inline UnicodeString&
00837 RuleBasedNumberFormat::format(
const Formattable& obj,
00838
UnicodeString& result,
00839 UErrorCode& status)
const
00840
{
00841
00842
00843
00844
00845
00846
return NumberFormat::format(obj, result, status);
00847 }
00848
00849
inline UnicodeString&
00850 RuleBasedNumberFormat::format(
double number,
UnicodeString& output)
const {
00851
FieldPosition pos(0);
00852
return format(number, output, pos);
00853 }
00854
00855
inline UnicodeString&
00856 RuleBasedNumberFormat::format(int32_t number,
UnicodeString& output)
const {
00857
FieldPosition pos(0);
00858
return format(number, output, pos);
00859 }
00860
00861
inline void
00862 RuleBasedNumberFormat::parse(
const UnicodeString& text,
Formattable& result, UErrorCode& status)
const
00863
{
00864 NumberFormat::parse(text, result, status);
00865 }
00866
00867
#if !UCONFIG_NO_COLLATION
00868
00869
inline UBool
00870 RuleBasedNumberFormat::isLenient(
void)
const {
00871
return lenient;
00872 }
00873
00874
#endif
00875
00876
inline NFRuleSet*
00877 RuleBasedNumberFormat::getDefaultRuleSet()
const {
00878
return defaultRuleSet;
00879 }
00880
00881
U_NAMESPACE_END
00882
00883
00884
#endif
00885
00886
00887
#endif