【问题标题】:C: What is the portable/safe(thread aware) way to convert a number to a string w/o locale settings?C:将数字转换为不带区域设置的字符串的可移植/安全(线程感知)方法是什么?
【发布时间】:2011-05-12 15:05:00
【问题描述】:

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

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

有时我想要它们,有时不是:)

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

snprintf : simple way to force . as radix?

有人可以详细说明一下(看起来它在某些 glibc (

我自己试过,但我的 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;
} 

【问题讨论】:

    标签: c locale glibc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2020-05-17
      相关资源
      最近更新 更多