检查变量是否为整数

时间:2011-01-04 01:36:25

标签: ruby ruby-on-rails-3

Rails 3或Ruby是否有内置方法来检查变量是否为整数?

例如,

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?

11 个答案:

答案 0 :(得分:252)

您可以使用is_a?方法

>> 1.is_a? Integer
=> true
>> "dadadad@asdasd.net".is_a? Integer
=> false
>>

答案 1 :(得分:48)

如果你想知道某个对象是Integer 还是可以有意义地转换为整数的东西(不包括"hello"之类的东西,{{1将转换为to_i):

0

答案 2 :(得分:29)

在字符串上使用正则表达式:

def is_numeric?(obj) 
   obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end

如果您想检查变量是否属于某种类型,您只需使用kind_of?

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false

答案 3 :(得分:15)

如果您不确定变量的类型(它可能是一串数字字符),请说它是一个传递给参数的信用卡号,所以它最初是一个字符串,但你想确定它没有任何字母字符,我会使用这种方法:

    def is_number?(obj)
        obj.to_s == obj.to_i.to_s
    end

    is_number? "123fh" # false
    is_number? "12345" # true

@Benny指出对这种方法的疏忽,记住这一点:

is_number? "01" # false. oops!

答案 4 :(得分:5)

var.is_a? Class(在您的情况下:var.is_a? Integer);这可能符合法案。或者有Integer(var),如果无法解析它,它将抛出异常。

答案 5 :(得分:4)

您可以使用三等号。

if Integer === 21 
    puts "21 is Integer"
end

答案 6 :(得分:3)

更“鸭子打字”的方式是使用respond_to?这种方式“类似整数”或“字符串式”类也可以使用

if(s.respond_to?(:match) && s.match(".com")){
  puts "It's a .com"
else
  puts "It's not"
end

答案 7 :(得分:2)

如果您不需要转换零值,我发现方法to_ito_f非常有用,因为它们会将字符串转换为零值(如果不是可转换或零)或实际IntegerFloat值。

"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0

"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => "I'm not a float or the 0.0 float"

EDIT2:小心,0整数值不是假的,它的真实性(!!0 #=> true)(感谢@prettycoder)

修改

啊刚发现黑暗的情况......似乎只有在数字位于第一位置时才会发生

"12blah".to_i => 12

答案 8 :(得分:1)

使用the answer of Alex D

来利用refinements
module CoreExtensions
  module Integerable
    refine String do
      def integer?
        Integer(self)
      rescue ArgumentError
        false
      else
        true
      end
    end
  end
end

后来,在你上课:

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end

答案 9 :(得分:0)

在尝试确定某些内容是字符串还是任何类型的数字之前,我遇到了类似的问题。我尝试过使用正则表达式,但这对我的用例来说并不可靠。相反,您可以检查变量的类以查看它是否是Numeric类的后代。

if column.class < Numeric
  number_to_currency(column)
else
  column.html_safe
end

在这种情况下,您还可以替换任何数字后代:BigDecimal,Date :: Infinity,Integer,Fixnum,Float,Bignum,Rational,Complex

答案 10 :(得分:0)

基本上,一个整数 n 是 3 的幂,如果存在一个整数 x 使得 n == 3x。 >

所以要验证你可以使用这个函数

def is_power_of_three(n)
  return false unless n.positive?

  n == 3**(Math.log10(n)/Math.log10(3)).to_f.round(2)
end