web-dev-qa-db-ja.com

変数が整数かどうかを確認する

Rails 3またはRubyには、変数が整数かどうかをチェックする組み込みの方法がありますか?

例えば、

1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
128
AnApprentice

is_a?メソッドを使用できます

>> 1.is_a? Integer
=> true
>> "[email protected]".is_a? Integer
=> false
>>
253
mportiz08

オブジェクトがIntegerかどうかを知りたい場合または意味のある整数に変換できるもの"hello"のようなものを含まず、to_i0に変換します):

result = Integer(obj) rescue false
48
Alex D

文字列に正規表現を使用します。

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
29
Jacob Relkin

変数のタイプがわからない場合(数字の文字列である可能性があります)、それがparamsに渡されたクレジットカード番号だったため、元は文字列でしたが、それを確認したい場合tに文字が含まれている場合、このメソッドを使用します。

    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!
15
Edmund

var.is_a? Classがあります(あなたの場合:var.is_a? Integer);それは法案に合うかもしれません。または、Integer(var)があり、解析できない場合に例外をスローします。

5
Groxx

トリプルイコールを使用できます。

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

より「ダックタイピング」の方法は、__integer-likeまたは "string-like"クラスも使用できるこの方法でrespond_to?を使用することです

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

ゼロ値を変換する必要がない場合、メソッドto_iおよびto_fは、文字列をゼロ値(変換可能またはゼロでない場合)または実際のIntegerまたはFloat値に変換するため、非常に便利であることがわかります。

"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
2

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
1
Vadym Tyemirov

何かが文字列なのか、なんらかの数字なのかどうかを判断しようとする前に、私は同様の問題を抱えていました。正規表現を使用してみましたが、それは私のユースケースでは信頼できません。代わりに、変数のクラスをチェックして、それが数値クラスの子孫であるかどうかを確認できます。

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

この状況では、BigDecimal、Date :: Infinity、Integer、Fixnum、Float、Bignum、Rational、Complexのいずれかの数値の子孫を置き換えることもできます。

0
penguincoder