I'd suggest another way of doing it. Also, because you asked "positive" integer, I made two separate methods for positive integer and non-negative integer.
class String
def numeric?
!self.match(/[^0-9]/)
end
def positive_integer?
self.to_i > 0
end
def nonnegative_integer?
self.to_i > 0 or self == '0'
end
end
Here's the benchmark code:
require 'benchmark'
include Benchmark
bmbm(100) do |x|
x.report('numeric?') do
"some invalid string".numeric?
end
x.report('positive_integer?') do
"some invalid string".positive_integer?
end
x.report('nonnegative_integer?') do
"some invalid string".nonnegative_integer?
end
end
Result:
numeric?
0.000000 0.000000 0.000000 ( 0.000045)
positive_integer?
0.000000 0.000000 0.000000 ( 0.000012)
nonnegative_integer?
0.000000 0.000000 0.000000 ( 0.000015)
It seems like positive_integer?
and nonnegative_integer?
are faster in this micro-benchmark.
Finally, as a side note, you can define integer?
method in a similar fashion:
class String
def integer?
self.to_i.to_s == self
end
end