14 Stimmen

Wie drucke ich ein Doppel mit einem Komma?

In C++ habe ich eine Float/Double-Variable.

Wenn ich dies z. B. mit cout ausdrucke, wird die resultierende Zeichenfolge durch Punkte getrennt.

cout << 3.1415 << endl
$> 3.1415

Gibt es eine einfache Möglichkeit, das Doppel mit einem Komma zu drucken?

cout << 3.1415 << endl
$> 3,1415

14voto

Éric Malenfant Punkte 13670

imbue() cout mit einer locale deren numpunct die Facette decimal_point() Funktion gibt ein Komma zurück.

Die Erlangung eines solchen locale kann auf verschiedene Weise erfolgen. Sie können ein benanntes Gebietsschema verwenden, das auf Ihrem System verfügbar ist ( std::locale("fr") vielleicht). Alternativ könnten Sie auch eine eigene Zahl ableiten, die do_decimal_point() Mitglied darin.

Beispiel für den zweiten Ansatz:

template<typename CharT>
class DecimalSeparator : public std::numpunct<CharT>
{
public:
    DecimalSeparator(CharT Separator)
    : m_Separator(Separator)
    {}

protected:
    CharT do_decimal_point()const
    {
        return m_Separator;
    }

private:
    CharT m_Separator;
};

Verwendet als:

std::cout.imbue(std::locale(std::cout.getloc(), new DecimalSeparator<char>(',')));

4voto

Warren Young Punkte 38737

Dies wird durch das Gebietsschema Ihres Programms gesteuert.

Wie Sie das Standardgebietsschema eines Programms festlegen, hängt von der Plattform ab. Auf Plattformen vom Typ POSIX geschieht dies zum Beispiel mit den Umgebungsvariablen LANG und LC_*.

Sie können ein bestimmtes Gebietsschema - abweichend vom Standard - in einem C++-Programm erzwingen, indem Sie ios::imbue aufrufen. Etwas wie dies könnte funktionieren:

#include <locale>
cout.imbue(std::locale("German_germany"));

Die Idee ist, ein Gebietsschema zu erzwingen, in dem das Komma das Dezimaltrennzeichen ist. Möglicherweise müssen Sie die Zeichenfolge "German_germany" anpassen, um das gewünschte Verhalten auf Ihrer speziellen Plattform zu erreichen.

3voto

me22 Punkte 651

Sie müssen den Stream mit einem anderen Gebietsschema imputieren, einem, dessen Facette num_punct (iirc) ein Komma vorgibt.

Wenn das Gebietsschema Ihrer Plattform mit Kommas formatiert wird, dann

cout.imbue(locale(""));

sollte ausreichend sein.

1voto

MSalters Punkte 166675

Genauer gesagt, wird dies durch die Funktion std::numpunct<charT>::decimal_point() Wert. Sie können imbue() einem anderen Ort mit einem anderen decimal_point()

0voto

jannep Punkte 1

Alter Thread, aber trotzdem ... Man sollte sich bewusst sein, dass die Verwendung eines std::locale macht die Zeichenkette "hübsch", komplett mit korrektem Dezimalpunkt, Tausendertrennzeichen und so weiter, je nach Plattform und Gebietsschema. Höchstwahrscheinlich ist die Verwendung von imbue() bricht das Parsen der Zeichenkette ab, nachdem sie formatiert wurde. Zum Beispiel:

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();

Ergibt die folgende Ausgabe:
without locale: 1234.56
with fr locale: 1 234,56

Verwendung von strtod() oder ähnliches auf die zweite Zeichenkette wird wahrscheinlich nicht sehr gut funktionieren ... Außerdem ist das Leerzeichen zwischen "1" und "2" in der zweiten Ausgabezeichenfolge ein nicht umbrechendes Leerzeichen, was die Zeichenfolge noch hübscher macht :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X