en C ++ j'ai un flotteur / double variable.
Lorsque j'imprime cela avec, par exemple, la chaîne résultante est délimitée de période. p>
cout << 3.1415 << endl $> 3,1415
6 Réponses :
Ceci est contrôlé par la locale de votre programme.
Comment définir la localisation par défaut d'un programme dépend de la plate-forme. Sur les plates-formes de type POSIX, c'est avec les variables d'environnement LANG et LC_ *, par exemple. P>
Vous pouvez forcer une locale particulière - différente de la valeur par défaut - dans un programme C ++ en appelant iOS :: Impubue. Quelque chose comme ça pourrait fonctionner: p> L'idée est de forcer une locale où la virgule est le séparateur décimal. Vous devrez peut-être ajuster la chaîne "allemand_germanany" pour obtenir le comportement souhaité sur votre plate-forme particulière. P> p>
Utilisation de votre exemple Résultats dans: STD :: Erreur d'exécution Locale :: Facet :: _ s_create_c_locale Nom non valide
Vous devez nuire au flux avec une locale différente, dont la facette dont NUM_PUNCT (IIRC) spécifie une virgule.
Si votre paramètre locale de plate-forme avec des virgules, alors p>
Thx, votre réponse a fonctionné. Mais j'aimerais accepter une réponse qui sera plus générique (si vous n'êtes pas aussi chanceux avec le prérévisage local correct sur votre plate-forme). Toujours +1 parce que c'est la méthode la plus facile.
Pour être précis, celui-ci est contrôlé par le std :: numpunct
IMBUE () CODE> Un autre paramètre local avec un autre
décimal_point () code> p>
Obtention d'un tel Exemple de la deuxième approche: P> IMBUE () COUT CODE> avec un
Locale code> Quel
numpunct code> de la facette code> décimal_point () code> La fonction membre renvoie une virgule.
locale code> peut être effectué de plusieurs manières. Vous pouvez utiliser un local nommé disponible sur votre système (
std :: locale ("fr") code>, peut-être). Sinon, vous pouvez dériver votre propre numéro de votre propre numéro, implémenter le membre
do_decimal_point () code> membre. P>
std::cout.imbue(std::locale(std::cout.getloc(), new DecimalSeparator<char>(',')));
Utilisation de votre exemple Résultats dans: STD :: Erreur d'exécution Locale :: Facet :: _ s_create_c_locale Nom non valide
Cette erreur signifie probablement que, sur votre plate-forme, le nom "FR" ne lie pas à un lieu local.
J'ai deviné autant, mais comment pourriez-vous découvrir quels noms sont i> liés à un local.
Malheureusement, je ne pense pas qu'il y ait une manière portable.
Le savez-vous pour * Nix peut-être?
Sur Linux: la commande locale -a, mais je ne sais pas comment faire cela par programme.
La récupération de manière programmatique sur la locale n'était pas une exigence, cela fonctionne bien. Et je suppose que tout le monde a besoin de le faire de manière programmatique pourrait faire quelque chose de recherche-fu sur un appel système (). THX! Considérez votre réponse acceptée.
Un vieux fil, mais de toute façon ... il faut savoir que l'utilisation d'un std :: locale code> fait la chaîne "jolie", complète avec un point décimal correct, des milliers de séparateurs et de quoi ne pas, selon la plate-forme et la locale. La plupart probablement, en utilisant
IMBUE () code> enfreindra toute analyse de la chaîne après son formatage. Par exemple:
std::ostringstream s;
std::locale l("fr-fr");
s << "without locale: " << 1234.56L << std::endl;
s.imbue(l);
s << "with fr locale: " << 1234.56L << std::endl;
std::cout << s.str();
Très vieux fil, mais de toute façon ... J'avais le problème de remplir une entrée de texte sous GTKMM-3.0 avec le résultat d'un calcul de distance. Pour rendre les choses plus claires, j'ajoute un exemple, où j'ai concentré certaines sagesse de plusieurs postes, j'ai lu les derniers jours:
#include <locale> // next not necessary, added only for clarity #include <gtkmm-3.0/gtkmm.h> Gtk::Entry m_Text; // a distance measured in kilometers double totalDistance = 35.45678; std::stringstream str; // I am using locale of Germany, pay attention to the _ str.imbue(std::locale("de_DE")); // now we have decimal comma instead of point str << std::fixed << std::setprecision(4) << std::setw(16) << totalDistance << " km"; // the wished formatting corresponds to "%16.4f km" in printf m_Text.set_text(str.str());