Laden...

Regex nur für Zahlen und Löschtaste

Erstellt von TigerCrow vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.410 Views
T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 7 Jahren
Regex nur für Zahlen und Löschtaste

Hallo,

brauche mal wieder Hilfe 🙁 bei C# Formulare

Habe folgendes geschrieben:


public static bool nurZahlen(KeyPressEventArgs e)
        {

            return Regex.IsMatch(e.KeyChar.ToString(),@"\b[0-9]");
}


nur leider tut das net 🙁 Zahlen kann ich keine eingeben .. dafür aber buchstaben 🙁
Kann mir bitte jemand helfen?

Wobei dies aber funktioniert:


 public static bool nurZahlen(KeyPressEventArgs e)
        {

            if ("1234567890\b".IndexOf(e.KeyChar.ToString()) < 0)
                return true;
            else
                return false;
        }

Würde es aber gerne mit einem Regulären Ausdruck machen! Kann mir bitte jemand helfen?

Lieben Gruß
TigerCrow

D
985 Beiträge seit 2014
vor 7 Jahren

Du willst einen RegEx-Ausdruck haben um ein Zeichen (char) zu überprüfen. Habe ich das so richtig verstanden?

Findest du das nicht etwas oversized?

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 7 Jahren

Hast Du richtig verstanden und ja gebe Dir recht das dies wie Du so schön sagst oversized ist

Aber Du kennst mich ja inzwieschen 😉

Und wie schreibe ich das jetzt mit einem Regulären ausdruck?

16.842 Beiträge seit 2008
vor 7 Jahren

Sir Rufo hat schon recht: was Du da machst ist einfach nur Quatsch, verschenkte Zeit und verschenkte Ressourcen.
Regex ist kostenintensiv im Sinne der Rechenzeit. Das ist einfach - sorry - alles andere als intelligent, das mit Regex zu machen 😉

Aber um die Frage zu beantworten:

\b[0-9] matched einwandrei auf Ziffern, aber nicht auf Zahlen.
Was Du hier überprüfst ist auch eigentlich eine Ziffer (da Du auch nur ein Char und kein String als Eingang hast).

Ich bezweifle also, dass es hier am Regex liegt.
Aber das kannste ja prima selbst mit dem Debugger herausfinden.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

  if ("1234567890\b".IndexOf(e.KeyChar.ToString()) < 0)
                return true;

sieht für mich logisch gesehen auch falsch aus.
Wenn es weniger als 0 (also wenn IndexOf nichts findet und -1 liefert), dann lieferst Du true zurück. Ist es das, was Du wirklich willst? 🤔
Vermutlich liegt der Fehler eher in Deiner Logik des Aufrufs von "nurZahlen".

Dazu auch gleich:
[Artikel] C#: Richtlinien für die Namensvergabe

Und wenn eine Methode "NurZahlen" heisst, dann sollte sie auch "nur Zahlen" verarbeiten und nicht noch \b.
Sonst macht der Name absolut keinen Sinn.

Zudem mischt Du UI mit Logik => zukünftige Probleme vorprogrammiert
[Artikel] Drei-Schichten-Architektur

D
985 Beiträge seit 2014
vor 7 Jahren

Zum Prüfen ob ein char eine Ziffer darstellt gibt es sogar schon eine eingebaute Methode Char.IsDigit()

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo TigerCrow,

KeyPress ist der falsche Ansatzpunkt. Das führt zu mehreren Problemen und stellt im schlimmsten Fall nicht mal das gewünschte Verhalten sicher. Richtig ist TextChanged. Alles weiter steht in [FAQ] In einer TextBox nur bestimmte Zeichen/Eingaben zulassen.

Hallo Abt,

Regex ist kostenintensiv im Sinne der Rechenzeit. Das ist einfach - sorry - nur dumm alles andere als intelligent, das mit Regex zu machen 😉

ich halte es für vollkommen überzogen, Regex so pauschal zu verteufeln. Mal abgesehen davon, dass Regex je nach Anwendungsfall sogar schneller sein kann, als andere Methoden und dass in vielen Fällen der geringe Implementierungs- und Wartungsaufwand bei gleichzeitig höherer Flexibilität und fast immer gar nicht spürbarer Laufzeit für Regex spricht, geht es im konkreten Fall um die Reaktion auf eine Benutzereingabe. Da ist immer der Benutzer der limitierende Faktor und die Laufzeit des Codes quasi immer zu vernachlässigen. Daher halte ich es für vollkommen unangemessen, von der Verwendung von Regex für diesen Fall (und auch allgemein) auf die Dummheit oder Intelligenz des Programmierers schließen zu wollen.

herbivore

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 7 Jahren

Danke für eure Infos
ein kleiner Code hätte es auch getan 🙂

aber so geht es:


public static bool nurZahlen(KeyPressEventArgs e)
        {

            return !Regex.IsMatch(e.KeyChar.ToString(),@"\b[0-9]");
}

Ihr wisst das man manchmal was sieht und das machen möchte, nur dann wenn es nicht geht, warum auch immer, fragt man sich halt warum.
Das mit dem char.isDigit wusste ich nicht .. Danke dafür.

Was mit den Regulären ausdrücken ist ... habe ich immer gedacht die wären besonders schnell .. lag ich wohl falsch ... aber wieder was gelernt 🙂

vielen Dank

Gruß
TigerCrow

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo TigerCrow,

aber so geht es:

nein, so geht es eben nicht. Zumindest hat die Behandlung in KeyPress vorzunehmen unerwünschte Nebenwirkungen. Wie ich schon schrieb, siehe [FAQ] In einer TextBox nur bestimmte Zeichen/Eingaben zulassen.

herbivore