Problem bei der formatierten Ausgabe einer Dezimalzahl

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Mike4711.

    Problem bei der formatierten Ausgabe einer Dezimalzahl

    Hallo zusammen,

    habe folgendes Problem bei der formatierten Ausgabe einer Dezimalzahl:

    In einer Datei sind Dezimalzahlen mit Nachkommastellen als Strings mit Komma getrennt gespeichert.

    Die Dezimalzahlen sollen formatiert mit Tausenderpunkt, Komma und zwei Nachkommastellen + "€" ausgegeben werden.

    Beispiel für einen String mit Namen "Wert1" wie er direkt aus der Datei kommt: "14853611.30".

    Ziel ist also die folgende Ausgabe: 14.853.611,30 €

    Habe versucht die Zahl wie folgt formatiert auszugeben:

    VB.NET-Quellcode

    1. Label1.Text = Format(CDec(Wert1), "##,##0.00 €")


    Ausgegeben wird aber dann: 1.485.361.130,0

    Wenn ich aber testweise folgenden Code schreibe:

    VB.NET-Quellcode

    1. Label1.Text = Format(14853611.3, "##,##0.00 €")


    erscheint die Ausgabe korrekt mit : 14.853.611,30 €

    Habe bereits vieles versucht, aber bisher ohne Erfolg.

    Hat jemand einen Tipp?

    Danke im Voraus.

    Mike
    Hallo Mike4711,

    ich schätze mal, dass da irgendwas mit deinem "Wert1" nicht stimmt. Ich bekomme nämlich das korrekte Ergebnis raus. Um mal bei deinem Beispiel zu bleiben:

    VB.NET-Quellcode

    1. Dim Wert1 As Decimal = 14853611.3
    2. Label1.Text = Format(CDec(Wert1), "##,##0.00 €").ToString

    Da du ebenfalls den korrekten Wert erhälst, wenn Du die Zahl händisch einträgst, gehe ich davon aus, dass Deine Variable fehlerhaft ist, wo auch immer.

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Hallo Pry,

    erst mal Danke für deine Antwort.

    Das Problem ist ja, dass die Zahl nur als String vorliegt und daher zunächst in einen numerischen Wert konvertiert werden muss.

    In deinem Beispiel gehtst du davon aus, dass die Ausgangsbasis eine Variable vom Typ Decimal ist. Das ist aber nicht so.

    Die gleiche fehlerhafte Darstellung erhalte ich auch, wenn ich die Zahl nicht aus der Datei lese sondern testweise selber als String wie folgt definiere und dann damit weiterarbeite:

    VB.NET-Quellcode

    1. Dim Wert1 As String = "14853611.30"
    2. Label1.Text = Format(CDec(Wert1), "##,##0.00 €").ToString


    Auch hier erfolgt keine korrekte Anzeige, obwohl ja mit dem String selber alles in Ordnung ist.

    Der Fehler muss also m. E. durch die Umwandung des Strings mit CDec ausgelöst werden.

    Nur warum, das ist mir nicht klar.

    Ich muss aber umwandeln, da die Zahl ja zunächst nur als String vorliegt.

    Mike

    singu schrieb:

    Verwende mal Double.TryParse

    @Singu Deine Antwort geht am Problem vollkommen vorbei, das Resultat wird genau dasselbe sein

    @Mike, Pry: wie Ihr mittlerweile richtig rausgearbeitet habt, liegt das Problem bei der Umwandlung des Strings in eine Decimal-Zahl, und zwar an dem "." (Punkt) als Decimal-Separator. Dieser ist nur im englischen Sprachraum gültig, bei uns ist es das Komma, und damit erkennt das VB.NET auf einem deutschen OS diesen Wert nicht und lässt ihn einfach weg.

    Entweder Ihr verwendet in der Datei das Komma, oder Ihr weist VB.NET explizit an die englischen Culture - Einstellungen zu verwenden:

    VB.NET-Quellcode

    1. Dim Wert1 As Decimal
    2. Decimal.TryParse("14853611.30", System.Globalization.NumberStyles.Number, New System.Globalization.CultureInfo("en-US"), Wert1)
    3. Trace.WriteLine(Wert1)

    Beim Import des Namespace System.Globalization wird das natürlich etwas übersichtlicher ...
    Man könnte doch auch im String, welcher eingelesen wurde, den Punkt durch ein Komma ersetzen.

    VB.NET-Quellcode

    1. Replace(Wert1, ".", ",")

    Und anschließend wandelt man die String mit der oben genannten Methode in einen Decimalwert um.

    Grüße, Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Hallo zusammen,

    das Problem ist gelöst.

    Der Vorschlag von Eierlein hat funktioniert!

    Wenn "Val" anstatt "CDec" verwendet wird, tritt das Problem nicht mehr auf.

    Auch die Vorschläge bzw. Hinweise, den "." Punkt durch ein "," Komma zu ersetzen hätten das Problem gelöst. Der Tipp von Eierlein war aber für mein Problem die schnellste und einfachste Lösung.

    Vielen Dank für die Tipps an Alle!

    Mike