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