Kapitel: Mein erstes Programm

Richtig prüfen mit TryParse

Befehl: int.TryParse, double.TryParse

Bisher haben wir Zahlen auf zwei nicht ganz perfekte Arten eingelesen: mit int.Parse/double.Parse, das bei falscher Eingabe abstürzt, oder mit der groben Prüfung char.IsDigit(eingabe[0]) aus Bedingungen, die nur das allererste Zeichen anschaut. Jetzt lernst du das richtige Werkzeug dafür: TryParse.

int.TryParse und double.TryParse

string eingabe = "42";
bool erfolgreich = int.TryParse(eingabe, out int zahl);

if (erfolgreich)
{
    Console.WriteLine("Erfolgreich eingelesen: " + zahl);
}
else
{
    Console.WriteLine("Das war keine gültige Zahl.");
}
TryParse versucht die Umwandlung und gibt dir als Rückgabewert einen bool zurück: true bei Erfolg, false bei Misserfolg - und stürzt dabei nie ab, egal was eingegeben wurde. Die eigentliche Zahl bekommst du über out int zahl: einen sogenannten out-Parameter. Anders als bei einem normalen Rückgabewert kann eine Methode dir über out gleichzeitig noch einen zweiten Wert direkt in eine Variable schreiben, die du genau an dieser Stelle deklarierst.

Warum das besser ist als char.IsDigit(eingabe[0])

Console.WriteLine(int.TryParse("5x", out int a));
Console.WriteLine(int.TryParse("-5", out int b));
Console.WriteLine(int.TryParse("", out int c));
Alle drei Fälle waren mit char.IsDigit(eingabe[0]) problematisch: '5x' hätte fälschlicherweise als Zahl gegolten (nur das erste Zeichen wurde ja geprüft), '-5' wäre fälschlicherweise als keine Zahl erkannt worden (ein Minus ist keine Ziffer), und ein leerer Text hätte das Programm sogar zum Absturz gebracht. TryParse behandelt alle drei Fälle korrekt: false, true, false - und stürzt nie ab.

Vorsicht bei Kommazahlen: Komma oder Punkt?

Bei double.TryParse kommt noch eine Besonderheit dazu, die speziell für uns als deutschsprachige Nutzer wichtig ist:

Console.WriteLine(double.TryParse("3,5", out double a) + " -> " + a);
Console.WriteLine(double.TryParse("3.5", out double b) + " -> " + b);
Auf einem deutsch eingerichteten System erwartet double.TryParse ein Komma als Dezimaltrennzeichen - genau wie du es aus dem Alltag kennst. Ein Punkt führt dabei NICHT zu false, sondern wird stillschweigend als Tausendertrennzeichen interpretiert und einfach entfernt: Aus 3.5 wird so die Zahl 35 - ganz ohne Fehlermeldung! Das haben wir tatsächlich mit einem echten .NET nachgetestet: TryParse liefert hier true, obwohl das Ergebnis offensichtlich falsch ist. Achte bei double-Eingaben deshalb bewusst auf das Komma.
Der Grund: double.Parse und double.TryParse richten sich standardmässig nach der Sprach- und Ländereinstellung deines Systems (der sogenannten Kultur). Bei uns bedeutet das: Komma statt Punkt. Zahlen, die du direkt in deinen Code schreibst (wie double preis = 4.99;), sind davon übrigens nicht betroffen - dort ist der Punkt immer Pflicht, unabhängig von der Systemeinstellung. Nur bei eingetippten Texten zur Laufzeit macht das einen Unterschied.

Zurück zum Taschenrechner

Damit können wir Schritt 1 von Was können wir schon? Ein Taschenrechner jetzt richtig lösen:

double a;
bool istGueltig;

do
{
    Console.Write("Zahl a: ");
    string eingabeA = Console.ReadLine();
    istGueltig = double.TryParse(eingabeA, out a);

    if (istGueltig == false)
    {
        Console.WriteLine("Das ist keine gültige Zahl, versuch es nochmal.");
    }
}
while (istGueltig == false);
Kein double.Parse mehr nötig - double.TryParse liefert uns a direkt über den out-Parameter. Und die Prüfung ist diesmal wirklich zuverlässig: Egal ob Buchstaben, ein leerer Text oder ein Punkt statt Komma eingegeben wird, istGueltig wird korrekt false, und wir fragen einfach nochmal.

Kurz zusammengefasst: TryParse prüft und wandelt in einem Schritt um, gibt dir als bool zurück, ob es geklappt hat, und liefert die eigentliche Zahl über einen out-Parameter - ganz ohne Absturzrisiko. Bei double.TryParse denk daran: Auf einem deutschen System zählt das Komma, nicht der Punkt.