Stream Formatierung: Punkt durch Komma ersetzen bei Floats



  • Hallo,

    folgendes Problem, ein float soll Formatiert dargestellt werden, allerdings soll der Punkt durch ein Komma ersetzt werden, man könnte typecasten und dann ersetzen, vielleicht gibt es aber auch einen Stream Manipulator wie in "iomanip".
    Da ich nicht allzuviel Ahnung von c++ habe, wäre nett wenn sich jemand melden würde.

    Danke

    Illu



  • Hallo,
    wenn du eine Floating-Point-Zahl in einen Ausgabestream schreibst, entscheidet das numpunct-Facet des installierten locale-Objekts, wie der Dezimalpunkt dargestellt wird. Das standardmäßig installierte C-Locale-Objekt schreibt einen '.'. Wenn du aber z.B. ein Deutsches-Locale-Objekt installierst, wird ein ',' geschrieben. Alternativ kannst du natürlich auch einfach ein eigenes numpunct-Facet schreiben und installieren.

    #include <iostream>
    #include <locale>
    using namespace std;
    int main()
    {
      // angenommen dein Compiler kennt ein deutsches Locale namens deu
      locale old = cout.imbue(locale("deu"));
      cout << 3.124 << endl;
      cout.imbue(old);
    }
    

    Oder auch:

    #include <iostream>
    #include <locale>
    using namespace std;
    
    class CommaAsDecimalPoint : public numpunct_byname<char>
    {
    public:
      CommaAsDecimalPoint(const char* name)
        : numpunct_byname<char>(name)
      {}
    protected:
      char do_decimal_point() const
      {
        return ',';
      }
    };
    
    int main()
    {
      locale l(locale(""), new CommaAsDecimalPoint(""));
      locale old = cout.imbue(l);
      cout << 3.124 << endl;
      cout.imbue(old);
    }
    


  • Hallo,
    durch die Suchfunktion bin ich auf die Lösung mit dem numpunct-facet gestoßen.
    Habs auch gleich mal ausprobiert, nur beim übersetzen bekomme ich folgende Meldung:

    error C2664: '__thiscall std::locale::std::locale(const char *,int)' : Konvertierung des Parameters 1 von 'class std::locale' in 'const char *' nicht moeglich
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
    Fehler beim Ausführen von cl.exe.

    Ist vermutl. eine Anfängerfrage, aber ich komme abolut nicht weiter.


  • Administrator

    Zeig mal her, wie du probiert hast, das std::local zu erzeugen. Der Code von HumeSikkins ist absolut korrekt und kompiliert einwandfrei. Vermutlich hast du nur etwas falsch abgeschrieben.

    Grüssli



  • @bob.george
    Kann eigentlich nicht sein, laut cpp-reference stimmt der Code. Zeig mal deinen und welchen Compiler benutzt du?

    EDIT:
    Da war einer schneller...



  • Habs eigentlich per Copy&Paste übernommen.

    Hier die Header-Datei test.h:

    #include <iostream>
    #include <locale>
    using namespace std;
    
    class CommaAsDecimalPoint : public numpunct_byname<char>
    {
    public:
      CommaAsDecimalPoint(const char* name)
        : numpunct_byname<char>(name)
      {}
    protected:
      char do_decimal_point() const
      {
        return ',';
      }
    };
    

    ...und hier die test.cpp

    #include "test.h"
    
    void main()
    {
      locale l(locale(""), new CommaAsDecimalPoint(""));
      locale old = cout.imbue(l);
      cout << 3.124 << endl;
      cout.imbue(old);
    }
    

    Compiler ist Visual C++ 6.0.



  • Bitte Cpp-Tags (unter dem Lachsmiley) benutzen 😉 . Das Problem wird dein Compiler sein. Ich schätze mal das du eine andere "Version" von std::locale hast. Bei mir zumindest funktionuckelt der Code...

    Ich denke mal das jeden Augenblick ein haxx0r-progg0r wie Dravere postet und mehr darüber weiß^^.


  • Administrator

    bob.george schrieb:

    Compiler ist Visual C++ 6.0.

    Da haben wir das Problem. Schmeiss das Ding weg, verbrenne es, und entsorg die Asche als Sondermüll 😃
    Das Ding ist nicht nur veraltet, sondern die Unterstützung für C++ ist miserabel und entspricht nicht dem Standard von 1998. Ein Update wäre dringend angebracht. Visual C++ 2008 Express Edition bekommst du gratis 😉

    Grüssli

    PS: Nächstes mal Code-Tags verwenden, bzw. C/C++ Tags [cpp].


  • Administrator

    Kóyaánasqatsi schrieb:

    Ich denke mal das jeden Augenblick ein haxx0r-progg0r wie Dravere postet und mehr darüber weiß^^.

    haxx0r-progg0r? Ich? Ne! 🕶

    Grüssli



  • Hm, is halt im Unternehmen derzeit der Standard-Compiler. Blöd, aber trotzdem vielen Dank!



  • bob.george schrieb:

    Hm, is halt im Unternehmen derzeit der Standard-Compiler. Blöd, aber trotzdem vielen Dank!

    Die Lizenzen waren scheinbar billiger 😃 . Aber mal ernsthaft; Es wird von euch verlangt das ihr C++ mit VS-C++ 06 proggt?


  • Administrator

    bob.george schrieb:

    Hm, is halt im Unternehmen derzeit der Standard-Compiler. Blöd, aber trotzdem vielen Dank!

    Schlag denen mal ein Update vor. Wobei ... wahrscheinlich wäre das noch ziemlich teuer, da grosse Teile des alten Codes nicht mehr funktionieren würden. Trotzdem sollten sie es mal tun, spätestens wenn dann die Kompiler für den nächsten Standard kommen, denn dann sind sie bereits zwei Standards hinten nach 😉

    Ich weiss leider nicht, wo man noch Dokumentationen zum Visual C++ 6.0 findet. Ich habe nur noch sehr kurz mit dem gearbeitet und bin dann rasch auf den Kompiler 2003 umgestiegen. Vielleicht wissen es noch ein paar ältere Herren hier im Forum. Aber bis die über die Strasse kommen, dauert es manchmal ein wenig ... 🤡 😃

    Grüssli



  • @Dravere: das ist genau das Problem. Die Kosten des Umstiegs sind sehr hoch und es fehlt einfach an Zeit. Ich bin hier zwar so eine Art Insel, aber deswegen möchte ich trotzdem lieber beim Unternehmensstandard bleiben.


Anmelden zum Antworten