检查变量是否为整数

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

比如说,

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?
216631 次浏览

对字符串使用正则表达式:

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

var.is_a? Class(在您的例子中是 var.is_a? Integer) ; 这可能符合要求。或者是 Integer(var),如果它不能解析它,它会抛出一个异常。

可以使用 is_a?方法

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

一种更“鸭式输入”的方法是使用 respond_to?,这样也可以使用“类整数”或“类字符串”类

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

如果你不确定变量的类型(它可能是一个数字字符串) ,假设它是一个信用卡号码传递到参数,所以它最初是一个字符串,但是你想确保它没有任何字母字符在里面,我会使用这个方法:

    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!

如果你想知道一个对象是否是 Integer 或者可以有意义地转换成整数的东西(不包括像 "hello"这样的东西,to_i会转换成 0) :

result = Integer(obj) rescue false

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

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

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

你可以用三重相等。

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

利用 亚历克斯 · D 的答案,使用 优化措施:

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

如果您不需要转换零值,我发现 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"

编辑2: 小心,0整数值不是假的,而是真的(!!0 #=> true)(多谢@pretycoder)

剪辑

啊,刚刚发现的黑箱... 似乎只有发生,如果数字是在第一位

"12blah".to_i => 12

也许您正在寻找这样的东西:

接受“2.0或2.0作为 INT,但拒绝2.1和“2.1”

Num = 2.0

如果 num.is _ a

New _ num = Integer (num) save false

把 Num

将 new _ num

将 num = = new _ num

基本上,一个整数 N是三的幂,如果存在一个整数 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