Thorsten Steffen: Regulärer Ausdruck zum Überprüfen von Preisfeldern

Hi,
ich suche einen regulären Ausdruck, um Preisfelder der Form "123,45" zu überprüfen, also Ziffern und Komma dürfen vorkommen.
Habs mal mit
if ($preis =~ /[0-9,]/) ...
probiert, aber irgendwie funktionierts nicht.
Wie muß es heißen und wie prüft man generell Felder, in denen nur bestimmte Zeichen vorkommen dürfen.
Hab in selfhtml nix zu diesen speziellen Fällen gefunden.

Gruß
Thorsten

  1. Wie muß es heißen und wie prüft man generell Felder, in denen nur bestimmte Zeichen vorkommen dürfen.
    Hab in selfhtml nix zu diesen speziellen Fällen gefunden.

    hallo,
    hier mal ein Stueck js:
      if (theForm.Stmd_Knr.value == "")
      {
        alert("Geben Sie einen Wert in das Feld "Kundennummer" ein.");
        theForm.ccode.focus();
        return (false);
      }
    var checkOK = "0123456789";
      var checkStr = theForm.Stmd_Knr.value;
      var allValid = true;
      var decPoints = 0;
      var allNum = "";
      for (i = 0;  i < checkStr.length;  i++)
      {
        ch = checkStr.charAt(i);
        for (j = 0;  j < checkOK.length;  j++)
          if (ch == checkOK.charAt(j))
            break;
        if (j == checkOK.length)
        {
          allValid = false;
          break;
        }
        if (ch == ",")
        {
          allNum += ".";
          decPoints++;
        }
        else
          allNum += ch;
      }
      if (!allValid)
      {
        alert("Geben Sie nur Ziffern in das Feld "Kundennummer" ein.");
        theForm.Stmd_Knr.focus();
        return (false);
      }
    vielleicht nuetzt Dir das was.
    Gruss
    Christian

  2. Hi!

    $i = <STDIN>;
    chomp($i);
    if ($i =~ /[^0-9,]/) {
    print "Bad format!\n";
    } else {
    print "Ok!\n";
    }

    Ok, muß für nen CGI natürlich angepasst werden, sollte dich aber in die richtige Richtung weisen.

    CU
    ArneB

  3. Hallo Thorsten,

    if ($preis =~ /[0-9,]/) ...
    probiert, aber irgendwie funktionierts nicht.

    damit überprüfst Du nur, ob eine Zahl oder ein Komma vorkommt.

    Du kannst nun mehrere Methoden verwenden, um die Eingabe zu überprüfen. Entweder du Überprüfst, ob die die Eingabe dem geforderten Format entspricht, oder ob unerlaubte bzw. nur erlaubte Zeichen vorkommen,....
    Ich würde folgendermaßen vorgehen:
    Wie schaut ein Preis aus: 123,45 / 123,4 oder nur 123. Danach bastel ich mir dann die RegExp:
       if ($preis =~ /^\d+(,\d{1,2})$/) {...}
                      ^..................Anfang der Variablen
                       ^.................mindestens eine Ziffer
                           ^.............Komma mit ...
                             ^...........einer oder zwei Ziffern...
                                   ^.....oder keine Nachkommastellen
                                     ^...Ende der Variablen (vor Newline)  
    Im übrigen bietet es sich immer an, mit einer RegExp das Eingabeformat zu überprüfen (sofern es eindeutig vorgegeben ist), und nicht auf einzelne Zeichen zu testen, da dies wesentlich genauer ist.

    Gruß AlexBausW

    1. Hi Alex,
      vielen Dank für Deine Hilfe, hab aber noch einige Fragen zum Verständnis Deines Ausdruckes:

      • Kann ich anstatt \d{1,2} auch 0-9{1-2} angeben ?
      • Fangen also Eingabeformatprüfungen immer mit ^ an und hören mit $ auf ?

      Gruß
      Thorsten

      Hallo Thorsten,

      if ($preis =~ /[0-9,]/) ...
      probiert, aber irgendwie funktionierts nicht.

      damit überprüfst Du nur, ob eine Zahl oder ein Komma vorkommt.

      Du kannst nun mehrere Methoden verwenden, um die Eingabe zu überprüfen. Entweder du Überprüfst, ob die die Eingabe dem geforderten Format entspricht, oder ob unerlaubte bzw. nur erlaubte Zeichen vorkommen,....
      Ich würde folgendermaßen vorgehen:
      Wie schaut ein Preis aus: 123,45 / 123,4 oder nur 123. Danach bastel ich mir dann die RegExp:
         if ($preis =~ /^\d+(,\d{1,2})$/) {...}
                        ^..................Anfang der Variablen
                         ^.................mindestens eine Ziffer
                             ^.............Komma mit ...
                               ^...........einer oder zwei Ziffern...
                                     ^.....oder keine Nachkommastellen
                                       ^...Ende der Variablen (vor Newline)  
      Im übrigen bietet es sich immer an, mit einer RegExp das Eingabeformat zu überprüfen (sofern es eindeutig vorgegeben ist), und nicht auf einzelne Zeichen zu testen, da dies wesentlich genauer ist.

      Gruß AlexBausW

      1. Hallo Thorsten,

        • Kann ich anstatt \d{1,2} auch 0-9{1-2} angeben ?

        Nicht ganz! So wie Du es geschrieben hast, würde es auf die Strings "0-9" und "0-99" passen. Die geschweiften Klammern beziehen sich auf den Ausdruck direkt davor (also in deinem Fall die 9). Da du aber wohl eigentliche eine Auswahl der Ziffern 0-9 haben wolltest, hast Du hier nur die eckigen Klammern vergessen:
        [0-9]{1,2}
        \d ist einfach nur die Kurzform für Ziffern (digits).

        • Fangen also Eingabeformatprüfungen immer mit ^ an und hören mit $ auf ?

        Sollten sie! Zumindest, wenn Du den kompletten String überprüfen möchtest ^ und $ stehen für Zeilenanfang bzw. -ende. Wenn Du also eine Zahlenüberprüfung ohne diese Zeichen durchführst, sind auch Strings wie "blafasel123,45blubb" gültig, da ja eine Zahl im geforderten Format vorkommt ...

        Gruß,
           Jörk

        PS: Nicht immer das ganze Geraffel vom vorherigen Text quoten ...