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

fre*_*one 5 c locale glibc

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

我在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;
} 
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 5

使用POSIX 2008,您可以使用newlocaleuselocale函数临时更改当前线程中的区域设置,而不会影响其他线程.这是唯一的解决方案,除了从未设置LC_NUMERIC区域设置类别.另一方面,我更喜欢禁止LC_NUMERIC在我写的软件中使用,至少对于全局语言环境.然后你可以使用newlocaleuselocale在要符合用户的文化习惯数字格式的本地点,以及缺少POSIX 2008系统uselocale,只是离开了本地化的数字印刷.