Laden...

Zahlenwerte in Stringvariable

Erstellt von clive vor 18 Jahren Letzter Beitrag vor 17 Jahren 22.584 Views
Information von herbivore vor 18 Jahren

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!

C
clive Themenstarter:in
26 Beiträge seit 2004
vor 18 Jahren
Zahlenwerte in Stringvariable

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

822 Beiträge seit 2005
vor 18 Jahren

du könntest es mit

Int32.TryParse()

oder

double.tryParse()

probieren

Musst in den Klammern natürlich die notwendigen Argumente angeben 😁

564 Beiträge seit 2006
vor 18 Jahren

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 😁 :]

M
41 Beiträge seit 2005
vor 18 Jahren

bool isNumeric(string x)
{
       try
       {
            Convert.ToInt32(x);
            return true;
       }
       catch
       {
            return false;
       }
}

Pfusch, aber es geht 😉

...

822 Beiträge seit 2005
vor 18 Jahren

so würde ich das nicht machen, tryparse ist vorzuziehen

822 Beiträge seit 2005
vor 18 Jahren

so funktionierts:

bool isNumeric(string x)
        {
            int result;

            Int32.TryParse(x, out result); //Int32,double,decimal,...

            if (result == 0)
                return false;
            else
                return true;
        }
564 Beiträge seit 2006
vor 18 Jahren

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 😁 :]

X
2.051 Beiträge seit 2004
vor 18 Jahren

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

M
41 Beiträge seit 2005
vor 18 Jahren

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....

...

N
53 Beiträge seit 2006
vor 18 Jahren

hi,

doch, in .net 1.1 gibts

Int32.Parse()

das funktioniert genau so.

mfg nowanet

**:::

822 Beiträge seit 2005
vor 18 Jahren
return int.TryParse(s, out i);  
  

Du hast recht, so gehts nämlich 😁

564 Beiträge seit 2006
vor 18 Jahren

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 😁 :]

C
clive Themenstarter:in
26 Beiträge seit 2004
vor 18 Jahren

Vieln Dank Leute!
TryParse ist das was ich gesucht habe: 🙂


greets Clive

S
259 Beiträge seit 2004
vor 17 Jahren

Mal ne Frage.

Wie kann man in .NET 1.1 diese Überprüfung ohne Exception durchführen?

S
8.746 Beiträge seit 2005
vor 17 Jahren

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

S
259 Beiträge seit 2004
vor 17 Jahren

Das müsste doch eigentlich mit Regular Expressions gehen. Bloß wie?

S
8.746 Beiträge seit 2005
vor 17 Jahren

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.

M
1.439 Beiträge seit 2005
vor 17 Jahren

(+|-)?[0-9]+
Allerdings kann noch immer ein Overflow auftreten.

563 Beiträge seit 2004
vor 17 Jahren

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

563 Beiträge seit 2004
vor 17 Jahren

Original von marsgk
(+|-)?[0-9]+
Allerdings kann noch immer ein Overflow passieren.

falsch, ABC12 würde 12 zurückliefern, obwohl ABC12 keine Zahl ist.

S
8.746 Beiträge seit 2005
vor 17 Jahren

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.

563 Beiträge seit 2004
vor 17 Jahren

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

S
259 Beiträge seit 2004
vor 17 Jahren

Und da es in .NET 1.1 kein TryParse gibt. Muss ich wohl RegEx verwenden.

49.485 Beiträge seit 2005
vor 17 Jahren

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