检查变量是否为整数


137

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

例如,

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


1
您应该检查变量是否响应,而不是关心变量是否为整数to_i。这是Ruby的“鸭子输入”的一部分:如果它可以像整数一样工作,则将其视为一个整数。
Tin Man'1

4
@锡人:不完全是。“ hello” .to_i返回0,这可能不是您期望的。
EinLama 2011年

1
@AnApprentice供您参考,kind_of?是的别名is_a?
Jacob Relkin 2011年

3
@JacobRelkin is_a?略有不同;它询问特定类的实例的对象是否;kind_of?询问它是特定类的实例还是子类。 fido.is_a? Dog是真的; fido.kind_of? Animal例如,这是真的。
汤姆·哈里森

Answers:


274

您可以使用is_a?方法

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

2
那太酷了。可以用来验证电子邮件地址吗?
AnApprentice,2011年

65
@AnApprentice何时开始验证电子邮件地址?
Jacob Relkin 2011年

4
如果数字以字符串形式出现,例如“ 11111111”
则将

看看下面。Integer(obj) rescue false 如果您要检查它是否可以转换,它将不适用于“ 1”
mc。

4
@Ricbermo“ 1111111”是一个字符串。恰好可以转换为和整数的字符串。
Sqeaky

50

如果您想知道一个对象是Integer 还是可以有意义地转换为Integer的对象(不包括"hello",这些对象to_i将转换为0):

result = Integer(obj) rescue false

2
也许我只是一个菜鸟,但是这种调整对我有帮助。结果= Integer(obj)抢救false。
约翰·库里

@JohnCurry,如果可以改善答案,请随时编辑。SO就是这样工作的。
Alex D

2
我做到了,被拒绝了。“此编辑偏离了帖子的初衷”,但是无论如何,谢谢您的回答,它帮助我解决了我的问题!
约翰·库里

7
由于字符串被解释为八进制,所以Integer('08')将失败,Integer('08',10)可以正常工作。以防万一。
Jong Bor Lee

1
不确定是否Integer(2.5) => 2总是有意义的转换。
mkataja '17

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

这正是我在寻找is_numeric的东西吗?
workdreamer

我认为这很接近,但并不完全正确。例如,它将以“ .34”失败。我认为问题在于,在\d+??指定了非贪婪匹配,而您可能想要一个可选匹配。更改\d+?\d*可能会修复它,但是为了确保可以通过一系列测试运行它。这也不会匹配十六进制或指数表示法,但是我敢肯定,这对于某些用例是可以的。
杰夫

1
为什么不只使用此正则表达式:\A\d+\z
NARKOZ 2012年

1
Integer(obj) rescue false下面@ alex-d中的代码进行比较;regexp难以阅读且意图不明确。两种工作,我都遇到了这个问题,试图修复结构不佳的正则表达式,但它并不总是有效:-)
Tom Harrison

17

如果不确定变量的类型(可能是一串数字字符),则说这是传递给参数的信用卡号,因此它最初是一个字符串,但您要确保它不会如果其中没有任何字母字符,我将使用此方法:

    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!

谢谢,您保存我的一天。对于需要检查它是否浮动的任何人,都可以直接更改为obj.to_s == obj.to_f.to_s我的情况。
ksugiarto 2014年

埃德蒙真聪明!🙌–
siwalikm

太棒了,我比Integer('123fh')更喜欢它,并且可以拯救异常。
zw963

6

您可以使用三重等于。

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

5

var.is_a? Class(你的情况:var.is_a? Integer); 可能符合要求。或者是Integer(var),如果无法解析它,它将在其中引发异常。


3

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

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

2

如果你不需要转换零个值,我找到方法to_i,并to_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整数值不是falsey,而是true(!!0 #=> true)(感谢@prettycoder)

编辑

啊,只是发现了黑暗的情况……似乎只有在数字位于第一位时才会发生

"12blah".to_i => 12

0是真实的红宝石!
prettycoder

1
@prettycoder感谢您的注意,我将在答案中立即解决此问题
Cyril Duchon-Doris,

1

要利用Alex 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

0

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

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

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


-1

可能您正在寻找这样的东西:

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

num = 2.0

如果num.is_a?字符串num =浮点(num)抢救错误结束

new_num =整数(num)抢救false

放数

放置new_num

把num == new_num

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.