Dezimalpunkt oder Dezimalkomma?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Dezimalpunkt oder Dezimalkomma?

    Ich habe eine Frage zum Dezimalpunkt und Dezimalkomma, bei der ihr mir vielleicht weiterhelfen könnt.
    Wann wird bei der Umrechnung von einem String in eine Double-Zahl (z.B. beim Auslesen einer Textbox) ein Dezimalpunk und wann ein Dezimalkomma verwendet? Gibt es Änderungen, wenn das Programm an einem Computer mit amerikanischer Tastatur und Ländereinstellung verwendet wird?
    Eine Tausenderpunkt wird nicht benötigt.

    Ich habe hier mal einige Varianten ausprobiert

    VB.NET-Quellcode

    1. Dim k As String = "0,1"
    2. Debug.WriteLine(k.ToString)
    3. Debug.WriteLine(Convert.ToDouble(k).ToString)
    4. Debug.WriteLine(Val(k).ToString)
    5. 'Ergibt im Debuggerfester
    6. ' 0,1
    7. ' 0,1
    8. ' 0
    9. Dim m As String = "0.1"
    10. Debug.WriteLine(m.ToString)
    11. Debug.WriteLine(Convert.ToDouble(m).ToString)
    12. Debug.WriteLine(Val(m).ToString)
    13. 'Ergibt im Debuggerfester
    14. ' 0.1
    15. ' 1
    16. ' 0,1


    Wie kann man sich unabhängig von der Verwendung des Dezimalpunktes oder des Dezimalkommas machen? Beide Eingaben sollen möglich sein und unabhängig von irgendwelchen Ländereinstellungen. Ist das möglich?
    Es ist kultur-abhängig, wie Zahlen in Strings umgewandelt werden.
    zB in Deutschland kennzeichnet das Komma die Fließkommazahlen, in Amiland tut das der Punkt.
    Daraus folgen verzwickte Probleme, und es ist dringend geraten, vorgesehene Umwandlungs-Methoden zu verwenden, und nicht selbst iwas zu versuchen.

    egon schrieb:

    Was ist den nun die vorgesehene Umwandlungs-Methode und wie können Fehleingaben verhindert werden?
    Fehleingaben vermeidest du, indem du dem User einfach keine Textbox zur Zahlen-Eingabe anbietest. Stattdessen NumericUpdown.

    Auch sowas ist NoGo:

    egon schrieb:

    VB.NET-Quellcode

    1. Dim k As String = "0,1"
    Das geht in Deutschlang gut, in Amiland schief.
    Wenn du eine Zahl im Prog haben willst, dann nimm eine Zahl

    VB.NET-Quellcode

    1. dim dbl As Double = 0.1

    Willst du die Zahl anzeigen, dann auf einem Label, wo der User nicht reinschreiben kann:

    VB.NET-Quellcode

    1. Label1.Text = dbl.Tostring
    Das zeigt in Deutschland 0,1 und in Amiland 0.1

    Speicherst du - wovor Gott dich behüten möge - Zahlen als Text ab, so verwende zur Umwandlung die InvariantCulture - die hat Allgemeingültigkeit:

    VB.NET-Quellcode

    1. dim sDbl = dbl.ToString(cultureinfo.InvariantCulture)
    2. 'und einlesen
    3. dim dbl = Double.Parse(sDbl, cultureinfo.InvariantCulture)
    Jou.

    egon schrieb:

    VB.NET-Quellcode

    1. Dim m As String = "0.1"
    2. Debug.WriteLine(m.ToString)
    Wozu konvertierst Du einen String in einen String?

    egon schrieb:

    Gebietsschema umschalten
    Programmiere so, dass Du kein Gebietsschema brauchst.
    Fang an mit einem ordentlichen Plan.
    Was also ist Dein Plan?
    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!
    Hallo,
    bei mir tauchen immer mal wieder Zahleingaben auf, die sich mit einem NumericUpdown nicht immer lösen lassen. Als Lösung fällt mir dann nur eine Textbox mit einer nachgeschalteten Auswertung ein. Sehr schön wäre auch, dass es egal ist, ob ein Punkt oder ein Komma verwendet wird. Zur Not könnte man sich meinetwegen auf den Punkt beschränken und einfach eine Eingabe von einem Komma verweigern.
    Dann muss außerdem noch eine Eingabe von einem zweiten Komma oder Punkt oder irgendwelcher Zeichen verhindert werden. Außerdem darf ein leeres Feld nicht zum Absturz des Programms führen.
    Dies ist also eine Frage nach einer allgemeinen Überprüfung – nicht nur für mein aktuelles Projekt.

    Ist es egal ob
    dim dbl As Double = 0.1 oder dim dbl As Double = 0,1 verwendet wird?

    Hier nun der konkrete Fall:
    Im angehängten Bild findet ihr meine aktuelle Eingabe mit Angabe sinnvoller Größen. In diesem Fall könnte man die einzige Angabe einer nicht-ganzzahligen Zahl natürlich über ein NumericUpdown lösen. Für die anderen Felder würde eine Eingabe „Numeric“ (wenn es so etwas unter VB gibt) reichen. Bei den Feldern mit den ganzzahligen Zahlen wäre eine Eingabe über NumericUpdown unschön.
    Bilder
    • Eingabe_auswerten001.png

      11,29 kB, 601×528, 531 mal angesehen
    sind das ühaupt in jedem Fall freie Zahl-Eingaben?
    Etwa bei den Frequencies könnte ich mir vorstellen, eine Combobox anzubieten, wo man mw aus nur 20 gültigen möglichen Werten auswählt.

    Hingegen die anderen lassen sich imo sehr gut mit NumericUpdowns abdecken.

    Vlt. hängst du ja auch der irrigen Annahme an, ein NumUpD könne nur ganze Zahlen - das ist irrig, NumUpDs können auch Fließkommazahlen.

    egon schrieb:

    die sich mit einem NumericUpdown nicht immer lösen lassen
    Ein NumericUpDown hat das Property DecimalPlaces, dort kannst Du die Anzahl der Nachkommastellen eingeben.
    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!

    ErfinderDesRades schrieb:

    Vlt. hängst du ja auch der irrigen Annahme an, ein NumUpD könne nur ganze Zahlen - das ist irrig, NumUpDs können auch Fließkommazahlen.

    Vermutlich habt ihr recht. Die NumUpDs können mehr, als ich mir momentan vorstellen kann. Meine Literatur gibt hierzu nicht viel her. Ich bin gespannt, was ich hierzu im I-Net noch finden kann.
    Jou.

    egon schrieb:

    was ich hierzu im I-Net noch finden kann.

    RodFromGermany schrieb:

    Ein NumericUpDown hat das Property DecimalPlaces, dort kannst Du die Anzahl der Nachkommastellen eingeben.
    Fang an mit diesem Control zu spielen.
    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!
    Euer Vorschlag war wirklich gut - und es ist auch noch sehr einfach ;)
    Vielen Dank

    Hier mein Zugriff auf den NumericUpDown

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim a As Double
    3. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    4. a = NumericUpDown1.Value
    5. Label1.Text = a.ToString
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. NumericUpDown1.Value = 10.2
    9. End Sub
    10. End Class


    Das Video werde ich mir auch noch gegen Abend ansehen. Ich glaube, dass der Thread nun geschlossen werden kann.

    [EDIT] Hinweis für Mitleser: NumericUpDown1.Value muss im Decimal-Format vorliegen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „egon“ ()

    Euer Vorschlag mit dem NumericUpDown war wirklich gut. Ich habe nun auch herausgefunden, dass man mit dem Mausrad die Zahlen verändern kann, wenn man vorher ein Feld angeklickt hatte.
    Wenn ich am Maurad drehe ist der kleinste Schritt aber drei Steps. Wenn die UpDown-Funktion durch anklicken ausgeführt wird aber nur einen Step.
    Kann man ohne Probleme die Maus so einstellen, dass sie sich beim Drehen des Mausrades so verhält wie beim Anklicken der UpDown-Pfeile - also nur ein Step?
    Die Schrittweite des Mouserades kannst du in der Systemsteuerung einstellen (ist standardmäßig auf 3 eingestellt)

    Schaue dir dazu auch die Member von MouseEventArgs an...
    Beispiel in MouseEventArgs.Delta
    Lese dazu mehr...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()