1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 ******************************************************************************
5 * Copyright (C) 1997-2015, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 ******************************************************************************
10 * tab size: 8 (not used)
13 * Modification history
15 * 10/11/2001 Doug Ported from ICU4J
21 #include "unicode/uobject.h"
22 #include "unicode/rbnf.h"
26 #include "unicode/utypes.h"
27 #include "unicode/umisc.h"
33 class NFRuleSet
: public UMemory
{
35 NFRuleSet(RuleBasedNumberFormat
*owner
, UnicodeString
* descriptions
, int32_t index
, UErrorCode
& status
);
36 void parseRules(UnicodeString
& rules
, UErrorCode
& status
);
37 void setNonNumericalRule(NFRule
*rule
);
38 void setBestFractionRule(int32_t originalIndex
, NFRule
*newRule
, UBool rememberRule
);
39 void makeIntoFractionRuleSet() { fIsFractionRuleSet
= TRUE
; }
43 UBool
operator==(const NFRuleSet
& rhs
) const;
44 UBool
operator!=(const NFRuleSet
& rhs
) const { return !operator==(rhs
); }
46 UBool
isPublic() const { return fIsPublic
; }
48 UBool
isParseable() const { return fIsParseable
; }
50 UBool
isDecimalFormatRuleParseable() const {
51 UnicodeString numberingYear
= UNICODE_STRING_SIMPLE("spellout-numbering-year");
52 UnicodeString ordinal
= UNICODE_STRING_SIMPLE("spellout-ordinal");
54 return ( name
.indexOf(numberingYear
) == -1 && name
.indexOf(ordinal
) == -1 );
57 UBool
isFractionRuleSet() const { return fIsFractionRuleSet
; }
59 void getName(UnicodeString
& result
) const { result
.setTo(name
); }
60 UBool
isNamed(const UnicodeString
& _name
) const { return this->name
== _name
; }
62 void format(int64_t number
, UnicodeString
& toAppendTo
, int32_t pos
, int32_t recursionCount
, UErrorCode
& status
) const;
63 void format(double number
, UnicodeString
& toAppendTo
, int32_t pos
, int32_t recursionCount
, UErrorCode
& status
) const;
65 UBool
parse(const UnicodeString
& text
, ParsePosition
& pos
, double upperBound
, uint32_t nonNumericalExecutedRuleMask
, Formattable
& result
, UBool lenient
=FALSE
) const;
67 void appendRules(UnicodeString
& result
) const; // toString
69 void setDecimalFormatSymbols(const DecimalFormatSymbols
&newSymbols
, UErrorCode
& status
);
71 const RuleBasedNumberFormat
*getOwner() const { return owner
; }
73 const NFRule
* findNormalRule(int64_t number
) const;
74 const NFRule
* findDoubleRule(double number
) const;
75 const NFRule
* findFractionRuleSetRule(double number
) const;
77 friend class NFSubstitution
;
82 NFRule
*nonNumericalRules
[6];
83 RuleBasedNumberFormat
*owner
;
84 NFRuleList fractionRules
;
85 UBool fIsFractionRuleSet
;
89 NFRuleSet(const NFRuleSet
&other
); // forbid copying of this class
90 NFRuleSet
&operator=(const NFRuleSet
&other
); // forbid copying of this class
93 // utilities from old llong.h
94 // convert mantissa portion of double to int64
95 int64_t util64_fromDouble(double d
);
97 // raise radix to the power exponent, only non-negative exponents
98 // Arithmetic is performed in unsigned space since overflow in
99 // signed space is undefined behavior.
100 uint64_t util64_pow(uint32_t radix
, uint16_t exponent
);
102 // convert n to digit string in buffer, return length of string
103 uint32_t util64_tou(int64_t n
, UChar
* buffer
, uint32_t buflen
, uint32_t radix
= 10, UBool raw
= FALSE
);
106 int64_t util64_utoi(const UChar
* str
, uint32_t radix
= 10);
107 uint32_t util64_toa(int64_t n
, char* buffer
, uint32_t buflen
, uint32_t radix
= 10, UBool raw
= FALSE
);
108 int64_t util64_atoi(const char* str
, uint32_t radix
);