Strict conversion of strings to ints?

K

Kenneth McDonald

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
 
J

James Edward Gray II

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...
ArgumentError: invalid value for Integer: "junk"
from (irb):1:in `Integer'
from (irb):1

Hope that helps.

James Edward Gray II
 
K

Kenneth McDonald

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
 
J

James Edward Gray II

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/

James Edward Gray II
 
S

Sebastian Hungerecker

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,
ArgumentError: invalid value for Integer: "12,345"

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

Joel VanderWerf

James said:
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().
 
K

Kenneth McDonald

Mike said:
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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,680
Members
48,796
Latest member
Greg L.

Latest Threads

Top