Zum Inhalt springen

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


Fraggla

Empfohlene Beiträge

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen


        //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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...