Question

I googled that there is an is_a? function to check whether an object is an integer or not.

But I tried in rails console, and it doesn't work.

I ran the code like the following:

 "1".is_a?
 1.is_a?

Did I miss something?

Was it helpful?

Solution

There's not a built in function to say if a string is effectively an integer, but you can easily make your own:

class String
  def int
    Integer(self) rescue nil
  end
end

This works because the Kernel method Integer() throws an error if the string can't be converted to an integer, and the inline rescue nil turns that error into a nil.

Integer("1") -> 1
Integer("1x") -> nil
Integer("x") -> nil

and thus:

"1".int -> 1 (which in boolean terms is `true`)
"1x".int -> nil
"x".int -> nil

You could alter the function to return true in the true cases, instead of the integer itself, but if you're testing the string to see if it's an integer, chances are you want to use that integer for something! I very commonly do stuff like this:

if i = str.int
  # do stuff with the integer i
else
  # error handling for non-integer strings
end

Although if the assignment in a test position offends you, you can always do it like this:

i = str.int
if i
  # do stuff with the integer i
else
  # error handling for non-integer strings
end

Either way, this method only does the conversion once, which if you have to do a lot of these, may be a significant speed advantage.

[Changed function name from int? to int to avoid implying it should return just true/false.]

OTHER TIPS

You forgot to include the class you were testing against:

"1".is_a?(Integer) # false
1.is_a?(Integer) # true

i used a regular expression

if a =~ /\d+/
   puts "y"
else
   p 'w'
end

Ruby has a function called respond_to? that can be used to seeing if a particular class or object has a method with a certain name. The syntax is something like

User.respond_to?('name') # returns true is method name exists
otherwise false

http://www.prateekdayal.net/2007/10/16/rubys-responds_to-for-checking-if-a-method-exists/

Maybe this will help you

str = "1"
=> "1"
num = str.to_i
=> 1
num.is_a?(Integer)
=> true

str1 = 'Hello'
=> "Hello"
num1 = str1.to_i
=> 0
num1.is_a?(Integer)
=> true

I wanted something similar, but none of these did it for me, but this one does - use "class":

a = 11
a.class
=> Fixnum
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top