数字转换为字符串的安全/可移植方法是什么(反之亦然)?
我在 Linux 上,我的设置区域设置是这样,当我使用 sprintf 数字时,有一个","而不是"."作为分隔符。
有时我希望他们这样,有时不是:)
我看到了一些意味着使用用户设置的解决方案。显然,这是不应该做的事情。有人建议使用 uselocale
SNprintf : 简单的强制方法. 作为基数?
有人可以详细说明一下(看起来像是某些glibc(<2.12)上的错误),如果可能的话,提供一些示例代码(例如宏SNPRINTF_POSIX)。
我尝试过自己,但我的C技能非常有限。
[编辑]
我在写完问题后 Swisslinux.org 上找到了 [GO]Skywalker13 的这段代码。有什么想法吗?内存使用情况呢?(我需要向此功能拨打大量电话)
#define _GNU_SOURCE
#include <locale.h>
#include <stdlib.h>
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 中,您可以使用 newlocale
和 uselocale
函数临时更改当前线程中的区域设置,而不会影响其他线程。这确实是唯一的解决方案,除了从不设置LC_NUMERIC
区域设置类别之外。另一方面,我更喜欢禁止在我编写的软件中使用LC_NUMERIC
,至少对于全局区域设置。然后,您可以在需要与用户的区域性约定匹配的数字格式时在本地使用 newlocale
和uselocale
,而在缺少 POSIX 2008 uselocale
的系统上,只需省略本地化的数字打印即可。