Loading ...
Sorry, an error occurred while loading the content.

RE: [PBML] How to check if the user input is number?

Expand Messages
  • Jaco
    Thanks everyone for your help :) I ve read a few basic things on regexps but need to find loads of examples really to read through and try and understand To
    Message 1 of 11 , Apr 2, 2003
    • 0 Attachment
      Thanks everyone for your help :)

      I've read a few basic things on regexps but need to find loads of examples
      really to read through and try and understand

      To elaborate a bit: Before the code posted earlier by me, I have this:

      for ($i = 1; $i <= 10; $i++)
      {
      print "[$i] $i times tables.\n";
      }
      print "\n";

      chomp ($times_table = <STDIN>);

      etc ....

      It's a program for my son to practice his times tables and prints out a list
      times tables, dependant on the upper/max value of $i above.

      Is there some way that I could incorporate that into the regexp?
      For example, say he got really good at his times tables and wanted to be
      able to do up to his 25 times tables

      We now have
      ($i = 1; $i <= 25; $i++)

      At the moment if I type in q then it tries getting me to do my "q" times
      tables !
      So basically if it's not a value that I takes then the program should
      die/exit.
      If it is then it continues.

      The question is how could the regexp check to see if the value belonged to
      all possible values that $i takes ???

      (Hope that makes sense!)

      Cheers

      David


      -----Original Message-----
      From: Stern, Leon [mailto:lstern@...]
      Sent: 03 April 2003 00:05
      To: perl-beginner@yahoogroups.com
      Subject: RE: [PBML] How to check if the user input is number?


      Here is a section from the perl cookbook.
      -------------------------------------------------------------
      Checking Whether a String Is a Valid Number

      Problem

      You want to check whether a string represents a valid number. This is a
      common problem when validating input, as in a CGI script.

      Solution

      Compare it against a regular expression that matches the kinds of numbers
      you're interested in.

      if ($string =~ /PATTERN/) {
      # is a number
      } else {
      # is not
      }

      Discussion

      This problem gets to the heart of what we mean by a number. Even things that
      sound simple, like integer, make you think hard about what you will accept
      ("Is a leading + for
      positive numbers optional, mandatory, or forbidden?"). The many ways that
      floating-point numbers can be represented could overheat your brain.

      You must decide what you will and will not accept. Then, construct a regular
      expression to match those things alone. Here are some precooked solutions
      (the cookbook's
      equivalent of just-add-water meals) for most common cases.

      warn "has nondigits" if /\D/;
      warn "not a natural number" unless /^\d+$/; # rejects -3
      warn "not an integer" unless /^-?\d+$/; # rejects +3
      warn "not an integer" unless /^[+-]?\d+$/;
      warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
      warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
      warn "not a C float"
      unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;

      -----Original Message-----
      From: Jaco [mailto:jaco2001uk@...]
      Sent: Wednesday, April 02, 2003 14:41
      To: perl-beginner@yahoogroups.com
      Subject: [PBML] How to check if the user input is number?


      Hi

      Hope this isn't too silly a question but I am very new to Perl and am trying
      to check if the users input is a number.

      Basically, here's what I've got so far. (I know it's probably not very good
      but I'm learning!)

      chomp ($times_table = <STDIN>);

      if ($times_tables =~ [0-9])
      {
      print "\nOK, so you want to try your $times_table times tables!\n";
      }
      else
      {
      exit;
      }

      What I want to do is
      if $times_table is a number then continue through the program, if it's not
      exit

      Any help would be really appreciated

      TIA

      David



      Yahoo! Groups Sponsor

      ADVERTISEMENT

      <http://rd.yahoo.com/M=246920.2960106.4328965.1728375/D=egroupweb/S=17050069
      51:HM/A=1513704/R=0/*http://www.gotomypc.com/u/tr/yh/cpm/grp/300_02F/g22lp?T
      arget=mm/g22lp.tmpl>

      <http://us.adserver.yahoo.com/l?M=246920.2960106.4328965.1728375/D=egroupmai
      l/S=:HM/A=1513704/rand=421178574>

      Unsubscribing info is here:
      http://help.yahoo.com/help/us/groups/groups-32.html

      Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service
      <http://docs.yahoo.com/info/terms/> .




      [Non-text portions of this message have been removed]



      Unsubscribing info is here:
      http://help.yahoo.com/help/us/groups/groups-32.html

      Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
    • Stern, Leon
      You need something like this untested code -- $flag = keep-going ; while ( $flag eq keep-going ) { print Enter the table you want to work with ;
      Message 2 of 11 , Apr 2, 2003
      • 0 Attachment
        You need something like this untested code --

        $flag = "keep-going";

        while ( $flag eq "keep-going") {
        print "Enter the table you want to work with <1-25> ";

        $value = <>;
        chomp $value;
        if ( $value > 0 && $value < 26 ) {
        $flag = "exit-loop";
        }
        else {
        print "$value is not a number between 1 and 25\n";
        }
        }


        Leon


        -----Original Message-----
        From: Jaco [mailto:jaco2001uk@...]
        Sent: Wednesday, April 02, 2003 15:43
        To: perl-beginner@yahoogroups.com
        Subject: RE: [PBML] How to check if the user input is number?


        Thanks everyone for your help :)

        I've read a few basic things on regexps but need to find loads of examples
        really to read through and try and understand

        To elaborate a bit: Before the code posted earlier by me, I have this:

        for ($i = 1; $i <= 10; $i++)
        {
        print "[$i] $i times tables.\n";
        }
        print "\n";

        chomp ($times_table = <STDIN>);

        etc ....

        It's a program for my son to practice his times tables and prints out a list
        times tables, dependant on the upper/max value of $i above.

        Is there some way that I could incorporate that into the regexp?
        For example, say he got really good at his times tables and wanted to be
        able to do up to his 25 times tables

        We now have
        ($i = 1; $i <= 25; $i++)

        At the moment if I type in q then it tries getting me to do my "q" times
        tables !
        So basically if it's not a value that I takes then the program should
        die/exit.
        If it is then it continues.

        The question is how could the regexp check to see if the value belonged to
        all possible values that $i takes ???

        (Hope that makes sense!)

        Cheers

        David


        -----Original Message-----
        From: Stern, Leon [mailto:lstern@...]
        Sent: 03 April 2003 00:05
        To: perl-beginner@yahoogroups.com
        Subject: RE: [PBML] How to check if the user input is number?


        Here is a section from the perl cookbook.
        -------------------------------------------------------------
        Checking Whether a String Is a Valid Number

        Problem

        You want to check whether a string represents a valid number. This is a
        common problem when validating input, as in a CGI script.

        Solution

        Compare it against a regular expression that matches the kinds of numbers
        you're interested in.

        if ($string =~ /PATTERN/) {
        # is a number
        } else {
        # is not
        }

        Discussion

        This problem gets to the heart of what we mean by a number. Even things that
        sound simple, like integer, make you think hard about what you will accept
        ("Is a leading + for
        positive numbers optional, mandatory, or forbidden?"). The many ways that
        floating-point numbers can be represented could overheat your brain.

        You must decide what you will and will not accept. Then, construct a regular
        expression to match those things alone. Here are some precooked solutions
        (the cookbook's
        equivalent of just-add-water meals) for most common cases.

        warn "has nondigits" if /\D/;
        warn "not a natural number" unless /^\d+$/; # rejects -3
        warn "not an integer" unless /^-?\d+$/; # rejects +3
        warn "not an integer" unless /^[+-]?\d+$/;
        warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
        warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
        warn "not a C float"
        unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;

        -----Original Message-----
        From: Jaco [mailto:jaco2001uk@...]
        Sent: Wednesday, April 02, 2003 14:41
        To: perl-beginner@yahoogroups.com
        Subject: [PBML] How to check if the user input is number?


        Hi

        Hope this isn't too silly a question but I am very new to Perl and am trying
        to check if the users input is a number.

        Basically, here's what I've got so far. (I know it's probably not very good
        but I'm learning!)

        chomp ($times_table = <STDIN>);

        if ($times_tables =~ [0-9])
        {
        print "\nOK, so you want to try your $times_table times tables!\n";
        }
        else
        {
        exit;
        }

        What I want to do is
        if $times_table is a number then continue through the program, if it's not
        exit

        Any help would be really appreciated

        TIA

        David



        Yahoo! Groups Sponsor

        ADVERTISEMENT

        < http://rd.yahoo.com/M=246920.2960106.4328965.1728375/D=egroupweb/S=17050069
        51:HM/A=1513704/R=0/* http://www.gotomypc.com/u/tr/yh/cpm/grp/300_02F/g22lp?T
        arget=mm/g22lp.tmpl>

        < http://us.adserver.yahoo.com/l?M=246920.2960106.4328965.1728375/D=egroupmai
        l/S=:HM/A=1513704/rand=421178574>

        Unsubscribing info is here:
        http://help.yahoo.com/help/us/groups/groups-32.html

        Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service
        < http://docs.yahoo.com/info/terms/> .




        [Non-text portions of this message have been removed]



        Unsubscribing info is here:
        http://help.yahoo.com/help/us/groups/groups-32.html

        Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/




        Yahoo! Groups Sponsor

        ADVERTISEMENT
        <http://rd.yahoo.com/M=246920.2960106.4328965.1728375/D=egroupweb/S=1705006951:HM/A=1513704/R=0/*http://www.gotomypc.com/u/tr/yh/cpm/grp/300_02F/g22lp?Target=mm/g22lp.tmpl>
        <http://us.adserver.yahoo.com/l?M=246920.2960106.4328965.1728375/D=egroupmail/S=:HM/A=1513704/rand=979867942>

        Unsubscribing info is here: http://help.yahoo.com/help/us/groups/groups-32.html

        Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service <http://docs.yahoo.com/info/terms/> .




        [Non-text portions of this message have been removed]
      • Charles K. Clarkson
        use POSIX isdigit ; foreach my $value ( 999, a3a , 3aa , 3 3 ) { print isdigit( $value ) ? $value is a number n ... } HTH, Charles K. Clarkson -- Head
        Message 3 of 11 , Apr 2, 2003
        • 0 Attachment
          use POSIX 'isdigit';

          foreach my $value ( 999, 'a3a', '3aa', '3 3' ) {
          print isdigit( $value )
          ? "$value is a number\n"
          : "$value is not a number\n";
          }


          HTH,

          Charles K. Clarkson
          --
          Head Bottle Washer,
          Clarkson Energy Homes, Inc.
          Mobile Home Specialists
          254 968-8328
        • Stern, Leon
          You are right! I forgot all about the is... functions. ... From: Charles K. Clarkson [mailto:cclarkson@htcomp.net] Sent: Wednesday, April 02, 2003 15:52 To:
          Message 4 of 11 , Apr 2, 2003
          • 0 Attachment
            You are right! I forgot all about the is... functions.

            -----Original Message-----
            From: Charles K. Clarkson [mailto:cclarkson@...]
            Sent: Wednesday, April 02, 2003 15:52
            To: perl-beginner@yahoogroups.com
            Subject: RE: [PBML] How to check if the user input is number?



            use POSIX 'isdigit';

            foreach my $value ( 999, 'a3a', '3aa', '3 3' ) {
            print isdigit( $value )
            ? "$value is a number\n"
            : "$value is not a number\n";
            }


            HTH,

            Charles K. Clarkson
            --
            Head Bottle Washer,
            Clarkson Energy Homes, Inc.
            Mobile Home Specialists
            254 968-8328



            Yahoo! Groups Sponsor

            ADVERTISEMENT
            <http://rd.yahoo.com/M=245454.3115308.4434529.1728375/D=egroupweb/S=1705006951:HM/A=1457554/R=0/*http://ipunda.com/clk/beibunmaisuiyuiwabei>
            <http://us.adserver.yahoo.com/l?M=245454.3115308.4434529.1728375/D=egroupmail/S=:HM/A=1457554/rand=294281671>

            Unsubscribing info is here: http://help.yahoo.com/help/us/groups/groups-32.html

            Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service <http://docs.yahoo.com/info/terms/> .




            [Non-text portions of this message have been removed]
          • Charles K. Clarkson
            ... What you need is a loop that will continue to query the user after incorrect input. This loop runs forever. It is dangerous but can be escaped on most
            Message 5 of 11 , Apr 2, 2003
            • 0 Attachment
              Jaco <jaco2001uk@...> asked:
              : The question is how could the regexp check to see if the
              : value belonged to all possible values that $i takes ???


              What you need is a loop that will continue to query
              the user after incorrect input. This loop runs forever.
              It is dangerous but can be escaped on most systems.

              my $max_table = 25;
              my $input;
              while (1) {
              print "Which table (1 - $max_table)?";
              chomp( $input = <STDIN> );
              }

              To break out we use the "last" function:

              use POSIX 'isdigit';

              my $max_table = 25;

              my $input;
              while (1) {
              print "Which table (1 - $max_table)?";
              chomp( $input = <STDIN> );

              last if isdigit( $input )
              && $input > 0
              && $input <= $max_table;
              }

              print "\n\nTable selected: $input times table\n";


              HTH,

              Charles K. Clarkson
              --
              Head Bottle Washer,
              Clarkson Energy Homes, Inc.
              Mobile Home Specialists
              254 968-8328

              P.S.



              A more generic approach would allow for a range
              of answers and a user query. Using a subroutine we
              could provide a return value. Of course, this is
              probably overkill, but:

              sub query_user {
              my $range = shift;
              my $query = shift;

              # create a hash of valid responses
              my %valid;
              @valid{ @$range } = (1) x @$range;

              while (1) {
              print $query;
              chomp( my $response = <STDIN> );
              return $response if $valid{ lc $response };
              print "\nPlease try again.\n";
              }
              }

              The advantage is the flexibility.

              my $times_table =
              query_user(
              [ 1 .. 25 ],
              'Which table (1 - $max_table)?'
              );

              my $another table =
              query_user(
              [ 'yes', 'y', 'no', 'n' ],
              'Another table?'
              );

              The disadvantage is only a finite number of
              values are possible. You can't ask for any number
              between 1 and 2, for example.
            Your message has been successfully submitted and would be delivered to recipients shortly.