LastBoyScout: Mit if() auf Zahlen von 0 - 20 Prüfen

Hallo,

Wie kann ich in einer if() Anweisung den Inhalt einer Variable auf Zahlen von 0 bis einschließlich 20 Prüfen?

Mit preg_match() könnte es gehen, aber was gebe ich da als Suchmuster an?

Gruß
LSB

  1. Hi,

    Wie kann ich in einer if() Anweisung den Inhalt einer Variable auf Zahlen von 0 bis einschließlich 20 Prüfen?

    indem Du 1.) dafür sorgst, dass es Zahlen _sind_ (also insbesondere keine Strings), 2.) prüfst, ob sie in dem Zahlenbereich liegen, und ggf. 3.) um eine Prüfung ergänzt, ob die Werte Deiner Definition von "Zahl" entsprechen. Dieser Punkt kann bereits bei 1.) geschehen sein.

    Mit preg_match() könnte es gehen, aber was gebe ich da als Suchmuster an?

    Nein, Bereiche sind keine Muster.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Wie kann ich in einer if() Anweisung den Inhalt einer Variable auf Zahlen von 0 bis einschließlich 20 Prüfen?

      indem Du 1.) dafür sorgst, dass es Zahlen _sind_ (also insbesondere keine Strings), 2.) prüfst, ob sie in dem Zahlenbereich liegen, und ggf. 3.) um eine Prüfung ergänzt, ob die Werte Deiner Definition von "Zahl" entsprechen. Dieser Punkt kann bereits bei 1.) geschehen sein.

      Mit preg_match() könnte es gehen, aber was gebe ich da als Suchmuster an?

      Nein, Bereiche sind keine Muster.

      jein - ein bereich in einem beliebigen zahlensystem als string ausgedrückt kann man durchaus als muster intepretieren

      allerdings ist ein regulärer ausdruck in diesem fall die kompliziertere variante

      if zahl größer-gleich 0 und zahl kleiner-gleich 20

      im vergleich zu

      suche eine 1 bis 2-stellige ziffer die, wenn sie 1-stellig ist einen beliebigen wert haben kann und wenn sie 2-stellig ist an erster stelle nur 1 oder 2 beinhalten darf ;)

      1. Hello,

        indem Du 1.) dafür sorgst, dass es Zahlen _sind_ (also insbesondere keine Strings),

        Er kann nur prüfen, ob der übermittelte String eine gültige Zahl repräsentiert. Und das muss er auch, wenn er 0 als gültige Eingabe zulassen will. Anderenfalls würde ein  $zahl=intval($zahlstring) genügen mit anschließendem Rangecheck.

        Um eine Prüfung per Muster kommt er also hier nicht herum.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. indem Du 1.) dafür sorgst, dass es Zahlen _sind_ (also insbesondere keine Strings),

          Er kann nur prüfen, ob der übermittelte String eine gültige Zahl repräsentiert. Und das muss er auch, wenn er 0 als gültige Eingabe zulassen will. Anderenfalls würde ein  $zahl=intval($zahlstring) genügen mit anschließendem Rangecheck.

          Um eine Prüfung per Muster kommt er also hier nicht herum.

          In perl kann ich auch ohne RE auskommen

          if( index( join( '_', 0 .. 20 ), $test ) >= 0  ){ #tu was }

          mfg Beat

          --
          Woran ich arbeite:
          X-Torah
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
        2. Hallo Tom,

          Um eine Prüfung per Muster kommt er also hier nicht herum.

          Genau das mit den Mustern ist immer mein Problem!
          Könntest du es mir freundlicherweise an einem Beispiel zu meinem Problem erläutern!?

          Danke und Gruß aus dem tief verschneiten Thüringer Wald,
          LSB

          1. Genau das mit den Mustern ist immer mein Problem!
            Könntest du es mir freundlicherweise an einem Beispiel zu meinem Problem erläutern!?

            php verfügt über routinen zur musterprüfung, in deinem fall ist is_numeric() die schlauste wahl um zu prüfen ob das zu prüfende eine gültige zahl ist - wenn ds passiert ist, kommst du mit grundschul-mathematik weiter ...

        3. Hi,

          Um eine Prüfung per Muster kommt er also hier nicht herum.

          Klar kann man das mit preg_match() machen, aber es gibt seit 4.3 standardmäßig ctype_digit(). Ich habe nur für ältere PHP-Versionen (meine Scripts laufen ab 4.1) noch eine eigene ctype_digit-Funktion, die dessen Funktionalität mittels preg_match() nachbildet ...

          Gruß, Cybaer

          --
          Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
          (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
          1. Hallo Cybaer,

            Klar kann man das mit preg_match() machen, aber es gibt seit 4.3 standardmäßig ctype_digit().

            Danke, das war der entscheidende Hinweis.

            Hab´s jetzt so:
            if (!empty($MAPpart[0][2]) && ctype_digit($MAPpart[0][2]) && $MAPpart[0][2] >= 0 && $MAPpart[0][2] <= 20)...

            Ist zwar ein wenig lang, aber Funktioniert!

            Eventuell könnte man es ja noch etwas einkochen!?

            Gruß
            LSB

            1. Ist zwar ein wenig lang, aber Funktioniert!
              Eventuell könnte man es ja noch etwas einkochen!?

              wie erwähnt würde ich eher zu is_numeric greifen, ctype_digit liefert zurück ob in einem string alle stellen eine dezimale ziffer sind

              ctype_digit(1) liefert false ctype_digit('1') true
              is_numeric(1) oder is_numeric('1') liefert true

              das !empty kannst du dir ggf auch sparen, da is_nummeric ohnehin false liefert bei einem leerstring

              1. Hallo suit,

                wie erwähnt würde ich eher zu is_numeric greifen, ctype_digit liefert zurück ob in einem string alle stellen eine dezimale ziffer sind

                Ja, aber is_numeric erlaubt auch . und , als Trennzeichen was ctype_digit ebenfalls mit herausfiltert:

                ctype_digit(1,0) liefert false
                is_numeric(1,0) liefert true

                Da meine Werte aus einer ini Datei kommen, hat er scheinbar kein Problem mit nem vermeintlichen string und daher scheint mir ctype_digit vorteilhafter.

                Gruß
                LBS

                1. Hello,

                  Ja, aber is_numeric erlaubt auch . und , als Trennzeichen was ctype_digit ebenfalls mit herausfiltert:

                  ctype_digit(1,0) liefert false
                  is_numeric(1,0) liefert true

                  Da meine Werte aus einer ini Datei kommen, hat er scheinbar kein Problem mit nem vermeintlichen string und daher scheint mir ctype_digit vorteilhafter.

                  Das kannst nur DU als Programmierer entscheiden, welche Funktion hier die passendere ist. Und eine Tipp möchte ich Dir ungefragt dazu noch geben: Dokumentiere die Entscheidung ausreichend. WEnn Du später mal das Programm verändern willst, sollte Die sofort klar werden, warum Du dich für welche Funktion entschieden hast.

                  Liebe Grüße aus Syburg bei Dortmund

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
          2. Hello,

            Um eine Prüfung per Muster kommt er also hier nicht herum.

            Klar kann man das mit preg_match() machen, aber es gibt seit 4.3 standardmäßig ctype_digit(). Ich habe nur für ältere PHP-Versionen (meine Scripts laufen ab 4.1) noch eine eigene ctype_digit-Funktion, die dessen Funktionalität mittels preg_match() nachbildet ...

            Ja, guter Tipp für die Überprüfung von positiven Ganzzahlen.

            Ist aber eben leider nicht für Dezimalzahlen oder negative Zahlen geeignet. Überprüfung auf Muster heit nicht unbedingt, dass man regular Expressions nutzen muss. Man kann das auch ganz bodenständig lösen. Dass das dann aber noch sehr viel sparsamer ist, bezeweifele ich.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
      2. Hi suit!

        suche eine 1 bis 2-stellige ziffer die, wenn sie 1-stellig ist einen beliebigen wert haben kann und wenn sie 2-stellig ist an erster stelle nur 1 oder 2 beinhalten darf ;)

        Also 0 bis 29! Genau das, was der Fragesteller gesucht hat. =)

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Also 0 bis 29! Genau das, was der Fragesteller gesucht hat. =)

          hossa, siehst du: dann wird der reguläre ausdruck gleich nochmal ein stückchen länger - also wieder ein grund mehr nicht für alles reguläre ausdrücke zu verwenden