C:将数字转换为没有区域设置的字符串的可移植/安全(线程感知)方法是什么?

将数字转换为字符串的安全/可移植方式是什么(反之亦然)?

我在Linux上,我的设置区域设置是这样的,当我使用sprintf时,数字有一个“,”而不是“。” 作为分隔符。

有时我想要那样,有时候不是:)

我看到了一些暗示玩用户设置的解决方案。 显然,这是一个不该做的事情。 有人建议使用uselocale

snprintf:简单的强制方式。 作为基数?

可以有人详细说明(看起来它在某些glibc(<2.12)上有问题)并且如果可能的话提供一些示例代码(例如宏SNPRINTF_POSIX)。

我试过自己,但我的C技能非常有限。

[编辑]

在写完我的问题后,我在Swisslinux.org上的[GO] Skywalker13找到了这段代码。 有什么想法吗? 内存使用情况怎么样? (我需要多次调用此函数)

#define _GNU_SOURCE #include  #include  double my_atof (const char *nptr) { double res; locale_t new_locale; new_locale = newlocale (LC_NUMERIC_MASK, "C", NULL); res = strtod_l (nptr, NULL, new_locale); freelocale (new_locale); return res; } 

使用POSIX 2008,您可以使用newlocaleuselocale函数临时更改当前线程中的区域设置,而不会影响其他线程。 除了从未设置LC_NUMERIC语言环境类别之外,这实际上是唯一的解决方案。 另一方面,我更喜欢禁止在我写的软件中使用LC_NUMERIC ,至少对于全局语言环境而言。 然后,您可以在需要与用户的文化约定匹配的数字格式的位置本地使用newlocaleuselocale ,并且在缺少POSIX 2008 uselocale系统上,只需省略本地化的数字打印。