C: Quelle est la méthode portable / safe (thread aware) pour convertir un nombre en chaîne sans parameters régionaux?

Quel est le moyen sûr / portable de convertir un nombre en chaîne (et inversement)?

Je suis sous Linux et mes parameters régionaux sont tels que, lorsque j’utilise des nombres sprintf, ils ont un “,” au lieu d’un “.” en tant que séparateur.

Parfois, je les veux comme ça, parfois non 🙂

J’ai vu des solutions qui impliquent de jouer avec les parameters des utilisateurs. Clairement, c’est une chose à ne pas faire. Quelqu’un a suggéré d’utiliser uselocale

snprintf: moyen simple de forcer. comme radix?

Quelqu’un peut-il élaborer un peu (cela ressemble à un bug de certaines glibc (<2.12)) et, si possible, fournir un exemple de code (par exemple une macro SNPRINTF_POSIX).

Je me suis essayé mais mes compétences en C sont très limitées.

[modifier]

Je trouve ce code de [GO] Skywalker13 sur Swisslinux.org après avoir écrit ma question. Des idées à ce sujet? Qu’en est-il de l’utilisation de la mémoire? (Je dois faire de nombreux appels à cette fonction)

#define _GNU_SOURCE #include  #include  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; } 

Avec POSIX 2008, vous pouvez utiliser les fonctions newlocale et uselocale pour modifier temporairement les parameters régionaux dans le thread actuel sans affecter les autres threads. C’est vraiment la seule solution, à part ne jamais définir la catégorie de parameters régionaux LC_NUMERIC . Par ailleurs, je préfère interdire l’utilisation de LC_NUMERIC dans les logiciels que j’écris, au moins pour l’environnement local. Ensuite, vous pouvez utiliser newlocale et uselocale localement à l’endroit souhaité pour un formatage numérique uselocale aux conventions culturelles de l’utilisateur. Sur les systèmes dépourvus de POSIX 2008 uselocale , laissez simplement de côté l’impression numérique localisée.