0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】to_i メソッド便利すぎ。共有したい。

Posted at

はじめに

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?