check string op bedrag

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • check string op bedrag

      Hey!

      ik ben op zoek naar een manier om een extra controle uit te voeren op mijn PHP form.
      Een klant van mij wilt zijn facturen kunnen maken via zijn website. In de velden waar hij een bedrag kan in voeren,
      is het enkel maar mogelijk om cijfers in te voeren en een "."

      Maar uiteraard wil ik daar een extra controle op uitvoeren eenmaal de POST gebeurd is.
      Het ingevoerde bedrag moet altijd 1 cijfer voor de punt hebben en max 3 erna. (of enkel 1 cijfer zonder .)

      Bijvoorbeel:
      0.525 Goed
      1 Goed
      1562.1 Goed
      100.001 goed

      1.0004 Niet goed
      1...50 niet goed

      Wie kan mij hierbij helpen?
    • Hm, bovenstaande regexp doet bijna wat je wilt.

      De volgende cases worden ten onrechte geaccepteerd:
      1.
      00.000

      Ik denk dat de volgende regexp iets nauwkeuriger is, die (beter) lijkt te doen wat je wilt:
      #^(0|[1-9][0-9]*)(\.[0-9]{1,3})?$#

      Het bedrag voor de punt mag ofwel enkel bestaan uit het cijfer nul, of bestaat uit een of meer cijfers, maar moet dan beginnen met een cijfer gelijk aan of groter dan 1.
      Indien het bedrag een punt heeft bestaat het bedrag achter deze punt uit ten minste één decimaal, en maximaal drie decimalen.

      Testjes

      PHP Source Code

      1. <?php
      2. /*
      3. https://www.ictscripters.com/Thread/24643-check-string-op-bedrag/
      4. */
      5. $tests = array(
      6. '0.522' => true,
      7. '1' => true,
      8. '1562.1' => true,
      9. '100.001' => true,
      10. '1.0004' => false,
      11. '1...50' => false,
      12. '1.' => false, // accepted with pattern #1
      13. '00.000' => false, // accepted with pattern #1
      14. '0.000' => true,
      15. '0.00' => true,
      16. '0.0' => true,
      17. '0' => true,
      18. '.05' => false,
      19. "1.250\n" => true, // gotcha
      20. );
      21. // #1
      22. $pattern = '#^[0-9]+(\.)?[0-9]{0,3}$#';
      23. // #2
      24. $pattern = '#^(0|[1-9][0-9]*)(\.[0-9]{1,3})?$#';
      25. foreach ($tests as $test => $expectedResult) {
      26. $match = preg_match($pattern, $test) === 1;
      27. if ($match === $expectedResult) {
      28. echo 'pattern '.$test.' does'.($expectedResult ? '' : ' not').' match, as expected.<br>';
      29. } else {
      30. echo '[error] pattern '.$test.' did not match expected result.<br>';
      31. }
      32. }
      33. ?>
      Display All


      Gotchas / aandachtspunten:
      * preg_match() retourneert het cijfer 1 als het patroon matcht. Het loont dus de moeite om hier expliciet mee te vergelijken ( === 1).
      * little known fact: de modifier $ matcht ook één newline character (\n - zie de laatste case). Wellicht doe je er ook verstandig aan om het resultaat (misschien ten overvloede) nog te trimmen.

      Wat je natuurlijk ook kunt doen is het veld voor het bedrag splitsen in twee velden: een voor het deel voor de punt, en een na de punt. Op die manier wordt de controle op het numerieke gedeelte (x2) natuurlijk ook een stuk eenvoudiger en heb je minder kans op fouten tijdens invoer.

      The post was edited 3 times, last by FangorN ().

    • top! Ik ga met onderstaande aan de slag!
      Ik had reeds al een javascript gevonden die enkel cijfers toeliet en een “.” Maar daar kon je meerdere plaatsten.

      Ik test dit vandaag even uit en hou jullie op de hoogte!

      FangorN wrote:

      Hm, bovenstaande regexp doet bijna wat je wilt.

      De volgende cases worden ten onrechte geaccepteerd:
      1.
      00.000

      Ik denk dat de volgende regexp iets nauwkeuriger is, die (beter) lijkt te doen wat je wilt:
      #^(0|[1-9][0-9]*)(\.[0-9]{1,3})?$#

      Het bedrag voor de punt mag ofwel enkel bestaan uit het cijfer nul, of bestaat uit een of meer cijfers, maar moet dan beginnen met een cijfer gelijk aan of groter dan 1.
      Indien het bedrag een punt heeft bestaat het bedrag achter deze punt uit ten minste één decimaal, en maximaal drie decimalen.

      Testjes

      PHP Source Code

      1. <?php
      2. /*
      3. https://www.ictscripters.com/Thread/24643-check-string-op-bedrag/
      4. */
      5. $tests = array(
      6. '0.522' => true,
      7. '1' => true,
      8. '1562.1' => true,
      9. '100.001' => true,
      10. '1.0004' => false,
      11. '1...50' => false,
      12. '1.' => false, // accepted with pattern #1
      13. '00.000' => false, // accepted with pattern #1
      14. '0.000' => true,
      15. '0.00' => true,
      16. '0.0' => true,
      17. '0' => true,
      18. '.05' => false,
      19. "1.250\n" => true, // gotcha
      20. );
      21. // #1
      22. $pattern = '#^[0-9]+(\.)?[0-9]{0,3}$#';
      23. // #2
      24. $pattern = '#^(0|[1-9][0-9]*)(\.[0-9]{1,3})?$#';
      25. foreach ($tests as $test => $expectedResult) {
      26. $match = preg_match($pattern, $test) === 1;
      27. if ($match === $expectedResult) {
      28. echo 'pattern '.$test.' does'.($expectedResult ? '' : ' not').' match, as expected.<br>';
      29. } else {
      30. echo '[error] pattern '.$test.' did not match expected result.<br>';
      31. }
      32. }
      33. ?>
      Display All

      Gotchas / aandachtspunten:
      * preg_match() retourneert het cijfer 1 als het patroon matcht. Het loont dus de moeite om hier expliciet mee te vergelijken ( === 1).
      * little known fact: de modifier $ matcht ook één newline character (\n - zie de laatste case). Wellicht doe je er ook verstandig aan om het resultaat (misschien ten overvloede) nog te trimmen.

      Wat je natuurlijk ook kunt doen is het veld voor het bedrag splitsen in twee velden: een voor het deel voor de punt, en een na de punt. Op die manier wordt de controle op het numerieke gedeelte (x2) natuurlijk ook een stuk eenvoudiger en heb je minder kans op fouten tijdens invoer.