+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
-* Copyright (C) 1997-2008, International Business Machines
+* Copyright (C) 1997-2015, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*/
#include "unicode/utypes.h"
#include "unicode/uobject.h"
#include "unicode/unistr.h"
-#include "putilimp.h"
U_NAMESPACE_BEGIN
class NFRuleSet;
class NFSubstitution;
class ParsePosition;
+class PluralFormat;
class RuleBasedNumberFormat;
class UnicodeString;
kImproperFractionRule = -2,
kProperFractionRule = -3,
kMasterRule = -4,
- kOtherRule = -5
+ kInfinityRule = -5,
+ kNaNRule = -6,
+ kOtherRule = -7
};
static void makeRules(UnicodeString& definition,
- const NFRuleSet* ruleSet,
+ NFRuleSet* ruleSet,
const NFRule* predecessor,
const RuleBasedNumberFormat* rbnf,
NFRuleList& ruleList,
UErrorCode& status);
- NFRule(const RuleBasedNumberFormat* rbnf);
+ NFRule(const RuleBasedNumberFormat* rbnf, const UnicodeString &ruleText, UErrorCode &status);
~NFRule();
UBool operator==(const NFRule& rhs) const;
int64_t getBaseValue() const { return baseValue; }
void setBaseValue(int64_t value, UErrorCode& status);
- double getDivisor() const { return uprv_pow(radix, exponent); }
+ UChar getDecimalPoint() const { return decimalPoint; }
- void doFormat(int64_t number, UnicodeString& toAppendTo, int32_t pos) const;
- void doFormat(double number, UnicodeString& toAppendTo, int32_t pos) const;
+ int64_t getDivisor() const;
+
+ void doFormat(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
+ void doFormat(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
UBool doParse(const UnicodeString& text,
ParsePosition& pos,
UBool isFractional,
double upperBound,
- Formattable& result) const;
+ uint32_t nonNumericalExecutedRuleMask,
+ Formattable& result,
+ UBool isDecimFmtParseable=TRUE) const;
- UBool shouldRollBack(double number) const;
+ UBool shouldRollBack(int64_t number) const;
void _appendRuleText(UnicodeString& result) const;
+ int32_t findTextLenient(const UnicodeString& str, const UnicodeString& key,
+ int32_t startingAt, int32_t* resultCount) const;
+
+ void setDecimalFormatSymbols(const DecimalFormatSymbols &newSymbols, UErrorCode& status);
+
private:
void parseRuleDescriptor(UnicodeString& descriptor, UErrorCode& status);
- void extractSubstitutions(const NFRuleSet* ruleSet, const NFRule* predecessor, const RuleBasedNumberFormat* rbnf, UErrorCode& status);
- NFSubstitution* extractSubstitution(const NFRuleSet* ruleSet, const NFRule* predecessor, const RuleBasedNumberFormat* rbnf, UErrorCode& status);
+ void extractSubstitutions(const NFRuleSet* ruleSet, const UnicodeString &ruleText, const NFRule* predecessor, UErrorCode& status);
+ NFSubstitution* extractSubstitution(const NFRuleSet* ruleSet, const NFRule* predecessor, UErrorCode& status);
int16_t expectedExponent() const;
- int32_t indexOfAny(const UChar* const strings[]) const;
+ int32_t indexOfAnyRulePrefix() const;
double matchToDelimiter(const UnicodeString& text, int32_t startPos, double baseValue,
const UnicodeString& delimiter, ParsePosition& pp, const NFSubstitution* sub,
+ uint32_t nonNumericalExecutedRuleMask,
double upperBound) const;
void stripPrefix(UnicodeString& text, const UnicodeString& prefix, ParsePosition& pp) const;
int64_t baseValue;
int32_t radix;
int16_t exponent;
- UnicodeString ruleText;
+ UChar decimalPoint;
+ UnicodeString fRuleText;
NFSubstitution* sub1;
NFSubstitution* sub2;
const RuleBasedNumberFormat* formatter;
+ const PluralFormat* rulePatternFormat;
NFRule(const NFRule &other); // forbid copying of this class
NFRule &operator=(const NFRule &other); // forbid copying of this class