はじめに
Rubyエンジニアであれば一度は使ったことがあるであろうto_i
メソッドが想像以上に便利だったので共有します。
to_i メソッドって?
レシーバーの型によりますが、ざっくり整数を返してくれるものです(公式リファレンス)。
# レシーバーがString
# 文字列を 10 進数表現された整数であると解釈して、整数に変換します。
"1000".to_i
=> 1000
# レシーバーがFloat
# 小数点以下を切り捨てて値を整数に変換します。
1000.5.to_i
=> 1000
# レシーバーがInteger
# self を返します。
1000.to_i
=> 1000
# レシーバーがTime
# 起算時からの経過秒数を整数で返します。
Time.local(2021,1,1).to_i
=> 1609426800
ざっと基本的な使い方でした。ここから便利な点を挙げていきます。
空文字でもへっちゃら
空文字の場合は0
を返します。
中身があるかないかを気にしなくていいので、地味ですがストレスフリーです。
"".to_i
=> 0
変な文字列でもへっちゃら
数値に変換できない文字列に対しても0
を返します。
そのため、"00001"
のような0埋めの文字列コードに対する簡易的なチェックができます。
"hogehoge".to_i
=> 0
"00001".to_i
=> 1
# (例)数値変換できるかで簡易的なチェックを行いたい
def check_code(code)
if code.to_i != 0
p "ok"
else
p "invalid"
end
end
check_code("010000")
=> "ok"
check_code("hogehoge_dayo")
=> "invalid"
注意
公式リファレンスにあるように、整数とみなせない文字があればそこまでを変換対象とする
ため、10hogehoge
のようなものは数値変換されてしまいます。あくまで簡易的なチェックですね。
"10hogehoge".to_i
=> 10
nilでもへっちゃら
nilの場合は0を返します。これがすごいうれしい。
例えばレシーバーがnil
になるかもしれないときでも、to_i
メソッドで回避できちゃいます。
# (例) hours = minutes / 60
# minutesに数値が入ってればもちろん問題ない
minutes = 60
hours = minutes / 60
=> 1
# minutesがnilだとエラー出る
minutes = nil
hours = minutes / 60
=> NoMethodError: undefined method `/' for nil:NilClass
# ここで to_i メソッドの登場。有能すぎ。
minutes = nil
hours = minutes.to_i / 60
=> 0
nilクラスに対するNoMethodError
を回避するだけなら&.
でいけますが、数値計算させたいとなるとnilでは困るので0に変換してくれるのは使ってみるとすごい助かります。
おわりに
簡単にはなりますがto_i
メソッドを共有しました。
個人的には最後に紹介した数値計算との相性がすごい良くて感動しました。
ありがとう.to_i => 0