| Index: source/i18n/nfsubs.cpp
|
| diff --git a/source/i18n/nfsubs.cpp b/source/i18n/nfsubs.cpp
|
| index 35c9ce1a3c8f35c54d22ad247a1521df65cfed00..62646003f693cff860e30d984e9d350e50ff188f 100644
|
| --- a/source/i18n/nfsubs.cpp
|
| +++ b/source/i18n/nfsubs.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| ******************************************************************************
|
| -* Copyright (C) 1997-2012, International Business Machines
|
| +* Copyright (C) 1997-2014, International Business Machines
|
| * Corporation and others. All Rights Reserved.
|
| ******************************************************************************
|
| * file name: nfsubs.cpp
|
| @@ -149,8 +149,8 @@ public:
|
|
|
| virtual UBool operator==(const NFSubstitution& rhs) const;
|
|
|
| - virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos) const;
|
| - virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const;
|
| + virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos, UErrorCode& status) const;
|
| + virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, UErrorCode& status) const;
|
|
|
| virtual int64_t transformNumber(int64_t number) const { return number % ldivisor; }
|
| virtual double transformNumber(double number) const { return uprv_fmod(number, divisor); }
|
| @@ -218,8 +218,8 @@ public:
|
|
|
| virtual UBool operator==(const NFSubstitution& rhs) const;
|
|
|
| - virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const;
|
| - virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {}
|
| + virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, UErrorCode& status) const;
|
| + virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {}
|
| virtual int64_t transformNumber(int64_t /*number*/) const { return 0; }
|
| virtual double transformNumber(double number) const { return number - uprv_floor(number); }
|
|
|
| @@ -294,8 +294,8 @@ public:
|
| virtual int64_t transformNumber(int64_t number) const { return number * ldenominator; }
|
| virtual double transformNumber(double number) const { return uprv_round(number * denominator); }
|
|
|
| - virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {}
|
| - virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const;
|
| + virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {}
|
| + virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, UErrorCode& status) const;
|
| virtual UBool doParse(const UnicodeString& text,
|
| ParsePosition& parsePosition,
|
| double baseValue,
|
| @@ -327,8 +327,8 @@ public:
|
| virtual ~NullSubstitution();
|
|
|
| virtual void toString(UnicodeString& /*result*/) const {}
|
| - virtual void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {}
|
| - virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {}
|
| + virtual void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {}
|
| + virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {}
|
| virtual int64_t transformNumber(int64_t /*number*/) const { return 0; }
|
| virtual double transformNumber(double /*number*/) const { return 0; }
|
| virtual UBool doParse(const UnicodeString& /*text*/,
|
| @@ -602,13 +602,13 @@ NFSubstitution::toString(UnicodeString& text) const
|
| * position to determine exactly where to insert the new text)
|
| */
|
| void
|
| -NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos) const
|
| +NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos, UErrorCode& status) const
|
| {
|
| if (ruleSet != NULL) {
|
| // perform a transformation on the number that is dependent
|
| // on the type of substitution this is, then just call its
|
| // rule set's format() method to format the result
|
| - ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos);
|
| + ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos, status);
|
| } else if (numberFormat != NULL) {
|
| // or perform the transformation on the number (preserving
|
| // the result's fractional part if the formatter it set
|
| @@ -620,7 +620,7 @@ NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3
|
| }
|
|
|
| UnicodeString temp;
|
| - numberFormat->format(numberToFormat, temp);
|
| + numberFormat->format(numberToFormat, temp, status);
|
| toInsertInto.insert(_pos + this->pos, temp);
|
| }
|
| }
|
| @@ -636,7 +636,7 @@ NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3
|
| * position to determine exactly where to insert the new text)
|
| */
|
| void
|
| -NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos) const {
|
| +NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos, UErrorCode& status) const {
|
| // perform a transformation on the number being formatted that
|
| // is dependent on the type of substitution this is
|
| double numberToFormat = transformNumber(number);
|
| @@ -644,14 +644,14 @@ NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32
|
| // if the result is an integer, from here on out we work in integer
|
| // space (saving time and memory and preserving accuracy)
|
| if (numberToFormat == uprv_floor(numberToFormat) && ruleSet != NULL) {
|
| - ruleSet->format(util64_fromDouble(numberToFormat), toInsertInto, _pos + this->pos);
|
| + ruleSet->format(util64_fromDouble(numberToFormat), toInsertInto, _pos + this->pos, status);
|
|
|
| // if the result isn't an integer, then call either our rule set's
|
| // format() method or our DecimalFormat's format() method to
|
| // format the result
|
| } else {
|
| if (ruleSet != NULL) {
|
| - ruleSet->format(numberToFormat, toInsertInto, _pos + this->pos);
|
| + ruleSet->format(numberToFormat, toInsertInto, _pos + this->pos, status);
|
| } else if (numberFormat != NULL) {
|
| UnicodeString temp;
|
| numberFormat->format(numberToFormat, temp);
|
| @@ -894,19 +894,19 @@ UBool ModulusSubstitution::operator==(const NFSubstitution& rhs) const
|
| * @param pos The position of the rule text in toInsertInto
|
| */
|
| void
|
| -ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos) const
|
| +ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos, UErrorCode& status) const
|
| {
|
| // if this isn't a >>> substitution, just use the inherited version
|
| // of this function (which uses either a rule set or a DecimalFormat
|
| // to format its substitution value)
|
| if (ruleToUse == NULL) {
|
| - NFSubstitution::doSubstitution(number, toInsertInto, _pos);
|
| + NFSubstitution::doSubstitution(number, toInsertInto, _pos, status);
|
|
|
| // a >>> substitution goes straight to a particular rule to
|
| // format the substitution value
|
| } else {
|
| int64_t numberToFormat = transformNumber(number);
|
| - ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos());
|
| + ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos(), status);
|
| }
|
| }
|
|
|
| @@ -919,20 +919,20 @@ ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto,
|
| * @param pos The position of the rule text in toInsertInto
|
| */
|
| void
|
| -ModulusSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos) const
|
| +ModulusSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos, UErrorCode& status) const
|
| {
|
| // if this isn't a >>> substitution, just use the inherited version
|
| // of this function (which uses either a rule set or a DecimalFormat
|
| // to format its substitution value)
|
| if (ruleToUse == NULL) {
|
| - NFSubstitution::doSubstitution(number, toInsertInto, _pos);
|
| + NFSubstitution::doSubstitution(number, toInsertInto, _pos, status);
|
|
|
| // a >>> substitution goes straight to a particular rule to
|
| // format the substitution value
|
| } else {
|
| double numberToFormat = transformNumber(number);
|
|
|
| - ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos());
|
| + ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos(), status);
|
| }
|
| }
|
|
|
| @@ -1057,12 +1057,13 @@ FractionalPartSubstitution::FractionalPartSubstitution(int32_t _pos,
|
| * toInsertInto
|
| */
|
| void
|
| -FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos) const
|
| +FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInsertInto,
|
| + int32_t _pos, UErrorCode& status) const
|
| {
|
| // if we're not in "byDigits" mode, just use the inherited
|
| // doSubstitution() routine
|
| if (!byDigits) {
|
| - NFSubstitution::doSubstitution(number, toInsertInto, _pos);
|
| + NFSubstitution::doSubstitution(number, toInsertInto, _pos, status);
|
|
|
| // if we're in "byDigits" mode, transform the value into an integer
|
| // by moving the decimal point eight places to the right and
|
| @@ -1104,13 +1105,13 @@ FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInser
|
| pad = TRUE;
|
| }
|
| int64_t digit = didx>=0 ? dl.getDigit(didx) - '0' : 0;
|
| - getRuleSet()->format(digit, toInsertInto, _pos + getPos());
|
| + getRuleSet()->format(digit, toInsertInto, _pos + getPos(), status);
|
| }
|
|
|
| if (!pad) {
|
| // hack around lack of precision in digitlist. if we would end up with
|
| // "foo point" make sure we add a " zero" to the end.
|
| - getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos());
|
| + getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos(), status);
|
| }
|
| }
|
| }
|
| @@ -1229,7 +1230,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(AbsoluteValueSubstitution)
|
| //===================================================================
|
|
|
| void
|
| -NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t apos) const {
|
| +NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t apos, UErrorCode& status) const {
|
| // perform a transformation on the number being formatted that
|
| // is dependent on the type of substitution this is
|
|
|
| @@ -1243,7 +1244,7 @@ NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto
|
| int32_t len = toInsertInto.length();
|
| while ((nf *= 10) < denominator) {
|
| toInsertInto.insert(apos + getPos(), gSpace);
|
| - aruleSet->format((int64_t)0, toInsertInto, apos + getPos());
|
| + aruleSet->format((int64_t)0, toInsertInto, apos + getPos(), status);
|
| }
|
| apos += toInsertInto.length() - len;
|
| }
|
| @@ -1251,16 +1252,15 @@ NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto
|
| // if the result is an integer, from here on out we work in integer
|
| // space (saving time and memory and preserving accuracy)
|
| if (numberToFormat == longNF && aruleSet != NULL) {
|
| - aruleSet->format(longNF, toInsertInto, apos + getPos());
|
| + aruleSet->format(longNF, toInsertInto, apos + getPos(), status);
|
|
|
| // if the result isn't an integer, then call either our rule set's
|
| // format() method or our DecimalFormat's format() method to
|
| // format the result
|
| } else {
|
| if (aruleSet != NULL) {
|
| - aruleSet->format(numberToFormat, toInsertInto, apos + getPos());
|
| + aruleSet->format(numberToFormat, toInsertInto, apos + getPos(), status);
|
| } else {
|
| - UErrorCode status = U_ZERO_ERROR;
|
| UnicodeString temp;
|
| getNumberFormat()->format(numberToFormat, temp, status);
|
| toInsertInto.insert(apos + getPos(), temp);
|
|
|