My program was not behaving correctly on one machine so I started to hunt for the bug, and I discovered that on that machine, snprintf uses a comma (,), not a . (dot) as 99% of other computers (at least in my experience).
Shouldn't this be standardized?
I am using a library that assumes that the radix is a . (dot) and so it does not work properly with a comma.
So my question is, is there a simple way to force the dot as the radix character? I know I could just search & replace the comma by a dot manually, but surely there is a cleaner way.
For library code, you may wish to use the POSIX 2008
uselocale
function instead ofsetlocale
. It is able to set a thread-specific locale, so that if your library code is called from a program that uses threads, it won't mess up the other threads' behavior (and/or crash the program, sincesetlocale
is not thread-safe).For application code, you should simply avoid ever setting the
LC_NUMERIC
locale category to anything but C/POSIX. The only categories you really need to set for most applications areLC_CTYPE
,LC_MESSAGES
, and possiblyLC_COLLATE
.You should be able to change your locale-setting using the
setlocale
-function to make snprintf use a dot. Try setting it to "POSIX" or "C". (setlocale(LC_ALL, "POSIX")
.
versus,
is set by theLC_NUMERIC
part of the locale. So make sure you set your program to use a locale that uses the.
(such as"POSIX"
).