Checking whether a string is a number in disguise?

Discussion in 'Ruby' started by Peter Bunyan, Nov 22, 2007.

  1. Peter Bunyan

    Peter Bunyan Guest

    I'm working on an RPN calculator (don't ask why...) and I'm having
    trouble getting a number from gets - how am I supposed to know whether
    it's a number?

    At the moment I'm doing [eval(oper) == oper.to_f], which is far from
    ideal. Any ideas? You all get to win my calculator if you know of a
    better way :D.
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Bunyan, Nov 22, 2007
    #1
    1. Advertising

  2. Alle gioved=C3=AC 22 novembre 2007, Peter Bunyan ha scritto:
    > I'm working on an RPN calculator (don't ask why...) and I'm having
    > trouble getting a number from gets - how am I supposed to know whether
    > it's a number?
    >
    > At the moment I'm doing [eval(oper) =3D=3D oper.to_f], which is far from
    > ideal. Any ideas? You all get to win my calculator if you know of a
    > better way :D.


    Do you mean you need to find out whether a string contains a number or not?=
    In=20
    this case, you can either use Kernel#Float, which returns str.to_f if the=20
    string contains a number and raises an exception owtherwise, or try to craf=
    t=20
    a regexp which only matches strings containing numbers. For example, the=20
    (untested) regexp

    /[+-]?\d+(.\d+)?(e[+-]?\d+)?/

    should match numbers with an optional + or - in front, followed by at least=
    =20
    one digit, with an optional decimal part (if there's a dot, there should be=
    =20
    at least one digit following it; if you want to allow something like 11. th=
    en=20
    replace (.\d+) with (.\d*) ). The number can also be in exponential form,=20
    with a downcase e and an optional + or - in front of the exponent.

    I hope this helps

    Stefano
     
    Stefano Crocco, Nov 22, 2007
    #2
    1. Advertising

  3. Peter Bunyan

    Peter Bunyan Guest

    Is that the only way to do it? There's no built-in method for telling if
    a string is a number? :(

    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Bunyan, Nov 22, 2007
    #3
  4. Alle gioved=C3=AC 22 novembre 2007, Peter Bunyan ha scritto:
    > Is that the only way to do it? There's no built-in method for telling if
    > a string is a number? :(


    As far as I know, no.

    Stefano
     
    Stefano Crocco, Nov 22, 2007
    #4
  5. 2007/11/22, Peter Bunyan <>:
    > I'm working on an RPN calculator (don't ask why...) and I'm having
    > trouble getting a number from gets - how am I supposed to know whether
    > it's a number?
    >
    > At the moment I'm doing [eval(oper) == oper.to_f], which is far from
    > ideal. Any ideas? You all get to win my calculator if you know of a
    > better way :D.


    str = gets # chomp is not needed for Float
    num = Float(str) rescue nil

    if num
    puts "I'm a number: #{num}"
    end

    Cheers

    robert

    --
    use.inject do |as, often| as.you_can - without end
     
    Robert Klemme, Nov 22, 2007
    #5
  6. Peter Bunyan

    Peter Bunyan Guest

    OK, this seems to work:

    class String
    def is_number?
    Float(self) == self.to_f
    rescue false
    end
    end
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Bunyan, Nov 22, 2007
    #6
  7. Peter Bunyan

    Ryan Davis Guest

    On Nov 22, 2007, at 10:05 , Peter Bunyan wrote:

    > Is that the only way to do it? There's no built-in method for
    > telling if
    > a string is a number? :(


    Strings are never numbers in ruby. Ever. That is the beauty of working
    in a clean typesafe language.

    What you're doing, possibly without realizing it, is writing a parser
    for RPN but it sounds like you've not addressed this project like a
    parser. I suggest you go look at the screencast for treetop (a parser
    generator). In this screencast they build up an infix parser, which is
    much more than you need for RPN, but the tool is clean, powerful, and
    worth learning.

    http://www.pivotalblabs.com/files/treetop-arithmetic-example.mov
     
    Ryan Davis, Nov 22, 2007
    #7
  8. On 22.11.2007 20:11, Peter Bunyan wrote:
    > OK, this seems to work:
    >
    > class String
    > def is_number?
    > Float(self) == self.to_f
    > rescue false
    > end
    > end


    That's an error prone approach because it relies on comparing floats
    (which is also superfluous here because the real work is done by Float
    and rescue). Why don't you just do

    def float?
    Float(self) rescue nil
    end

    Cheers

    robert
     
    Robert Klemme, Nov 22, 2007
    #8
  9. Stefano Crocco wrote:
    > Alle giovedì 22 novembre 2007...
    > In this case, you can either use Kernel#Float, which returns str.to_f
    > .. or try to craft a regexp which only matches strings containing
    > numbers.
    > For example, the (untested) regexp
    >
    > /[+-]?\d+(.\d+)?(e[+-]?\d+)?/


    Two small additions:
    a) the 'dot' should be literally a dot (else it matches any character)
    b) the boundaries to the whole expresssion are needed (else "ab23.35de"
    would be
    validated).

    So, the regexp should be something like:

    /^ [+-]? \d+ (?: [.]\d+)? (?: e[+-]? \d+)? $ /x

    (If capture of components is desired, parenthesis should enclose all
    components, and the ?: removed).

    Raul
    --
    Posted via http://www.ruby-forum.com/.
     
    Raul Parolari, Nov 23, 2007
    #9
  10. Lloyd Linklater, Nov 23, 2007
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jonck
    Replies:
    3
    Views:
    2,466
    Jonck
    Oct 25, 2004
  2. Kayle
    Replies:
    14
    Views:
    579
    MikeyD
    Sep 16, 2003
  3. Tomás Ó hÉilidhe

    OK to disguise a macro function as a function?

    Tomás Ó hÉilidhe, Feb 12, 2008, in forum: C Programming
    Replies:
    4
    Views:
    355
    Army1987
    Feb 13, 2008
  4. JJ

    Disguise URL of downloadable file

    JJ, Aug 23, 2004, in forum: ASP General
    Replies:
    3
    Views:
    226
    Stuart Palmer
    Aug 23, 2004
  5. Christopher Benson-Manica

    Checking whether a string is all digits

    Christopher Benson-Manica, Jun 6, 2005, in forum: Javascript
    Replies:
    14
    Views:
    179
    Lasse Reichstein Nielsen
    Jun 7, 2005
Loading...

Share This Page