Rails 3またはRubyには、変数が整数かどうかをチェックする組み込みの方法がありますか?
例えば、
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
is_a?
メソッドを使用できます
>> 1.is_a? Integer
=> true
>> "[email protected]".is_a? Integer
=> false
>>
オブジェクトがInteger
かどうかを知りたい場合または意味のある整数に変換できるもの("hello"
のようなものを含まず、to_i
は0
に変換します):
result = Integer(obj) rescue false
文字列に正規表現を使用します。
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
変数のタイプがわからない場合(数字の文字列である可能性があります)、それが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!
var.is_a? Class
があります(あなたの場合:var.is_a? Integer
);それは法案に合うかもしれません。または、Integer(var)
があり、解析できない場合に例外をスローします。
トリプルイコールを使用できます。
if Integer === 21
puts "21 is Integer"
end
より「ダックタイピング」の方法は、__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
ゼロ値を変換する必要がない場合、メソッド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
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
何かが文字列なのか、なんらかの数字なのかどうかを判断しようとする前に、私は同様の問題を抱えていました。正規表現を使用してみましたが、それは私のユースケースでは信頼できません。代わりに、変数のクラスをチェックして、それが数値クラスの子孫であるかどうかを確認できます。
if column.class < Numeric
number_to_currency(column)
else
column.html_safe
end
この状況では、BigDecimal、Date :: Infinity、Integer、Fixnum、Float、Bignum、Rational、Complexのいずれかの数値の子孫を置き換えることもできます。