// XXX at least Debian 8.4 has a bug in newlocale where it doesn't
// change the decimal separator unless you set LC_TIME!
if (newloc)
- newloc = newlocale(LC_TIME, "C", newloc);
+ {
+ duploc = newloc; // original duploc has been freed by newlocale()
+ newloc = newlocale(LC_TIME, "C", duploc);
+ }
if (newloc == NULL)
{
freelocale(duploc);
return NULL;
}
+ uselocale(newloc);
}
#elif defined(HAVE_SETLOCALE)
{
MC_SET_DEBUG(1);
new_obj = json_tokener_parse("[1.2,3.4,123456.78,5.0,2.3e10]");
- printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
- printf("new_obj.to_string()=%s\n", json_object_to_json_string_ext(new_obj,JSON_C_TO_STRING_NOZERO));
- json_object_put(new_obj);
(void)snprintf(buf2, sizeof(buf2), "%f", 0.1);
if (strcmp(buf1, buf2) != 0)
printf("ERROR: Original locale not restored \"%s\" != \"%s\"",
buf1, buf2);
+
+#ifdef HAVE_SETLOCALE
+ setlocale(LC_NUMERIC, "C");
+#endif
+
+ // Explicitly print each value, to avoid having the "special"
+ // serialization done for parsed doubles simply re-emit the original
+ // string that was parsed. (see json_object_new_double_s())
+ printf("new_obj.to_string()=[");
+ unsigned int ii;
+ for (ii = 0 ; ii < json_object_array_length(new_obj); ii++)
+ {
+ json_object *val = json_object_array_get_idx(new_obj, ii);
+ printf("%s%.2lf", (ii > 0) ? "," : "", json_object_get_double(val));
+ }
+ printf("]\n");
+
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string_ext(new_obj,JSON_C_TO_STRING_NOZERO));
+ json_object_put(new_obj);
}
-new_obj.to_string()=[ 1.2, 3.4, 123456.78, 5.0, 2.3e10 ]
+new_obj.to_string()=[1.20,3.40,123456.78,5.00,23000000000.00]
new_obj.to_string()=[1.2,3.4,123456.78,5.0,2.3e10]