Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C#]AnfängerProblem Umwandlung string -> double und zurück

Empfohlene Antworten

Veröffentlicht

Hi,

versuche gerade meine Consolen Anwendung auf Win nachzubauen.

Das Programm soll nach vorheriger Auswahl via Radio Button den Grundwert, Zinswert oder Prozentsatz berechnen.

Allerdings verzweifel ich gerade ein wenig an den Umwandlungen von string in double und wieder zurück...

Hier mein bisheriger Code:

private void Berechnen_Click(object sender, EventArgs e)

        {

            if (Grundwertrd.Checked == true)

            {

                string Ergebnistxt;

                double Zinswertz = double.Parse(Zinswerttxt.Text);

                double Prozentwertz = double.Parse(Prozentsatztxt.Text);

                double Ergebnistxtz = Zinswertz * 100 / Zinswertz;

                Ergebnistxtz.ToString = Ergebnistxt.Text;



                MessageBox.Show("Der Grundwert wurde berechnet");



                //double Zinswertz = double.Parse(Zinswerttxt);

            }else{

                MessageBox.Show("Mäh");


            }

        }

Edit: Fehlermeldung:

"sting" enhält keine Definition für "Text", und es konnte keine Erweiterungsmethode "Text" gefunden werden, die ein erster Argument vom Typ "string" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

Der Fehler bezieht sich auf "Ergebnistxtz.ToString = Ergebnistxt.Text"

Es muss doch eine elegantere Lösung dafür geben, oder?

