OLD | NEW |
1 /* | 1 /* |
2 ****************************************************************************** | 2 ****************************************************************************** |
3 * Copyright (C) 1997-2012, International Business Machines | 3 * Copyright (C) 1997-2014, International Business Machines |
4 * Corporation and others. All Rights Reserved. | 4 * Corporation and others. All Rights Reserved. |
5 ****************************************************************************** | 5 ****************************************************************************** |
6 * file name: nfsubs.cpp | 6 * file name: nfsubs.cpp |
7 * encoding: US-ASCII | 7 * encoding: US-ASCII |
8 * tab size: 8 (not used) | 8 * tab size: 8 (not used) |
9 * indentation:4 | 9 * indentation:4 |
10 * | 10 * |
11 * Modification history | 11 * Modification history |
12 * Date Name Comments | 12 * Date Name Comments |
13 * 10/11/2001 Doug Ported from ICU4J | 13 * 10/11/2001 Doug Ported from ICU4J |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 divisor = uprv_pow(radix, exponent); | 142 divisor = uprv_pow(radix, exponent); |
143 ldivisor = util64_fromDouble(divisor); | 143 ldivisor = util64_fromDouble(divisor); |
144 | 144 |
145 if (divisor == 0) { | 145 if (divisor == 0) { |
146 status = U_PARSE_ERROR; | 146 status = U_PARSE_ERROR; |
147 } | 147 } |
148 } | 148 } |
149 | 149 |
150 virtual UBool operator==(const NFSubstitution& rhs) const; | 150 virtual UBool operator==(const NFSubstitution& rhs) const; |
151 | 151 |
152 virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int
32_t pos) const; | 152 virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int
32_t pos, UErrorCode& status) const; |
153 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos) const; | 153 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos, UErrorCode& status) const; |
154 | 154 |
155 virtual int64_t transformNumber(int64_t number) const { return number % ldiv
isor; } | 155 virtual int64_t transformNumber(int64_t number) const { return number % ldiv
isor; } |
156 virtual double transformNumber(double number) const { return uprv_fmod(numbe
r, divisor); } | 156 virtual double transformNumber(double number) const { return uprv_fmod(numbe
r, divisor); } |
157 | 157 |
158 virtual UBool doParse(const UnicodeString& text, | 158 virtual UBool doParse(const UnicodeString& text, |
159 ParsePosition& parsePosition, | 159 ParsePosition& parsePosition, |
160 double baseValue, | 160 double baseValue, |
161 double upperBound, | 161 double upperBound, |
162 UBool lenientParse, | 162 UBool lenientParse, |
163 Formattable& result) const; | 163 Formattable& result) const; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 public: | 211 public: |
212 FractionalPartSubstitution(int32_t pos, | 212 FractionalPartSubstitution(int32_t pos, |
213 const NFRuleSet* ruleSet, | 213 const NFRuleSet* ruleSet, |
214 const RuleBasedNumberFormat* formatter, | 214 const RuleBasedNumberFormat* formatter, |
215 const UnicodeString& description, | 215 const UnicodeString& description, |
216 UErrorCode& status); | 216 UErrorCode& status); |
217 virtual ~FractionalPartSubstitution(); | 217 virtual ~FractionalPartSubstitution(); |
218 | 218 |
219 virtual UBool operator==(const NFSubstitution& rhs) const; | 219 virtual UBool operator==(const NFSubstitution& rhs) const; |
220 | 220 |
221 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos) const; | 221 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos, UErrorCode& status) const; |
222 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/) const {} | 222 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {} |
223 virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } | 223 virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } |
224 virtual double transformNumber(double number) const { return number - uprv_f
loor(number); } | 224 virtual double transformNumber(double number) const { return number - uprv_f
loor(number); } |
225 | 225 |
226 virtual UBool doParse(const UnicodeString& text, | 226 virtual UBool doParse(const UnicodeString& text, |
227 ParsePosition& parsePosition, | 227 ParsePosition& parsePosition, |
228 double baseValue, | 228 double baseValue, |
229 double upperBound, | 229 double upperBound, |
230 UBool lenientParse, | 230 UBool lenientParse, |
231 Formattable& result) const; | 231 Formattable& result) const; |
232 | 232 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 ldenominator = util64_fromDouble(denominator); | 287 ldenominator = util64_fromDouble(denominator); |
288 withZeros = description.endsWith(LTLT, 2); | 288 withZeros = description.endsWith(LTLT, 2); |
289 } | 289 } |
290 virtual ~NumeratorSubstitution(); | 290 virtual ~NumeratorSubstitution(); |
291 | 291 |
292 virtual UBool operator==(const NFSubstitution& rhs) const; | 292 virtual UBool operator==(const NFSubstitution& rhs) const; |
293 | 293 |
294 virtual int64_t transformNumber(int64_t number) const { return number * lden
ominator; } | 294 virtual int64_t transformNumber(int64_t number) const { return number * lden
ominator; } |
295 virtual double transformNumber(double number) const { return uprv_round(numb
er * denominator); } | 295 virtual double transformNumber(double number) const { return uprv_round(numb
er * denominator); } |
296 | 296 |
297 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/) const {} | 297 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {} |
298 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos) const; | 298 virtual void doSubstitution(double number, UnicodeString& toInsertInto, int3
2_t pos, UErrorCode& status) const; |
299 virtual UBool doParse(const UnicodeString& text, | 299 virtual UBool doParse(const UnicodeString& text, |
300 ParsePosition& parsePosition, | 300 ParsePosition& parsePosition, |
301 double baseValue, | 301 double baseValue, |
302 double upperBound, | 302 double upperBound, |
303 UBool /*lenientParse*/, | 303 UBool /*lenientParse*/, |
304 Formattable& result) const; | 304 Formattable& result) const; |
305 | 305 |
306 virtual double composeRuleValue(double newRuleValue, double oldRuleValue) co
nst { return newRuleValue / oldRuleValue; } | 306 virtual double composeRuleValue(double newRuleValue, double oldRuleValue) co
nst { return newRuleValue / oldRuleValue; } |
307 virtual double calcUpperBound(double /*oldUpperBound*/) const { return denom
inator; } | 307 virtual double calcUpperBound(double /*oldUpperBound*/) const { return denom
inator; } |
308 virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' | 308 virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' |
(...skipping 11 matching lines...) Expand all Loading... |
320 public: | 320 public: |
321 NullSubstitution(int32_t _pos, | 321 NullSubstitution(int32_t _pos, |
322 const NFRuleSet* _ruleSet, | 322 const NFRuleSet* _ruleSet, |
323 const RuleBasedNumberFormat* formatter, | 323 const RuleBasedNumberFormat* formatter, |
324 const UnicodeString& description, | 324 const UnicodeString& description, |
325 UErrorCode& status) | 325 UErrorCode& status) |
326 : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} | 326 : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} |
327 virtual ~NullSubstitution(); | 327 virtual ~NullSubstitution(); |
328 | 328 |
329 virtual void toString(UnicodeString& /*result*/) const {} | 329 virtual void toString(UnicodeString& /*result*/) const {} |
330 virtual void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto
*/, int32_t /*_pos*/) const {} | 330 virtual void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto
*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {} |
331 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/) const {} | 331 virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInt
o*/, int32_t /*_pos*/, UErrorCode& /*status*/) const {} |
332 virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } | 332 virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } |
333 virtual double transformNumber(double /*number*/) const { return 0; } | 333 virtual double transformNumber(double /*number*/) const { return 0; } |
334 virtual UBool doParse(const UnicodeString& /*text*/, | 334 virtual UBool doParse(const UnicodeString& /*text*/, |
335 ParsePosition& /*parsePosition*/, | 335 ParsePosition& /*parsePosition*/, |
336 double baseValue, | 336 double baseValue, |
337 double /*upperBound*/, | 337 double /*upperBound*/, |
338 UBool /*lenientParse*/, | 338 UBool /*lenientParse*/, |
339 Formattable& result) const | 339 Formattable& result) const |
340 { result.setDouble(baseValue); return TRUE; } | 340 { result.setDouble(baseValue); return TRUE; } |
341 virtual double composeRuleValue(double /*newRuleValue*/, double /*oldRuleVal
ue*/) const { return 0.0; } // never called | 341 virtual double composeRuleValue(double /*newRuleValue*/, double /*oldRuleVal
ue*/) const { return 0.0; } // never called |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 * Performs a mathematical operation on the number, formats it using | 595 * Performs a mathematical operation on the number, formats it using |
596 * either ruleSet or decimalFormat, and inserts the result into | 596 * either ruleSet or decimalFormat, and inserts the result into |
597 * toInsertInto. | 597 * toInsertInto. |
598 * @param number The number being formatted. | 598 * @param number The number being formatted. |
599 * @param toInsertInto The string we insert the result into | 599 * @param toInsertInto The string we insert the result into |
600 * @param pos The position in toInsertInto where the owning rule's | 600 * @param pos The position in toInsertInto where the owning rule's |
601 * rule text begins (this value is added to this substitution's | 601 * rule text begins (this value is added to this substitution's |
602 * position to determine exactly where to insert the new text) | 602 * position to determine exactly where to insert the new text) |
603 */ | 603 */ |
604 void | 604 void |
605 NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3
2_t _pos) const | 605 NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3
2_t _pos, UErrorCode& status) const |
606 { | 606 { |
607 if (ruleSet != NULL) { | 607 if (ruleSet != NULL) { |
608 // perform a transformation on the number that is dependent | 608 // perform a transformation on the number that is dependent |
609 // on the type of substitution this is, then just call its | 609 // on the type of substitution this is, then just call its |
610 // rule set's format() method to format the result | 610 // rule set's format() method to format the result |
611 ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos)
; | 611 ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos,
status); |
612 } else if (numberFormat != NULL) { | 612 } else if (numberFormat != NULL) { |
613 // or perform the transformation on the number (preserving | 613 // or perform the transformation on the number (preserving |
614 // the result's fractional part if the formatter it set | 614 // the result's fractional part if the formatter it set |
615 // to show it), then use that formatter's format() method | 615 // to show it), then use that formatter's format() method |
616 // to format the result | 616 // to format the result |
617 double numberToFormat = transformNumber((double)number); | 617 double numberToFormat = transformNumber((double)number); |
618 if (numberFormat->getMaximumFractionDigits() == 0) { | 618 if (numberFormat->getMaximumFractionDigits() == 0) { |
619 numberToFormat = uprv_floor(numberToFormat); | 619 numberToFormat = uprv_floor(numberToFormat); |
620 } | 620 } |
621 | 621 |
622 UnicodeString temp; | 622 UnicodeString temp; |
623 numberFormat->format(numberToFormat, temp); | 623 numberFormat->format(numberToFormat, temp, status); |
624 toInsertInto.insert(_pos + this->pos, temp); | 624 toInsertInto.insert(_pos + this->pos, temp); |
625 } | 625 } |
626 } | 626 } |
627 | 627 |
628 /** | 628 /** |
629 * Performs a mathematical operation on the number, formats it using | 629 * Performs a mathematical operation on the number, formats it using |
630 * either ruleSet or decimalFormat, and inserts the result into | 630 * either ruleSet or decimalFormat, and inserts the result into |
631 * toInsertInto. | 631 * toInsertInto. |
632 * @param number The number being formatted. | 632 * @param number The number being formatted. |
633 * @param toInsertInto The string we insert the result into | 633 * @param toInsertInto The string we insert the result into |
634 * @param pos The position in toInsertInto where the owning rule's | 634 * @param pos The position in toInsertInto where the owning rule's |
635 * rule text begins (this value is added to this substitution's | 635 * rule text begins (this value is added to this substitution's |
636 * position to determine exactly where to insert the new text) | 636 * position to determine exactly where to insert the new text) |
637 */ | 637 */ |
638 void | 638 void |
639 NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32
_t _pos) const { | 639 NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32
_t _pos, UErrorCode& status) const { |
640 // perform a transformation on the number being formatted that | 640 // perform a transformation on the number being formatted that |
641 // is dependent on the type of substitution this is | 641 // is dependent on the type of substitution this is |
642 double numberToFormat = transformNumber(number); | 642 double numberToFormat = transformNumber(number); |
643 | 643 |
644 // if the result is an integer, from here on out we work in integer | 644 // if the result is an integer, from here on out we work in integer |
645 // space (saving time and memory and preserving accuracy) | 645 // space (saving time and memory and preserving accuracy) |
646 if (numberToFormat == uprv_floor(numberToFormat) && ruleSet != NULL) { | 646 if (numberToFormat == uprv_floor(numberToFormat) && ruleSet != NULL) { |
647 ruleSet->format(util64_fromDouble(numberToFormat), toInsertInto, _pos +
this->pos); | 647 ruleSet->format(util64_fromDouble(numberToFormat), toInsertInto, _pos +
this->pos, status); |
648 | 648 |
649 // if the result isn't an integer, then call either our rule set's | 649 // if the result isn't an integer, then call either our rule set's |
650 // format() method or our DecimalFormat's format() method to | 650 // format() method or our DecimalFormat's format() method to |
651 // format the result | 651 // format the result |
652 } else { | 652 } else { |
653 if (ruleSet != NULL) { | 653 if (ruleSet != NULL) { |
654 ruleSet->format(numberToFormat, toInsertInto, _pos + this->pos); | 654 ruleSet->format(numberToFormat, toInsertInto, _pos + this->pos, stat
us); |
655 } else if (numberFormat != NULL) { | 655 } else if (numberFormat != NULL) { |
656 UnicodeString temp; | 656 UnicodeString temp; |
657 numberFormat->format(numberToFormat, temp); | 657 numberFormat->format(numberToFormat, temp); |
658 toInsertInto.insert(_pos + this->pos, temp); | 658 toInsertInto.insert(_pos + this->pos, temp); |
659 } | 659 } |
660 } | 660 } |
661 } | 661 } |
662 | 662 |
663 | 663 |
664 //----------------------------------------------------------------------- | 664 //----------------------------------------------------------------------- |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 | 887 |
888 /** | 888 /** |
889 * If this is a >>> substitution, use ruleToUse to fill in | 889 * If this is a >>> substitution, use ruleToUse to fill in |
890 * the substitution. Otherwise, just use the superclass function. | 890 * the substitution. Otherwise, just use the superclass function. |
891 * @param number The number being formatted | 891 * @param number The number being formatted |
892 * @toInsertInto The string to insert the result of this substitution | 892 * @toInsertInto The string to insert the result of this substitution |
893 * into | 893 * into |
894 * @param pos The position of the rule text in toInsertInto | 894 * @param pos The position of the rule text in toInsertInto |
895 */ | 895 */ |
896 void | 896 void |
897 ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto,
int32_t _pos) const | 897 ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto,
int32_t _pos, UErrorCode& status) const |
898 { | 898 { |
899 // if this isn't a >>> substitution, just use the inherited version | 899 // if this isn't a >>> substitution, just use the inherited version |
900 // of this function (which uses either a rule set or a DecimalFormat | 900 // of this function (which uses either a rule set or a DecimalFormat |
901 // to format its substitution value) | 901 // to format its substitution value) |
902 if (ruleToUse == NULL) { | 902 if (ruleToUse == NULL) { |
903 NFSubstitution::doSubstitution(number, toInsertInto, _pos); | 903 NFSubstitution::doSubstitution(number, toInsertInto, _pos, status); |
904 | 904 |
905 // a >>> substitution goes straight to a particular rule to | 905 // a >>> substitution goes straight to a particular rule to |
906 // format the substitution value | 906 // format the substitution value |
907 } else { | 907 } else { |
908 int64_t numberToFormat = transformNumber(number); | 908 int64_t numberToFormat = transformNumber(number); |
909 ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos()); | 909 ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos(), statu
s); |
910 } | 910 } |
911 } | 911 } |
912 | 912 |
913 /** | 913 /** |
914 * If this is a >>> substitution, use ruleToUse to fill in | 914 * If this is a >>> substitution, use ruleToUse to fill in |
915 * the substitution. Otherwise, just use the superclass function. | 915 * the substitution. Otherwise, just use the superclass function. |
916 * @param number The number being formatted | 916 * @param number The number being formatted |
917 * @toInsertInto The string to insert the result of this substitution | 917 * @toInsertInto The string to insert the result of this substitution |
918 * into | 918 * into |
919 * @param pos The position of the rule text in toInsertInto | 919 * @param pos The position of the rule text in toInsertInto |
920 */ | 920 */ |
921 void | 921 void |
922 ModulusSubstitution::doSubstitution(double number, UnicodeString& toInsertInto,
int32_t _pos) const | 922 ModulusSubstitution::doSubstitution(double number, UnicodeString& toInsertInto,
int32_t _pos, UErrorCode& status) const |
923 { | 923 { |
924 // if this isn't a >>> substitution, just use the inherited version | 924 // if this isn't a >>> substitution, just use the inherited version |
925 // of this function (which uses either a rule set or a DecimalFormat | 925 // of this function (which uses either a rule set or a DecimalFormat |
926 // to format its substitution value) | 926 // to format its substitution value) |
927 if (ruleToUse == NULL) { | 927 if (ruleToUse == NULL) { |
928 NFSubstitution::doSubstitution(number, toInsertInto, _pos); | 928 NFSubstitution::doSubstitution(number, toInsertInto, _pos, status); |
929 | 929 |
930 // a >>> substitution goes straight to a particular rule to | 930 // a >>> substitution goes straight to a particular rule to |
931 // format the substitution value | 931 // format the substitution value |
932 } else { | 932 } else { |
933 double numberToFormat = transformNumber(number); | 933 double numberToFormat = transformNumber(number); |
934 | 934 |
935 ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos()); | 935 ruleToUse->doFormat(numberToFormat, toInsertInto, _pos + getPos(), statu
s); |
936 } | 936 } |
937 } | 937 } |
938 | 938 |
939 //----------------------------------------------------------------------- | 939 //----------------------------------------------------------------------- |
940 // parsing | 940 // parsing |
941 //----------------------------------------------------------------------- | 941 //----------------------------------------------------------------------- |
942 | 942 |
943 /** | 943 /** |
944 * If this is a >>> substitution, match only against ruleToUse. | 944 * If this is a >>> substitution, match only against ruleToUse. |
945 * Otherwise, use the superclass function. | 945 * Otherwise, use the superclass function. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 * If in "by digits" mode, fills in the substitution one decimal digit | 1050 * If in "by digits" mode, fills in the substitution one decimal digit |
1051 * at a time using the rule set containing this substitution. | 1051 * at a time using the rule set containing this substitution. |
1052 * Otherwise, uses the superclass function. | 1052 * Otherwise, uses the superclass function. |
1053 * @param number The number being formatted | 1053 * @param number The number being formatted |
1054 * @param toInsertInto The string to insert the result of formatting | 1054 * @param toInsertInto The string to insert the result of formatting |
1055 * the substitution into | 1055 * the substitution into |
1056 * @param pos The position of the owning rule's rule text in | 1056 * @param pos The position of the owning rule's rule text in |
1057 * toInsertInto | 1057 * toInsertInto |
1058 */ | 1058 */ |
1059 void | 1059 void |
1060 FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInser
tInto, int32_t _pos) const | 1060 FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInser
tInto, |
| 1061 int32_t _pos, UErrorCode& status) con
st |
1061 { | 1062 { |
1062 // if we're not in "byDigits" mode, just use the inherited | 1063 // if we're not in "byDigits" mode, just use the inherited |
1063 // doSubstitution() routine | 1064 // doSubstitution() routine |
1064 if (!byDigits) { | 1065 if (!byDigits) { |
1065 NFSubstitution::doSubstitution(number, toInsertInto, _pos); | 1066 NFSubstitution::doSubstitution(number, toInsertInto, _pos, status); |
1066 | 1067 |
1067 // if we're in "byDigits" mode, transform the value into an integer | 1068 // if we're in "byDigits" mode, transform the value into an integer |
1068 // by moving the decimal point eight places to the right and | 1069 // by moving the decimal point eight places to the right and |
1069 // pulling digits off the right one at a time, formatting each digit | 1070 // pulling digits off the right one at a time, formatting each digit |
1070 // as an integer using this substitution's owning rule set | 1071 // as an integer using this substitution's owning rule set |
1071 // (this is slower, but more accurate, than doing it from the | 1072 // (this is slower, but more accurate, than doing it from the |
1072 // other end) | 1073 // other end) |
1073 } else { | 1074 } else { |
1074 // int32_t numberToFormat = (int32_t)uprv_round(transformNumber(num
ber) * uprv_pow(10, kMaxDecimalDigits)); | 1075 // int32_t numberToFormat = (int32_t)uprv_round(transformNumber(num
ber) * uprv_pow(10, kMaxDecimalDigits)); |
1075 // // this flag keeps us from formatting trailing zeros. It starts | 1076 // // this flag keeps us from formatting trailing zeros. It starts |
(...skipping 21 matching lines...) Expand all Loading... |
1097 for (int32_t didx = dl.getCount()-1; didx>=dl.getDecimalAt(); didx--) { | 1098 for (int32_t didx = dl.getCount()-1; didx>=dl.getDecimalAt(); didx--) { |
1098 // Loop iterates over fraction digits, starting with the LSD. | 1099 // Loop iterates over fraction digits, starting with the LSD. |
1099 // include both real digits from the number, and zeros | 1100 // include both real digits from the number, and zeros |
1100 // to the left of the MSD but to the right of the decimal point. | 1101 // to the left of the MSD but to the right of the decimal point. |
1101 if (pad && useSpaces) { | 1102 if (pad && useSpaces) { |
1102 toInsertInto.insert(_pos + getPos(), gSpace); | 1103 toInsertInto.insert(_pos + getPos(), gSpace); |
1103 } else { | 1104 } else { |
1104 pad = TRUE; | 1105 pad = TRUE; |
1105 } | 1106 } |
1106 int64_t digit = didx>=0 ? dl.getDigit(didx) - '0' : 0; | 1107 int64_t digit = didx>=0 ? dl.getDigit(didx) - '0' : 0; |
1107 getRuleSet()->format(digit, toInsertInto, _pos + getPos()); | 1108 getRuleSet()->format(digit, toInsertInto, _pos + getPos(), status); |
1108 } | 1109 } |
1109 | 1110 |
1110 if (!pad) { | 1111 if (!pad) { |
1111 // hack around lack of precision in digitlist. if we would end up with | 1112 // hack around lack of precision in digitlist. if we would end up with |
1112 // "foo point" make sure we add a " zero" to the end. | 1113 // "foo point" make sure we add a " zero" to the end. |
1113 getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos()); | 1114 getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos(), status); |
1114 } | 1115 } |
1115 } | 1116 } |
1116 } | 1117 } |
1117 | 1118 |
1118 //----------------------------------------------------------------------- | 1119 //----------------------------------------------------------------------- |
1119 // parsing | 1120 // parsing |
1120 //----------------------------------------------------------------------- | 1121 //----------------------------------------------------------------------- |
1121 | 1122 |
1122 /** | 1123 /** |
1123 * If in "by digits" mode, parses the string as if it were a string | 1124 * If in "by digits" mode, parses the string as if it were a string |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 // AbsoluteValueSubstitution | 1223 // AbsoluteValueSubstitution |
1223 //=================================================================== | 1224 //=================================================================== |
1224 | 1225 |
1225 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(AbsoluteValueSubstitution) | 1226 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(AbsoluteValueSubstitution) |
1226 | 1227 |
1227 //=================================================================== | 1228 //=================================================================== |
1228 // NumeratorSubstitution | 1229 // NumeratorSubstitution |
1229 //=================================================================== | 1230 //=================================================================== |
1230 | 1231 |
1231 void | 1232 void |
1232 NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto
, int32_t apos) const { | 1233 NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto
, int32_t apos, UErrorCode& status) const { |
1233 // perform a transformation on the number being formatted that | 1234 // perform a transformation on the number being formatted that |
1234 // is dependent on the type of substitution this is | 1235 // is dependent on the type of substitution this is |
1235 | 1236 |
1236 double numberToFormat = transformNumber(number); | 1237 double numberToFormat = transformNumber(number); |
1237 int64_t longNF = util64_fromDouble(numberToFormat); | 1238 int64_t longNF = util64_fromDouble(numberToFormat); |
1238 | 1239 |
1239 const NFRuleSet* aruleSet = getRuleSet(); | 1240 const NFRuleSet* aruleSet = getRuleSet(); |
1240 if (withZeros && aruleSet != NULL) { | 1241 if (withZeros && aruleSet != NULL) { |
1241 // if there are leading zeros in the decimal expansion then emit them | 1242 // if there are leading zeros in the decimal expansion then emit them |
1242 int64_t nf =longNF; | 1243 int64_t nf =longNF; |
1243 int32_t len = toInsertInto.length(); | 1244 int32_t len = toInsertInto.length(); |
1244 while ((nf *= 10) < denominator) { | 1245 while ((nf *= 10) < denominator) { |
1245 toInsertInto.insert(apos + getPos(), gSpace); | 1246 toInsertInto.insert(apos + getPos(), gSpace); |
1246 aruleSet->format((int64_t)0, toInsertInto, apos + getPos()); | 1247 aruleSet->format((int64_t)0, toInsertInto, apos + getPos(), status); |
1247 } | 1248 } |
1248 apos += toInsertInto.length() - len; | 1249 apos += toInsertInto.length() - len; |
1249 } | 1250 } |
1250 | 1251 |
1251 // if the result is an integer, from here on out we work in integer | 1252 // if the result is an integer, from here on out we work in integer |
1252 // space (saving time and memory and preserving accuracy) | 1253 // space (saving time and memory and preserving accuracy) |
1253 if (numberToFormat == longNF && aruleSet != NULL) { | 1254 if (numberToFormat == longNF && aruleSet != NULL) { |
1254 aruleSet->format(longNF, toInsertInto, apos + getPos()); | 1255 aruleSet->format(longNF, toInsertInto, apos + getPos(), status); |
1255 | 1256 |
1256 // if the result isn't an integer, then call either our rule set's | 1257 // if the result isn't an integer, then call either our rule set's |
1257 // format() method or our DecimalFormat's format() method to | 1258 // format() method or our DecimalFormat's format() method to |
1258 // format the result | 1259 // format the result |
1259 } else { | 1260 } else { |
1260 if (aruleSet != NULL) { | 1261 if (aruleSet != NULL) { |
1261 aruleSet->format(numberToFormat, toInsertInto, apos + getPos()); | 1262 aruleSet->format(numberToFormat, toInsertInto, apos + getPos(), stat
us); |
1262 } else { | 1263 } else { |
1263 UErrorCode status = U_ZERO_ERROR; | |
1264 UnicodeString temp; | 1264 UnicodeString temp; |
1265 getNumberFormat()->format(numberToFormat, temp, status); | 1265 getNumberFormat()->format(numberToFormat, temp, status); |
1266 toInsertInto.insert(apos + getPos(), temp); | 1266 toInsertInto.insert(apos + getPos(), temp); |
1267 } | 1267 } |
1268 } | 1268 } |
1269 } | 1269 } |
1270 | 1270 |
1271 UBool | 1271 UBool |
1272 NumeratorSubstitution::doParse(const UnicodeString& text, | 1272 NumeratorSubstitution::doParse(const UnicodeString& text, |
1273 ParsePosition& parsePosition, | 1273 ParsePosition& parsePosition, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1355 // NullSubstitution | 1355 // NullSubstitution |
1356 //=================================================================== | 1356 //=================================================================== |
1357 | 1357 |
1358 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NullSubstitution) | 1358 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NullSubstitution) |
1359 | 1359 |
1360 U_NAMESPACE_END | 1360 U_NAMESPACE_END |
1361 | 1361 |
1362 /* U_HAVE_RBNF */ | 1362 /* U_HAVE_RBNF */ |
1363 #endif | 1363 #endif |
1364 | 1364 |
OLD | NEW |