🤍
[Rails]でto_iしたときに0にしたくない。Integer()したときに例外を起こしたくないときの対処法
概要
RailsでStringをIntegerにキャストしたいとき
[1] pry(main)> "".to_i
=> 0
to_i を使うと数字以外の文字が 0 になってしまい、
[2] pry(main)> Intege("")
ArgumentError: invalid value for Integer(): ""
Integer() を使うと例外が起きてしまう。
キャストする文字列が "0" が入らない前提であれば、 "".to_i して 0 だったら分岐するようなコードを書けば問題ないが、文字列 "0" に対応したい & もう少しスマートに扱いたいので、以下のようなメソッドを定義する。
Object#to_i_or_nil をモンキーパッチで定義する。
レシーバを Integer() でキャストできるときはキャストして、できないときは nil を返す
実装
# /lib/ext/object.rb
class Object
# @return [Integer, nil]
def to_i_or_nil
Integer(self)
rescue StandardError
nil
end
end
# config/initializers/extensions.rb
require 'ext/object'
使い方
[1] pry(main)> "".to_i_or_nil
=> nil
[2] pry(main)> "0".to_i_or_nil
=> 0
[3] pry(main)> "1".to_i_or_nil
=> 1
Discussion
わざわざこういう実装をしなくても、元から用意されているモジュール関数
Integer(n, exception: false)を使った方が素直でパフォーマンスも良いと思われます。