C:将数字转换为没有语言环境设置的字符串的便携式/安全(线程感知)方法是什么



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

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