Wäre schön, wenn ihr mir hier einen Hinweis geben könntet, hab mit Google zwar schon gesucht, jedoch werde ich aus den dortigen Syntaxangaben nicht wirklich schlau :(

Bearbeitet von Fraggla

  • Autor

konnte jetzt den Fehler mit der folgenden Änderung umgehen:

  if (Grundwertrd.Checked == true)

            {

                double Zinswertz = double.Parse(Zinswerttxt.Text);

                double Prozentwertz = double.Parse(Prozentsatztxt.Text);

 [COLOR="Red"]Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Prozentwertz);[/COLOR]



                MessageBox.Show("Der Grundwert wurde berechnet");


            }else{

                MessageBox.Show("Mäh");

Gibts elegantere Möglichkeiten dafür? bin nur zufällig auf diese Lösung gestoßen :(

Bearbeitet von Fraggla

ich verwende dafür immer gern die Funktion convert.toDatentyp(Variable). Funktionierte bis jetzt immer einwandfrei mit vielen Datentypen.

  • Autor

Beides ausprobiert, beides Funktioniert nicht. Eine impliziete Konvertierung von string in double ist nicht möglich.

D.h mit meinem 1 Befehl oben, kann ich die Berechnung und die Ausgabe mit einer Zeile machen. Glaub das ist mir am angenehmsten.

Nächste Frage:

Ich würde gerne, sobald via RadioButton eine Berechnung ausgewählt wurde, dass das des zu berechnenden Wertes grau wird und nicht beschrieben werden kann.

Dafür benutze ich im Moment

"Grundwerttxt.Enabled = false;"

Das Problem, ich hab keine Ahnung wie ich das am Besten triggern kann.

Direkt im Radiobutton funktioniert bisher nur zum Teil:

Man kann noch eine Eingabe in dem Feld machen, die Eingabe wird jedoch ignoriert.

Wenn ichs mit dem Knopf "Berechnen" mache, konnten Zahlen logischerweise schon vorher eingegeben werden, das Feld wird hier jedoch danach grau und auch hier ignoriert er die Eingabe.

Wäre schön wenn man hier noch Denkanstöße geben könnte.

Nächste Frage:
Mach dazu bitte demnächst einen neuen Thread auf. Ein Thread pro Thema, nicht pro User oder Programm.

Direkt im Radiobutton funktioniert bisher nur zum Teil:

Man kann noch eine Eingabe in dem Feld machen, die Eingabe wird jedoch ignoriert.

Das wäre aber der richtige Weg. Zeig doch mal, wie du das machst.
  • Autor


        //Radio Buttons Definieren

        public void AddRadioButtons()

        {

            Grundwertrd.AutoCheck = true;

            Grundwertrd.Text = "Checked";

            Grundwertrd.Checked = true;            

            Grundwertrd.CheckedChanged += new EventHandler(rBut_CheckedChanged);

            Controls.Add(Grundwertrd);            

        }


           public void AddRadioButtons2()

        {

            Zinswertrd.AutoCheck = true;

            Zinswertrd.Text = "Checked";

            Zinswertrd.Checked = true;

            Zinswertrd.CheckedChanged += new EventHandler(rBut_CheckedChanged);


            Controls.Add(Zinswertrd);

        }

           public void AddRadioButtons3()

           {

               Prozentsatzrd.AutoCheck = true;

               Prozentsatzrd.Text = "Checked";

               Prozentsatzrd.Checked = true;

               Prozentsatzrd.CheckedChanged += new EventHandler(rBut_CheckedChanged);


               Controls.Add(Prozentsatzrd);

           }


        //Grundwert ausblenden 

        private void rBut_CheckedChanged(object sender, System.EventArgs e)

           {

               Grundwerttxt.Enabled = false;

               Zinswerttxt.Enabled = true;

               Prozentsatztxt.Enabled = true;

           }


        //Prozentberechnung

        private void Berechnen_Click(object sender, EventArgs e)

        {

            if (Grundwertrd.Checked == true)

            {


                double Zinswertz = double.Parse(Zinswerttxt.Text);

                double Prozentwertz = double.Parse(Prozentsatztxt.Text);

                Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Prozentwertz);



                MessageBox.Show("Der Grundwert wurde berechnet");

            }

            if (Zinswertrd.Checked == true)

            {

                double Grundwertz = double.Parse(Grundwerttxt.Text);

                double Prozentsatzz = double.Parse(Prozentsatztxt.Text);

                Ergebnistxt.Text = string.Format("{0}", Grundwertz / 100 * Prozentsatzz);


                MessageBox.Show("Der Zinswert wurde berechnet");

            }



            if (Prozentsatzrd.Checked == true)

            {

                double Grundwertz = double.Parse(Grundwerttxt.Text);

                double Zinswertz = double.Parse(Zinswerttxt.Text);

                Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Grundwertz);


                MessageBox.Show("Der Prozentsatz wurde berechnet");

            }    


        //Restliche Buttons belegen / Zinswert + Prozent Radio Button definieren.

        }          

        private void button2_Click(object sender, EventArgs e)

        {

            Application.Exit();


        }


        private void Zinswertrd_CheckedChanged_1(object sender, EventArgs e)

        {

            Grundwerttxt.Enabled = true;

            Zinswerttxt.Enabled = false;

            Prozentsatztxt.Enabled = true;

        }


        private void Prozentsatzrd_CheckedChanged_1(object sender, EventArgs e)

        {

            Grundwerttxt.Enabled = true;

            Zinswerttxt.Enabled = true;

            Prozentsatztxt.Enabled = false;

        }        

    }

}

Das sollte der gesammte relevante Code sein.

Hab versucht mit etwas Textkosmetik aufzuräumen, das hat mir jedoch 2x die Anwendung zerschossen.

Sieht in euren Augen mit Sicherheit nicht schön aus, dafür dass es aber mein erstes Win Programm ist bin ich garnicht mal unzufrieden.

Bin für jeden Hinweis/Tipp dankbar.

Das mit dem Ausblenden hat jetzt z.B geklappt :)

Das sieht ziemlich seltsam aus.

Warum fügst du deine Radiobuttons in eigenen Funktionen der Controls-Collection hinzu? Sollte das nicht der vom Designer generierte Code machen?

Und was in deinem CheckedChanged-Eventhandler passiert, sollte schon irgendwie vom aktuellen Zustand der Radiobuttons abhängen. Bedenke, dass dieser Eventhandler auch aufgerufen wird, wenn sich Checked von true nach false ändert.

