Fehlermeldung bei einfachem Prozentrechner in VB 2010 (Ungültige Konvertierung von der Zeichenfolge in Typ Double).

  • VB.NET

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

    Fehlermeldung bei einfachem Prozentrechner in VB 2010 (Ungültige Konvertierung von der Zeichenfolge in Typ Double).

    Sehr geehrtes Forum,

    ich bin Neuling.
    Sowohl im Forum, als auch im Thema der Programmierung. Also entschuldigt bitte meine wahrscheinlich für Euch banale Frage.

    Wie so viele fange ich mit ,,Visual Basic" an.
    Die Standard Programme, wie sich bei einem Buttonklick eine MsgBox mit "Hallo World" anzeigen zu lassen, oder zwei Zahlen zu addieren, habe ich schon erstellt (erfolgreich :D ).
    Heute habe ich erst ein Programm erstellt, das aus dem Grundwert und dem Prozentwert den Prozentsatz bestimmt und danach, als dies erfolgreich war habe ich mich daran gewagt einen Prozentrechner zu erstellen, der sowohl Prozentwert, Prozentsatz, als auch Grundwert bestimmen können soll (wenn mind. zwei Werte angegeben sind).

    Drei TextBoxen, drei Lables und drei Buttons. Schön und gut. Doch als ich das Programm testweise ausgeführt habe, Werte in die Boxen Prozentwert und Prozentsatz eingegeben habe und durch einen Klick auf ,,Berechne Grundwert" diesen in das Label4 (bzw. lblergebnisgrundwert) ausgeben wollte, kam eine Fehlermeldung, die ich nicht zuordnen kann (Ungültige Konvertierung von der Zeichenfolge in Typ Double.).

    Mein Programmcode (natürlich noch nicht vollständig):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim z1, z2, z3 As Double
    3. Private Sub cmdberechnegrundwert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdberechnegrundwert.Click
    4. z1 = txtgrundwert.Text
    5. z2 = txtprozentsatz.Text
    6. z3 = txtprozentwert.Text
    7. lblergebnisgrundwert.Text = "100" * z3 / z2
    8. End Sub
    9. Private Sub cmdberechnegprozentwert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdberechnegprozentwert.Click
    10. z1 = txtgrundwert.Text
    11. z2 = txtprozentsatz.Text
    12. z3 = txtprozentwert.Text
    13. lblergebnisprozentsatz.Text = z3 / z1
    14. End Sub
    15. End Class


    Ich werde noch Bilder anfügen.

    Vielen Dank im Voraus

    ttenroK

    Code-Tag eingefügt. ~Thunderbolt
    Bilder
    • Screenshot (11).png

      132,9 kB, 1.920×1.042, 142 mal angesehen
    • Screenshot (13).png

      13,61 kB, 935×663, 145 mal angesehen

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

    ttenroK schrieb:

    kam eine Fehlermeldung, die ich nicht zuordnen kann (Ungültige Konvertierung von der Zeichenfolge in Typ Double.).
    Tja, das hat was mit Datentypen zu tun.
    "Zeichenfolge" meint Text, und der Datentyp dafür ist String. Double ist ja klar, ist eine Fließkommazahl.
    Nun kann man mit Text nicht rechnen - rechnen kann man nur mit Zahlen.
    Scheinbar versuchst du aber mit Strings zu rechnen - ja er kann den String aber nicht in einen Double konvertieren, und daran scheiterts.

    Was für Anfäger das allerdringendste ist, und was du auch sofort umsetzen solltest: Visual Studio - Empfohlene Einstellungen
    Dann gibt dir der Compiler schon von vornherein bescheid, wenn du Datentypen zusammenschmeißt, die nicht zueinander passen.

    Nur so kannst du programmieren lernen.
    Vielen Dank für Deine schnelle Antwort und Deinen Rat.
    Dann werde ich mal anfangen...

    Gibt es eine einfache Möglichkeit, wie ich diesen Fehler schnell wieder beheben kann, oder ist es von Anfang an Blödsinn und ich sollte alles nochmal mit den Empfohlenen Einstellungen von Anfang an aufbauen?

    (...ich dachte durch die Deklaration am Anfang hätte ich die Zahlen z1, z2, z3 schon als Double deklariert und hätte es später mit einem Eingabefeld verknüpft. So hat es vorher halt immer funktioniert (z.B. beim Addieren)...)

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

    Hallo ttenroK

    das Problem tritt vor allem deswegen auf, weil deine erste Textbox leer ist. Und nichts kann VB scheinbar leider nicht selbstständig in eine Zahl (z.B. 0 konvertieren).
    Die einfachste Lösung wäre jetzt nur eine 0 in die Textbox zu schreiben oder zuerst zu überprüfen ob etwas in der Textbox steht.
    Beispielsweise mit einer If-Anweisung (für den Anfang)

    Quellcode

    1. Dim x As Double
    2. If TextBox1.Text = String.Empty Then
    3. x = 0
    4. Else
    5. x = TextBox1.Text
    6. End If


    Gruß
    Feltor

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

    Wenn man Eingaben aus einer TextBox auf gültige numerische Werte überprüfen will:
    String in Integer Speichern
    das geht mit allen numerischen Datentypen...
    Besser wäre, wenn man gleich das richtige Control zur Dateneingabe hernimmt, dann erspart man sich solche Prüfungen - z.B. NummericUpDown etc...
    In die erste Zeile gehört (wenn Du es sträflicherweise nicht schon bei den Einstellungen machst):

    VB.NET-Quellcode

    1. Option Strict On


    Dann werden Dir Progrogrammierfehler gleich beim Entwickeln des Codes angzeigt und nicht erst beim Ausführen des Programms.

    100 ist eine Zahl und kein String und darf somit auch nicht in Anführungszeichen stehen!
    Danke für Eure Antworten VB1963 und Thias,

    Option Strict ist aktiviert.
    Nadem ich die Änderungsvorschläge gemacht habe funktioniert es leider immer noch nicht. Jetzt sieht es wie folgt aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim z1, z2, z3 As Double
    4. Private Sub cmdgrundwertberechnen_Click(sender As Object, e As EventArgs) Handles cmdgrundwertberechnen.Click
    5. z1 = CDbl(txtgrundwert.Text)
    6. z2 = CDbl(txtprozentsatz.Text)
    7. z3 = CDbl(txtprozentwert.Text)
    8. lblgrundwert.Text = CType(100 * z3 / z2, String)
    9. End Sub
    10. End Class

    Wie bereits von anderen Usern des Forums erwähnt - Datentypen.
    Jedoch bringt dir ein Quick-Fix nicht viel. Du sollst dein Problem verstehen und auch nachvollziehen können.

    Ich würde dir sehr empfehlen, dich mit dem hier zu beschäftigen.

    Einfach mal durchlesen und Stück für Stück durcharbeiten.


    lg TehBasic

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

    Edit: Irgendwie hat mein Browser nicht richtig aktualisiert und mir sind ein paar Beiträge entgangen, deswegen habe ich mal meine alten Post versteckt.

    P.S. Gib nicht auf, wenn man etwas neues lernt ist es am Anfang immer schwer ;)

    Veralteter Text:
    Spoiler anzeigen

    ttenroK schrieb:

    Danke für Deine Antwort Feltor,

    wenn ich aber für den Grundwert 0 eingebe, nimmt er ja 0 als Grundwert.
    Bei 0€ kann ich ja lange warten, bis daraus mit z.B. 20% Zinsen 120€ werden, oder?

    Herzliche Grüße

    ttenroK

    Nein, du rechnest ja erstmal nicht mit der Zahl wenn du den Grundwert selbst berechnest, sondern nur mit den Variablen Prozentsatz oder Prozentwert.
    Und im umgekehrten Fall, wenn du den Prozentwert berechnest gibst du ja eine Zahl für den Grundwert ein die ungleich 0 ist.

    Theoretisch könntest du dir also die Zeilen 5 und 15 in deinem Code sogar sparen.
    Jo bitte immer genaue Fehlermeldungen mit angeben.

    Folgende Zeile brauchst Du aber in Deinem Code bei Grundwert berechnen nicht (mit z1 rechnest Du ja in dieser Sub nicht), also entfernen - danach sollte es funktionieren.

    z1 = CDbl(txtgrundwert.Text)

    txtgrundwert.Text hast Du sicher nicht gefüllt, dann ist es komplett leer (Nothing) und kann nicht in eine Zahl umgewandelt werden oder selber 0 beim Grundwert eingeben.

    Wenn ich mich nicht irre, dann ist auch noch Deine Formel falsch - siehe: mathepower.com/prozent.php

    Ansonsten ist das empfohlene Buch gut!

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

    Jawoll!!!!
    Es funktioniert jetzt!
    Jetzt nurnoch den Prozentsatz irgendwie umformatieren, dass man ihn nicht in 1,16 statt 16% angeben muss und es ist ein Erfolgserlebnis!
    Jetzt muss ich mal in das Buch gucken und verstehen, weshalb ich da ,,CDlb" und ,,CType" geschrieben habe ^^


    Vielen Dank an alle, die mir als blutigen Anfänger geholfen haben!!!

    Herzliche Grüße

    ttenroK
    Ok, ok, die Euphorie ist verflogen...
    Ja das sind noch zwei Fehlerquellen!
    Bei Buschstaben schmiert das Pragramm ab, bzw. kommt die Fehlermeldung :
    Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in Microsoft.VisualBasic.dll aufgetreten.
    Bei z2 bzw. Prozentsatz = 0
    kommt immer 0 raus...
    Irgendwie bekomme ich das schon noch hin...


    Jetzt sieht der Code wie folgt aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim z1, z2, z3 As Double
    4. Dim x As Double
    5. Private Sub cmdprozentsatzberechnen_Click(sender As Object, e As EventArgs) Handles cmdprozentsatzberechnen.Click
    6. If txtgrundwert.Text = String.Empty Then
    7. x = 0
    8. Else
    9. x = CDbl(txtgrundwert.Text)
    10. End If
    11. z1 = CDbl(txtgrundwert.Text)
    12. z3 = CDbl(txtprozentwert.Text)
    13. lblprozentsatz.Text = CType(100 * z3 / z1 - 100, String)
    14. End Sub
    15. Private Sub cmdprozentwertberechnen_Click(sender As Object, e As EventArgs) Handles cmdprozentwertberechnen.Click
    16. z1 = CDbl(txtgrundwert.Text)
    17. z2 = CDbl(txtprozentsatz.Text)
    18. lblprozentwert.Text = CType(z1 * z2, String)
    19. If z2 = 0 Then
    20. lblprozentwert.Text = CType(z1, String)
    21. End If
    22. End Sub
    23. Private Sub cmdgrundwertberechnen_Click(sender As Object, e As EventArgs) Handles cmdgrundwertberechnen.Click
    24. z2 = CDbl(txtprozentsatz.Text)
    25. z3 = CDbl(txtprozentwert.Text)
    26. lblgrundwert.Text = CType(z3 / z2, String)
    27. End Sub
    28. End Class


    Jetzt fehlt nur noch das Ausschließen von Buchstaben und die Möglichkeit den Prozentsatz in Prozenten anzugeben.

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

    Entschuldigung VB1963, dass ich nicht nochmal darauf eingegangen bin!!!!
    Ich hatte versucht das auf meinen Code anzuwenden, aber ich verstehe den Befehl noch nicht gut genug, um ihn auf meinen Code anzuwenden, könntest Du mir dabei evtl. noch helfen?

    Ich werde dann auch nicht weiter Eure Zeit in Anspruch nehmen :rolleyes:
    Das habe ich glaube ich schon genug :/

    VB.NET-Quellcode

    1. Dim Result As Double
    2. If Double.TryParse(TextBoxString, Result) then
    3. 'Ok-Part
    4. else
    5. 'False-Part
    6. end if
    Mit der TryParse-Methode konvertierst du ganz einfach einen String (deine Textbox-Eingabe) auf einen Wert mit dem Datentyp Double.
    Sollte das auf Grund von falschen Zeichen in der Textbox nicht möglich sein, wird False zurück gegeben (siehe oben die If-Verzweigung, wo du entsprechend reagierern kannst).
    Das Ergebnis bei positiver Konvertierung befindet sich in der Result-Variablen, die du dann für deine Berechnungen im True-Zweig verwenden kannst...
    msdn.microsoft.com/de-de/libra…le_methods(v=vs.110).aspx
    Siehe dir einmal alle Überladungen dieser Methode an. Da gibt es auch eine die auf richtiges kulturspezifisches Format achtet...

    VB.NET-Quellcode

    1. Dim Result As Double


    Das kommt also in Public Class Form1

    Der Rest kommt dann einfach in die erste Private Class?

    könnte ich nicht mit

    VB.NET-Quellcode

    1. GetType()
    arbeiten?

    oder

    VB.NET-Quellcode

    1. IsNaN(Double)



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