Strict conversion of strings to ints?

Is there an easy way to parse a string to an integer that will throw an error of some sort if the string is not actually a properly formatted integer? "to_i" of course is very non-strict, which is no good for what I want, and I'd prefer not to write my own when it seems likely that there would be some way to do this already...

Thanks,
Ken

ArgumentError: invalid value for Integer: "junk"
         from (irb):1:in `Integer'
         from (irb):1

Hope that helps.

James Edward Gray II

···

On Aug 25, 2007, at 10:19 PM, Kenneth McDonald wrote:

Is there an easy way to parse a string to an integer that will throw an error of some sort if the string is not actually a properly formatted integer? "to_i" of course is very non-strict, which is no good for what I want, and I'd prefer not to write my own when it seems likely that there would be some way to do this already...

>> Integer("junk")

The real problem is:

irb(main):002:0> "12,345".to_i
=> 12

Basically, Ruby converts anything that starts with an int, which is really quite nasty in a case such as the above. I spent a lot of time tracking down that problem.

So, I want an integer conversion function that throws an error if the _entire_ string can't be interpreted as an integer; the Ruby analog to the standard string-to-int conversion function in most other languages.

Thanks,
Ken

James Edward Gray II wrote:

···

On Aug 25, 2007, at 10:19 PM, Kenneth McDonald wrote:

Is there an easy way to parse a string to an integer that will throw an error of some sort if the string is not actually a properly formatted integer? "to_i" of course is very non-strict, which is no good for what I want, and I'd prefer not to write my own when it seems likely that there would be some way to do this already...

>> Integer("junk")
ArgumentError: invalid value for Integer: "junk"
        from (irb):1:in `Integer'
        from (irb):1

Hope that helps.

James Edward Gray II

raise "Bad integer" unless i_str =~ /\A-?\d+\z/

James Edward Gray II

···

On Aug 26, 2007, at 3:26 PM, Kenneth McDonald wrote:

The real problem is:

irb(main):002:0> "12,345".to_i
=> 12

Basically, Ruby converts anything that starts with an int, which is really quite nasty in a case such as the above. I spent a lot of time tracking down that problem.

So, I want an integer conversion function that throws an error if the _entire_ string can't be interpreted as an integer; the Ruby analog to the standard string-to-int conversion function in most other languages.

Kenneth McDonald wrote:

James Edward Gray II wrote:
> >> Integer("junk")
>
> ArgumentError: invalid value for Integer: "junk"

So, I want an integer conversion function that throws an error if the
_entire_ string can't be interpreted as an integer; the Ruby analog to
the standard string-to-int conversion function in most other languages.

Ehrm,

Integer("12,345")

ArgumentError: invalid value for Integer: "12,345"

That's exactly what you wanted, right? So what's the problem?

···

--
NP: Anathema - The Sweet Suffering
Jabber: sepp2k@jabber.org
ICQ: 205544826

What about

   int = Integer(i_str)

?

It accepts leading whitespace, but apart from that it's pretty picky.

Mike

···

On 26-Aug-07, at 4:32 PM, James Edward Gray II wrote:

On Aug 26, 2007, at 3:26 PM, Kenneth McDonald wrote:

The real problem is:

irb(main):002:0> "12,345".to_i
=> 12

Basically, Ruby converts anything that starts with an int, which is really quite nasty in a case such as the above. I spent a lot of time tracking down that problem.

So, I want an integer conversion function that throws an error if the _entire_ string can't be interpreted as an integer; the Ruby analog to the standard string-to-int conversion function in most other languages.

raise "Bad integer" unless i_str =~ /\A-?\d+\z/

--

Mike Stok <mike@stok.ca>
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.

James Edward Gray II wrote:

raise "Bad integer" unless i_str =~ /\A-?\d+\z/

Depending on your needs (do you want to accept all the strings that ruby accepts as integers?), you might want to add _ to that regex (also, preceding '+' char):

irb(main):001:0> i_str = "12_345"
=> "12_345"
irb(main):002:0> raise "Bad integer" unless i_str =~ /\A-?\d+\z/
RuntimeError: Bad integer
         from (irb):2
irb(main):003:0> Integer(i_str)
=> 12345

But getting that right is harder than just using Integer().

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Mike Stok wrote:

The real problem is:

irb(main):002:0> "12,345".to_i
=> 12

Basically, Ruby converts anything that starts with an int, which is really quite nasty in a case such as the above. I spent a lot of time tracking down that problem.

So, I want an integer conversion function that throws an error if the _entire_ string can't be interpreted as an integer; the Ruby analog to the standard string-to-int conversion function in most other languages.

raise "Bad integer" unless i_str =~ /\A-?\d+\z/

What about

  int = Integer(i_str)

?

It accepts leading whitespace, but apart from that it's pretty picky.

Mike

This is what I was looking for. There's nothing wrong with the regexp solution of course, it's just that Simpler is Nicer :-). Many thanks to both of you.

Cheers,
Ken

···

On 26-Aug-07, at 4:32 PM, James Edward Gray II wrote:

On Aug 26, 2007, at 3:26 PM, Kenneth McDonald wrote:

--
Mike Stok <mike@stok.ca>
Mike Stok

The "`Stok' disclaimers" apply.