Und schließlich kannst du dir das

== true

in deinen if-Anweisungen sparen. RadioButton.Checked ist bereits ein Boolean, der Vergleich mit true ist überflüssig.

  • Autor

Hab die Anwendung jetzt nochmal von vorne gebaut, da ich selbst die Übersicht darüber verloren habe und vieles dank try + error drinnen geblieben ist, was so wohl nicht rein gehört.

Trotzdem habe ich weiterhin das Problem, dass er das Textfeld nach Klick auf dem Radiobutton nicht sperrt.

Er sperrt es erst, nachdem man 1 Zahl im Textfeld eingegeben hat, nicht jedoch sofort.

private void txtGrundwert_TextChanged(object sender, EventArgs e)

        {

            if (rdGrundwert.Checked)

            {

                txtGrundwert.Enabled = false;

                txtProzentwert.Enabled = true;

                txtProzentsatz.Enabled = true;


...




 private void button1_Click(object sender, EventArgs e)

        {

            if (rdGrundwert.Checked)

            {

                double Prozentwertz = double.Parse(txtProzentwert.Text);

                double Prozentsatzz = double.Parse(txtProzentsatz.Text);

                txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Prozentsatzz);

            }

            }

edit: danke übrigens für euere Hilfe. Wäre ansonsten echt aufgeschmissen :(

Trotzdem habe ich weiterhin das Problem, dass er das Textfeld nach Klick auf dem Radiobutton nicht sperrt.

Er sperrt es erst, nachdem man 1 Zahl im Textfeld eingegeben hat, nicht jedoch sofort.

Du baust die Sperr-Logik in den TextChanged-Eventhandler der Textbox und wunderst dich dann darüber, dass erst dann etwas passiert, wenn du etwas in die Textbox eingibst?

Wenn etwas passieren soll, wenn du die Radiobuttons manipulierst, dann solltest du diesen Code auch in einen passenden Eventhandler der Radiobuttons stecken.

  • Autor

Grade auch aufgefallen. Sorry bin wohl etwas zu bequem geworden gerade. Ich versuch mich selbst durch das Problem zu prügeln, werd aber Rückmeldung geben sobald sich was ergibt. Sorry nochmal.

  • Autor

So habs jetzt komplett überarbeitet und versucht alle Fehlerquellen zu eliminieren:

 private void rdGrundwert_CheckedChanged(object sender, EventArgs e)

        {


            if (rdGrundwert.Checked)

            {

                txtGrundwert.Enabled = false;

                txtProzentwert.Enabled = true;

                txtProzentsatz.Enabled = true;

            }

        }


        private void rdProzentwert_CheckedChanged(object sender, EventArgs e)

        {

            if (rdProzentwert.Checked)

            {

                txtGrundwert.Enabled = true;

                txtProzentwert.Enabled = false;

                txtProzentsatz.Enabled = true;

            }

        }


        private void rdProzentsatz_CheckedChanged(object sender, EventArgs e)

        {

            if (rdProzentsatz.Checked)

            {

                txtGrundwert.Enabled = true;

                txtProzentwert.Enabled = true;

                txtProzentsatz.Enabled = false;

            }

        }


        private void button1_Click(object sender, EventArgs e)

        {

            if (rdGrundwert.Checked)

            {

                if (txtProzentwert.Text == "")

                {

                    MessageBox.Show("Sie müssen einen Prozentwert für diese Berechnung eingeben");

                }

                if (txtProzentsatz.Text == "")

                {

                    MessageBox.Show("Sie müssen einen Prozentsatz für diese Berechnung eingeben");

                }

                else

                {

                    double Prozentwertz = double.Parse(txtProzentwert.Text);

                    double Prozentsatzz = double.Parse(txtProzentsatz.Text);

                    txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Prozentsatzz);

                }

            }


                if (rdProzentwert.Checked)

                {

                    if (txtGrundwert.Text == "")

                    {

                        MessageBox.Show("Sie müssen einen Grundwert für diese Berechnung eingeben");

                    }

                    if (txtProzentsatz.Text == "")

                    {

                        MessageBox.Show("Sie müssen einen Prozentsatz für diese Berechnung eingeben");


                    }

                    else

                    {

                        double Grundwertz = double.Parse(txtGrundwert.Text);

                        double Prozentsatzz = double.Parse(txtProzentsatz.Text);

                        txtErgebnis.Text = string.Format("{0}", Grundwertz / 100 * Prozentsatzz);

                    }

                }


                if (rdProzentsatz.Checked)

                {

                    if (txtGrundwert.Text == "")

                    {

                        MessageBox.Show("Sie müssen einen Grundwert für diese Berechnung eingeben");

                    }

                    if (txtProzentwert.Text == "")

                    {

                        MessageBox.Show("Sie müssen einen Prozentwert für diese Berechnung eingeben");

                    }

                    else

                    {

                        double Grundwertz = double.Parse(txtGrundwert.Text);

                        double Prozentwertz = double.Parse(txtProzentwert.Text);

                        txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Grundwertz);

                    }

                }


                    {

                        if (rdGrundwert.Checked != true)

                        {

                            if (rdProzentsatz.Checked != true)

                            {

                                if (rdProzentwert.Checked != true)

                                {

                                    MessageBox.Show("Sie müssen eine Berechnung auswählen");

                                }

                            }

                        }

                    }

                }


        private void btnBeenden_Click(object sender, EventArgs e)

        {

            Application.Exit();

        }


        private void txtGrundwert_KeyPress(object sender, KeyPressEventArgs e)

        {

            if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0)

            {

                e.Handled = true;

            }


        }


        private void txtProzentwert_KeyPress(object sender, KeyPressEventArgs e)

        {

            if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0)

            {

                e.Handled = true;

            }


        }


        private void txtProzentsatz_KeyPress(object sender, KeyPressEventArgs e)

        {

            if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0)

            {

                e.Handled = true;

            }


        }



            }

        }         




