Rubyの数値チェックを完全ガイド!初心者でもわかるnumeric?判定とInteger()例外処理
生徒
「Rubyで入力された値が数値かどうか調べたいんですが、どうやれば判断できますか?」
先生
「入力内容が数字かどうかを確認する方法はいくつかあるよ。Rubyでは文字列をそのまま信じると危険だから、しっかりチェックする必要があるんだ。」
生徒
「数値のチェックってなんだか難しそうですね。初心者でも理解できますか?」
先生
「心配しなくても大丈夫。numeric? の自作や Integer() を使う方法など、日常の例も交えてわかりやすく説明していくよ。」
1. 数値チェックが必要な理由とは?
Rubyを使ってプログラムを作ると、ユーザーがキーボードから入力する場面がよく出てきます。例えば年齢、値段、数量などを入力してもらうとき、その入力が「本当に数字なのか」を確認しないといけません。たとえば「二十歳」「abc」「1O(オー)」のように数字ではない文字が混ざると、計算の処理がすべて壊れてしまいます。
このような「想定外の入力」を防ぐために入力検証(バリデーション)が必要になります。プログラミングではとても重要な作業で、エラーを減らし、安全に動作するプログラムを作る土台となります。
2. numeric? メソッドの仕組みを理解しよう
Rubyには直接 numeric? という標準メソッドはありません。しかし、多くの入門者が「文字列が数値かどうか判断したい」という場面に直面するため、自分で numeric? 的なメソッドを作るケースがあります。実際の現場でもこうした簡易チェックはよく使われます。
仕組みとしては、「文字列を数値に変換できるかどうか」で判断します。変換に成功すれば数値、失敗すれば数値ではないという考え方です。
def numeric?(str)
!!Float(str) rescue false
end
puts numeric?("123")
puts numeric?("3.14")
puts numeric?("abc")
true
true
false
上の例では Float(str) を使っています。もし変換できなければ例外(エラー)が発生しますが、そのエラーを rescue で受け止めて false を返しているという仕組みです。
3. Integer() を使ったより厳格な数値チェック
次に紹介する Integer() は、文字列を整数に変換するときによく使われる方法です。これは厳密な変換をするため、小数点を許可しない、空白を含むとエラーになるといった特徴があります。より正確なチェックをしたい場合に効果的です。
puts Integer("10") # 成功
puts Integer("3.14") # エラー
puts Integer("abc") # エラー
10
小数を受け付けないので、「整数だけ必要」という場面で強力な味方になります。例えば「年齢」「部屋番号」「在庫数量」などに向いています。
4. Integer() の例外処理で入力エラーを防ぐ
ユーザーが予想外の文字を入力すると、Integer() は例外を発生させてプログラムを止めてしまいます。そのため、例外処理(エラーを受け止めて正しく対処する仕組み)が必要です。これは、玄関のドアにストッパーを置いて勢いよく閉じないようにするイメージに近いです。
def to_integer(str)
Integer(str)
rescue ArgumentError
nil
end
puts to_integer("20")
puts to_integer("abc")
20
エラーが出る場面でも、プログラム全体が止まらず、正しく処理を続けられるため、安全で扱いやすい設計になります。
5. numeric? と Integer() の使い分け
numeric? と Integer() では目的が少し違います。どちらを使うかは、あなたが作りたいプログラムの性質によって決まってきます。
numeric? の特徴
- 整数・小数どちらも判定できる
- 柔軟に使えるが、小数を受け付けたくない場面には不向き
Integer() の特徴
- 整数のみを扱うため厳格
- 入力チェックがより正確
実際には、入力内容に応じてこれらを組み合わせて使うことが多いです。例えば商品注文アプリでは「数量は整数で numeric? は使わない」などの判断が必要になります。
6. 入力チェックを応用したサンプルコード
では、numeric? と Integer() を使った実践的な入力チェックの例を見てみましょう。次のコードでは「年齢を入力して、正しい値なら受け付ける」という動きを作っています。
print "年齢を入力してください: "
input = gets.chomp
if to_integer(input)
puts "入力された年齢は #{input} です"
else
puts "整数で入力してください"
end