変数が整数かどうかの確認


137

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

例えば、

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


1
変数が整数かどうかを気にするのではなく、変数がに応答するかどうかを確認する必要がありますto_i。これはRubyの「ダックタイピング」の一部です。整数のように動作できる場合は、整数のように扱います。
ティンマン

4
@The Tin Man:完全にではありません。"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たとえば、trueです。
トムハリソン

回答:


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」のような文字列である場合、これは機能しません
Ricbermo

下を見Integer(obj) rescue false てください

4
@Ricbermo "1111111"は文字列です。たまたま整数に変換可能な文字列。
Sqeaky 2014

50

あなたは、オブジェクトがあるかどうかを知りたい場合Integer や意味の整数に変換することができるもの(のようなものを含まない"hello"to_iに変換されます0):

result = Integer(obj) rescue false

2
多分私は初心者ですが、この微調整は私を助けたでしょう。結果= Integer(obj)レスキューfalse。
ジョンカリー、

@JohnCurry、それを改善できる場合は、回答を自由に編集してください。それがSOの仕組みです。
Alex D

2
拒否されました。「この編集は投稿の本来の目的から逸脱しています」しかし、とにかく、あなたの答えをありがとう、それは私の問題を解決するのに役立ちました!
John Curry

7
文字列が8進数として解釈されるため、Integer('08 ')は失敗します。Integer('08'、10)は正常に機能します。念のため。
Jong Bor Lee

1
Integer(2.5) => 2が常に意味のある変換かどうかはわかりません。
mkataja 2017

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」では失敗します。問題は、私が思うに、であることをあなたはおそらくオプションの試合をしたいのに対し、指定非欲張りマッチ。に変更すると修正される可能性がありますが、念のために一連のテストを実行したいと思います。これも16進表記や指数表記とは一致しませんが、特定のユースケースでは問題ないと確信しています。\d+??\d+?\d*
ジェフ

1
なぜこの正規表現を使用しないの\A\d+\zですか?
NARKOZ、2012年

1
Integer(obj) rescue false以下の@ alex-dのコードと比較してください。正規表現は読みにくく、その意図が明確ではありません。どちらも機能しましたが、常に機能していなかった不完全に構成された正規表現を修正しようとしてこの質問に行きました:-)
Tom Harrison

17

変数のタイプ(数字の文字列である可能性があります)がわからない場合は、それが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!

ありがとう、あなたは私の日を救います。フロートしているかどうかを確認する必要がある人obj.to_s == obj.to_f.to_sは、私の場合と同じように直接変更できます。
ksugiarto 2014年

賢いエドマンド!🙌
siwalikm

すごい、私はInteger( '123fh')とレスキュー例外よりもこれを好みます。
zw963 2018

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_ito_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

ルビーでは0は真実です!
prettycoder、

1
@prettycoderに感謝します。回答ですぐに修正します
Cyril Duchon-Doris

1

活用するために、アレックス・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"を拒否します

数値= 2.0

if num.is_a?文字列num = Float(num)レスキューfalse end

new_num = Integer(num)レスキューfalse

numを置く

new_numを置く

puts num == new_num

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.