Maximal 4stellige Prozentzahlen, Maximal 8stellige Zahlen. Keine negativen Zahlen und keine Buchstaben.

Danke nochmal für die Unterstütztung, wäre schön wenn ihr beim Drübersehen noch Anregungen auf eine bessere Lösung geben könntet :)

Du kannst deine drei Radiobutton-CheckedChanged-Eventhandler durch einen einzigen ersetzen:

private void rd_CheckedChanged(object sender, EventArgs e)
{
txtGrundwert.Enabled = !rdGrundwert.Checked;
txtProzentwert.Enabled = !rdProzentwert.Checked;
txtProzentsatz.Enabled = !rdProzentsatz.Checked;
}[/code]

Die Keypress-Behandlung würde ich weglassen. Sie bringt nichts. Man kann trotzdem noch ungültige Zahlen eingeben. Gültigkeitsprüfung während der Eingabe halte ich persönlich für eine Plage.

Hallo Fraggla,

also so grob sieht der Code gar nicht so schlecht aus.

Ich geb meinem vorredner recht, die KeyPress-Behandlungen kannste alle weglassen.

Was mir noch aufgefallen ist, ich würde allein der übersichthalber nicht auf

!= true abprüfen also

if(rdGrundwert.Checked != true)

-> if(!rdGrundwert.Checked) 

aber ist nur ne Empfehlung beeinflusst nicht die richtigkeit deines Programmes.

Also zu der Fehlerbehandlung bei der Eingabe würde ich ganz klar zu tryParse greifen. Die Methode funktoniert im Prinzip wie ein normales Parse oder Convert.to, nur das sie einen bool-Wert zurück gibt, ob die konvertierung geklappt hat, auf den du dann abprüfen kannst.

Das wären so die Dinge, die mir aufgefallen sind.

MFG

it_crowd

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.