C: Каков переносимый/безопасный (с поддержкой потоков) способ преобразования числа в строку без настроек локали?

Каков безопасный/портативный способ преобразования числа в строку (и наоборот)?

Я работаю в Linux, и мои настройки локали таковы, что когда я использую номера sprintf, у них есть «,» вместо «.» как разделитель.

Иногда мне так хочется, иногда нет :)

Я видел некоторые решения, которые подразумевают игру с настройками пользователей. Ясно, что этого делать не следует. Кто-то предложил использовать uselocale

snprintf: простой способ принудительно . как основание?

может кто-нибудь немного уточнить (похоже, что это ошибка в некоторых glibc (‹2.12)) и, если возможно, предоставить пример кода (например, макрос SNPRINTF_POSIX).

Я пробовал сам, но мои навыки C очень ограничены.

[редактировать]

Я нашел этот код [GO]Skywalker13 на Swisslinux.org после того, как написал свой вопрос. Есть мысли по этому поводу? А как насчет использования памяти? (Мне нужно сделать несколько вызовов этой функции)

#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;
} 

person frenchone    schedule 12.05.2011    source источник


Ответы (1)


В POSIX 2008 вы можете использовать функции newlocale и uselocale для временного изменения локали в текущем потоке, не затрагивая другие потоки. Это действительно единственное решение, если не считать того, что с самого начала не следует устанавливать категорию локали LC_NUMERIC. С другой стороны, я предпочитаю запретить использование LC_NUMERIC в программном обеспечении, которое я пишу, по крайней мере, для глобальной локали. Затем вы можете использовать newlocale и uselocale локально в том месте, где вы хотите числовое форматирование, соответствующее культурным традициям вашего пользователя, а в системах, в которых отсутствует POSIX 2008 uselocale, просто не печатайте локализованную цифровую печать.

person R.. GitHub STOP HELPING ICE    schedule 12.05.2011