Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!
Hallo Leute!
Wie kann ich prüfen ob es sich bei einem Wert einer Stringvariable um eine Zahl handelt.
Bei VB.NET gibts dazu IsNumeric(string)
Vielen Dank
clive
du könntest es mit
Int32.TryParse()
oder
double.tryParse()
probieren
Musst in den Klammern natürlich die notwendigen Argumente angeben 😁
Hi clive!
Um was für einen Zahlentyp soll es dich denn handeln? Du kannst für den Zweck z.B. decimal.TryParse(...) verwenden. Die Methode gibt einen bool-Wert zurück,der angibz, ob die Konvertierung erfolgreich war oder nicht.
der Marcel
EDIT: Zu spät... 🙂
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
bool isNumeric(string x)
{
try
{
Convert.ToInt32(x);
return true;
}
catch
{
return false;
}
}
Pfusch, aber es geht 😉
...
so würde ich das nicht machen, tryparse ist vorzuziehen
so funktionierts:
bool isNumeric(string x)
{
int result;
Int32.TryParse(x, out result); //Int32,double,decimal,...
if (result == 0)
return false;
else
return true;
}
Hi m4ri0!
wie du schon selbst sagst, es ist Pfusch! 🙂 Er sollte unser vorgeschlagenes TryParse verwenden, das ist der beste Weg!
der Marcel
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
Original von sbertl000
so funktionierts:bool isNumeric(string x) { int result; Int32.TryParse(x, out result); //Int32,double,decimal,... if (result == 0) return false; else return true; }
eh......mmmm.....und wenn im string 0 steht????
wenn schon, dann
return int.TryParse(s, out i);
aber danke für den Tipp mit dem TryParse, das war mir auch noch ned bekannt...
aber wohlgemerkt in .NET 1.1 gibts noch kein Int32.TryParse....
...
hi,
doch, in .net 1.1 gibts
Int32.Parse()
das funktioniert genau so.
mfg nowanet
**:::
return int.TryParse(s, out i);
Du hast recht, so gehts nämlich 😁
Hi!
Als Ergänzung für nowanets Beitrag: Entweder das Parse klappt (also ist eine Zahl) oder es kommt eine Exception (kein Zahl). Diese musst du dann mit try-catch behandeln. Aber in .Net2.0 brauch man den Weg nun nicht mehr zu gehen.
der Marcel
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
Mal ne Frage.
Wie kann man in .NET 1.1 diese Überprüfung ohne Exception durchführen?
Gar nicht. Oder du schreibst dir nen eigenen Parser. Alternativ kannst du den TryParse-Code einfach bei Mono klauen:
http://www.koders.com/csharp/fid376B75E1122859CA4DBA2071EE31E1B3DF47C1C5.aspx
Das müsste doch eigentlich mit Regular Expressions gehen. Bloß wie?
Original von phunkydizco
Das müsste doch eigentlich mit Regular Expressions gehen. Bloß wie?
Mit RegEx könntest du das Format prüfen, aber nicht wandeln. Nur mit RegEx kommst du also nicht weiter. aber wenn du die RegEx-prüfung gemacht hast, kannst du natürlich sicher sein, dass Parse keine Exception wirft. In bestimmten Anwendungsfällen mag das Sinn machen (wenn oft ungültige Eingaben kommen), i.d.R. aber nicht. Ich würde auch vermuten, dass die Kombination aus RegEx/Parse langsamer ist als TryParse. Zumindest der Aufwand ist theoretisch doppelt so hoch.
(+|-)?[0-9]+
Allerdings kann noch immer ein Overflow auftreten.
Original von phunkydizco
Das müsste doch eigentlich mit Regular Expressions gehen. Bloß wie?
viele Wege führen nach Rom, wieso du Regex verwenden willst ist mir ein Rätsel, es gibt ja bereits eine "einfachere" Methode!
Warum man eine Konvertierung ohne Try/Catch machen will verstehe ich auch nicht! Dieses Konstrukt beisst nicht. Wenn du es tatsächlich mit Regex ausprobieren willst, dann guck ma in die Doku, für dieses Problem gibt es eine Musterlösung, wenn ich mich nicht irre. Allerdings überprüfst du mit Regex nur das Format, schlussendlich musst du das Resultat immernoch in einen Integer umwandeln --> Int32.Parse()
.unreal
Original von marsgk
(+|-)?[0-9]+
Allerdings kann noch immer ein Overflow passieren.
falsch, ABC12 würde 12 zurückliefern, obwohl ABC12 keine Zahl ist.
Original von .unreal
Warum man eine Konvertierung ohne Try/Catch machen will verstehe ich auch nicht!
Weil das Werfen von Exceptions ziemlich lange dauert. Wenn jede 2. "Zahl" aus irgendeinem Grund keine Zahl ist, ist TryParse() dem alten Parse() vorzuziehen.
Original von svenson
Original von .unreal
Warum man eine Konvertierung ohne Try/Catch machen will verstehe ich auch nicht!Weil das Werfen von Exceptions ziemlich lange dauert. Wenn jede 2. "Zahl" aus irgendeinem Grund keine Zahl ist, ist TryParse() dem alten Parse() vorzuziehen.
In 2.0 sollt eman TryParse verwenden, kein Thema - ich ging von 1.1 aus.
Es hört sich nicht an, als ob hier auf Try/Catch aus Performancegründen verzichtet werden will, mehr nach dem Motto "ich mag das nicht". Sorry falls ich den falschen Eindruck habe.
.unreal
Und da es in .NET 1.1 kein TryParse gibt. Muss ich wohl RegEx verwenden.
Hallo .unreal.
wieso du Regex verwenden willst ist mir ein Rätsel, es gibt ja bereits eine "einfachere" Methode!
Regex ist in meinen Augen die einfachste Methode, ein bestimmtes Format zu überprüfen.
(Allerdings würde ich TryParse der Überprüfung mit Regex vorziehen, wenn, ja wenn, es hier nicht um 1.1 ginge. 🙂
Mit RegEx könntest du das Format prüfen, aber nicht wandeln.
Warum sollte man mit Regex nichts wandeln können? Es gibt doch Regex.Replace.
herbivore