Dezimaltrennzeichen einen Punkt statt Komma und richtig formatiert

  • VB.NET
  • .NET 4.5

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Dezimaltrennzeichen einen Punkt statt Komma und richtig formatiert

    Hallo Leute,

    ich verstehe nicht, warum .NET nicht das macht was man erwartet

    VB.NET-Quellcode

    1. 'Ergebnis erwartet: 1344.90
    2. MsgBox(Format(1334.9, "###0.00")) ' Ergebnis = 1334,90
    3. MsgBox(FormatNumber(1334.9, 2, 0, 0, 0)) ' Ergebnis = 1334,90
    4. 'Das Ergebnis sollte aber einen Punkt als Dezimaltrennzeichen haben - leider wird immer ein Komma übergeben


    Wenn ich ###0.00 angebe, warum macht mir das Ding dann wieder ein Komma rein?
    Ich brauche den Wert in ein String umgewandelt, ohne Tausendertrennzeichen und mit einem Punkt als Dezimaltrennzeichen.

    Kann doch nicht sein, dass man da jetzt noch mit Replace() arbeiten muss ?!

    PS: das Msgbox ist nur zum "schnellen" Ausgeben und Probieren gedacht.
    Vielen Dank für Eure Tipps.
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.
    @dive26 Arbeite mit String.Format() und gib dem die englische Kultur mit, dann wird sauber formatiert.
    stackoverflow.com/questions/12…mat-string-by-cultureinfo
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    ich denke mit String.Format solltest du dein Ziel erreichen, in etwa hiermit:

    VB.NET-Quellcode

    1. ​String.Format("{0:0.00}", Zahl)


    Generell würde ich nur String.Format nehmen, um Strings ordentlich zu formatieren/darzustellen.

    Edit: Da war wohl @RodFromGermany schneller :D

    dive26 schrieb:

    Wenn ich ###0.00 angebe, warum macht mir das Ding dann wieder ein Komma rein?
    Das liegt an der eingestellten Kultur.
    Im Format-String bedeutet . nicht Punkt, sondern bedeutet DezimalTrenner. Und in deutscher Kultur ist DezimalTrenner numa ,, und nicht ..
    Vermutlich möchtest du die allgemeine Kultur benutzen. Die kannste beim Formatieren mit angeben.
    Guck dir die String.Format-Methode mal im ObjectBrowser an.
    Der Name der allgemeinen Kultur lautet: "Invariant" (warum auch immer)
    @ErfinderDesRades
    Der Name der allgemeinen Kultur lautet: "Invariant" (warum auch immer)

    Hast Du Da auch ein Beispiel? Ich finde Invariant nur in Verbindung mit DateTime.

    VB.NET-Quellcode

    1. MsgBox(String.Format(New System.Globalization.CultureInfo("en-GB"), "{0:C}", 1334.9))
    2. ' Ergebnis is (Britische Pfund Symbol) + 1.334.90

    Wo soll ich da das "Invariant" hingeben?

    @KingLM97

    VB.NET-Quellcode

    1. MsgBox(String.Format("{0:0.00}", 1334.9)) ' Ergebnis = 1334,90


    Also ich brauche weder ein Währungssymbol noch ein Tausendertrennzeichen.

    Das hier funktioniert nun:

    VB.NET-Quellcode

    1. MsgBox(String.Format(New System.Globalization.CultureInfo("en-GB"), "{0:0.00}", 1334.9)) ' Ergebnis = 1334.90

    Aber ehrlich, da ist Replace(",",".") kürzer und leichter lesbar.

    Also egal obs "schön" ist oder nicht, kurz ist es jetzt als eigene Funktion:

    VB.NET-Quellcode

    1. Public Function ZahlMitPunkt(zahl As Double) As String
    2. ZahlMitPunkt = Replace(Format(zahl, "###0.00"), ",", ".")
    3. End Function


    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    Das hier funktioniert nun
    Wenn das öfter vorkommt, machst Du eine separate Variable in der Klasse mit der zu verwendenden Kultur, die dann verwendet wird:

    VB.NET-Quellcode

    1. Dim culture = New System.Globalization.CultureInfo("en-GB")

    VB.NET-Quellcode

    1. MessageBox.Show(String.Format(culture, "{0:0.00}", 1334.9)) ' Ergebnis = 1334.90
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    nein er soll keine neue CultureInfo-Instanz erzeugen, sondern einfach die InvarantCulture verwenden, dies schon gibt, und die dafür da ist (ich glaub, es geht ums Zahlenformat innerhalb eines BindingSource/DataView - FilterAusdrucks).
    Aber dive26 ist da bisserl beratungsresistent, wenns drum geht, zu erlernen, wie .Net tickt. Daher kanner die genannte Culture auch nicht finden.