blob: aa18c67ea1d625c9989c2f75651686b2e3636a7d [file] [log] [blame]
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);