| Index: source/i18n/digitlst.cpp |
| =================================================================== |
| --- source/i18n/digitlst.cpp (revision 88316) |
| +++ source/i18n/digitlst.cpp (working copy) |
| @@ -60,6 +60,18 @@ |
| |
| U_NAMESPACE_BEGIN |
| |
| +static void |
| +loadDecimalChar() { |
| + if (gDecimal == 0) { |
| + char rep[MAX_DIGITS]; |
| + // For machines that decide to change the decimal on you, |
| + // and try to be too smart with localization. |
| + // This normally should be just a '.'. |
| + sprintf(rep, "%+1.1f", 1.0); |
| + gDecimal = rep[2]; |
| + } |
| +} |
| + |
| // ------------------------------------- |
| // default constructor |
| |
| @@ -398,15 +410,6 @@ |
| } |
| DigitList *nonConstThis = const_cast<DigitList *>(this); |
| |
| - if (gDecimal == 0) { |
| - char rep[MAX_DIGITS]; |
| - // For machines that decide to change the decimal on you, |
| - // and try to be too smart with localization. |
| - // This normally should be just a '.'. |
| - sprintf(rep, "%+1.1f", 1.0); |
| - gDecimal = rep[2]; |
| - } |
| - |
| if (isZero()) { |
| nonConstThis->fDouble = 0.0; |
| if (decNumberIsNegative(fDecNumber)) { |
| @@ -441,6 +444,7 @@ |
| } |
| U_ASSERT(uprv_strlen(&s[0]) < MAX_DBL_DIGITS+18); |
| |
| + loadDecimalChar(); |
| if (gDecimal != '.') { |
| char *decimalPt = strchr(s, '.'); |
| if (decimalPt != NULL) { |
| @@ -727,6 +731,17 @@ |
| sprintf(rep, "%+1.*e", MAX_DBL_DIGITS - 1, source); |
| U_ASSERT(uprv_strlen(rep) < sizeof(rep)); |
| |
| + // uprv_decNumberFromString() will parse the string expecting '.' as a |
| + // decimal separator, however sprintf() can use ',' in certain locales. |
| + // Overwrite a different decimal separator with '.' here before proceeding. |
| + loadDecimalChar(); |
| + if (gDecimal != '.') { |
| + char *decimalPt = strchr(rep, gDecimal); |
| + if (decimalPt != NULL) { |
| + *decimalPt = '.'; |
| + } |
| + } |
| + |
| // Create a decNumber from the string. |
| uprv_decNumberFromString(fDecNumber, rep, &fContext); |
| uprv_decNumberTrim(fDecNumber); |