- struct lconv *lconv;
- const char *oldlocale = setlocale (LC_NUMERIC, "");
- lconv = localeconv ();
- cached_sep = xstrdup (lconv->thousands_sep);
- cached_grouping = xstrdup (lconv->grouping);
- /* Restore the locale to previous settings. */
- setlocale (LC_NUMERIC, oldlocale);
- if (!cached_sep)
-#endif
- /* Force separator for locales that specify no separators
- ("C", "hr", and probably many more.) */
- cached_sep = ",", cached_grouping = "\x03";
+ struct lconv *lconv = localeconv ();
+ cached_sep = lconv->thousands_sep;
+ cached_grouping = lconv->grouping;
+ if (!*cached_sep)
+ {
+ /* Many locales (such as "C" or "hr_HR") don't specify
+ grouping, which we still want to use it for legibility.
+ In those locales set the sep char to ',', unless that
+ character is used for decimal point, in which case set it
+ to " ". */
+ if (*lconv->decimal_point != ',')
+ cached_sep = ",";
+ else
+ cached_sep = " ";
+ cached_grouping = "\x03";
+ }