【初心者向け】Rubyプログラミングで変数を数値判定する方法

プログラム

プログラミング進めていると、色んなデータを扱います。
例えば、ユーザの個人情報を扱う場合には、住所や電話番号、生年月日など、です。
ユーザがこのような情報を入力した際に、電話番号であれば、数値データじゃないといけません。

このようにユーザの入力に対して、自分の思い通りに動かしたいときに、違うデータ型が入ってくると困ります。
その時には、違うデータ型が入ってきた時の処理を書かなくてはなりません。
今回は、Rubyプログラミングで変数を数値判定する方法を紹介していきます。

integer?関数

まずは、integer?メソッドです。
integerメソッドを説明する前に、数値のデータ型について説明します。
Rubyでは、Numeric、Integer、Floatという数値のデータ型を持っています。
Integer型は整数Floatは浮動小数点数Numericはこの両方を含むデータ型を表します。

integer?関数は、数値データがInteger型かどうかを判定することができます。
因みにfloat?関数というのは無く、integer?関数で数値データがInteger型かそうでないか(Float型)を判定します。
Rubyに元々備わっている組み込み関数でそのまま自分のコードに使用できます。
使い方は以下の通りです。

変数.integer?

それでは、以下のコードを書いて確認してみましょう。

number.rb
value1 = 10
print value1.integer?
value2 = 1.0
print value2.integer?

実行してみましょう。

$ruby number.rb
true
false

value1の整数値には”true”と表示され、value2の浮動小数点数には”false”と判定されました。
今度は、valueに文字列を代入して、integer?メソッドで判定してみましょう。

string.rb
value = 'test'
print value.integer?

実行してみましょう。

$ruby string.rb
Traceback (most recent call last):
string.rb:2:in `main': undefined method `integer?' for "test":String (NoMethodError)
Did you mean?  intern

エラーが出てしまいました。
これは、.integer?メソッドが数値の変数にしか使えないからです。
したがって、この方法は変数が数値であることを前提として、整数値かどうかを判定する関数になります。

これは数値のデータ型(Numeric)が、整数値であるかどうかの2択でしか判定できませんし、数値でない時はエラーを出してしまいます。
ですので、より正確に変数を判定するには、他の方法が適切です。

is_a?関数

続いて、is_a?メソッドを紹介します。
これは先程のinteger?型とは対照的に、様々なデータ型に対応しています。
使い方は以下の通りです。

変数.is_a?(データ型)

先程、数値データのNumeric型は、Integer型とFloat型の2つに分類できると説明しました。
それでは、これらのデータ型とis_a?関数を活用して数値判定してみましょう。

is_a.rb
value1 = 10
puts "value1 = 10"
print "Numeric?: ",value1.is_a?(Numeric)
print "\nInteger?: ",value1.is_a?(Integer)
print "\nFloat?: ",value1.is_a?(Float)
print "\nString?: ", value1.is_a?(String)

value2 = 1.0
puts "\n\nvalue2 = 1.0"
print "Numeric?: ",value2.is_a?(Numeric)
print "\nInteger?: ",value2.is_a?(Integer)
print "\nFloat?: ",value2.is_a?(Float)
print "\nString?: ", value2.is_a?(String)

value3 = 'test'
puts "\n\nvalue3 = 'test'"
print "Numeric?: ",value3.is_a?(Numeric)
print "\nInteger?: ",value3.is_a?(Integer)
print "\nFloat?: ",value3.is_a?(Float)
print "\nString?: ", value3.is_a?(String)

実行してみましょう。

$ruby is_a.rb
value1 = 10
Numeric?: true
Integer?: true
Float?: false
String?: false

value2 = 1.0
Numeric?: true
Integer?: false
Float?: true
String?: false

value3 = 'test'
Numeric?: false
Integer?: false
Float?: false
String?: true

先程のinteger?関数と違い、String型に数値判定を実行してもエラーになりません。
また、is_a?の関数の引数に、判定したいデータ型を選べるので、1つの変数に対して多岐の判定ができる点もメリットです。
is_a?の関数は、汎用的にデータ型を判定できる方法と言えます。

正規表現

最後に、正規表現で数値判定する方法を紹介します。
初めて正規表現を見ると、複雑な表記で戸惑ってしまうかもしれませんが、1つずつ確認していきましょう。
まずは、以下のコードを書いてみましょう。

regexp.rb
value1 = 10
puts 'value1 = 10'
puts !! (value1.to_s =~ /^[+-]?[0-9]*[\.]?[0-9]+$/)
value2 = 1.0
puts "\nvalue2 = 1.0"
puts !! (value2.to_s =~ /^[+-]?[0-9]*[\.]?[0-9]+$/)
value3 = 'test'
puts "\nvalue3 = 'test'"
puts !! (value3.to_s =~ /^[+-]?[0-9]*[\.]?[0-9]+$/)

それでは、実行してみましょう。

$ruby regexp.rb
value1 = 10
true

value2 = 1.0
true

value3 = 'test'
false

正規表現が、”/^[+-]?[0-9]*[\.]?[0-9]+$/”という形で表されています。
“/”(スラッシュ)で挟まれた箇所が正規表現を表します。
“^”(キャレット)は、正規表現の開始、”$”(ドルマーク)は、正規表現の終了を表します。
“[0-9]”は、0から9までの数字を表します。
“[+-]”は、正の数か負の数かを表します。
“[\.]”(バックスラッシュとドット)は、小数点を表します。
“?”(クエスション)は、その前の文字列があるかないかを表します。
“*”(アスタリスク)は、任意の0文字以上の文字列を表します。
最後に、”+”(プラスマーク)は、1回以上繰り返す、を表します。

どうでしょうか?”/^[+-]?[0-9]*[\.]?[0-9]+$/”という暗号のような表記もなんとなく理解できませんか?
この正規表現とは、他のプログラミング言語でも使うことができます。
詳しく知りたい方は以下のサイトを見てみて下さいね。
サルにもわかる正規表現入門

このように、正規表現を使った数値判定の方法は柔軟性が高いです。
例えば、”[0-5]”という表現にすれば、整数で且つ5以下の数値を判定できます。
正規表現は一見複雑ですが、使いこなすとあらゆる文字や数字を判定できますので、必見です。

まとめ

今回はRubyで変数が数値かどうか判定する方法を3つ紹介しました。
・integer?関数
・is_a?関数
・正規表現

非常に簡単に判定できるものから、高度で柔軟性の高いものまで、色々な方法があります。
また、デバッグする中で変数のデータ型を知りたい時は、.class関数が有効です。

変数.class

それぞれRubyを活かした方法ばかりですので、是非自分のコードに組み込んで試してみて下さいね。