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(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);