環境
Ruby2.6
はじめに
to_iは文字列を数値型(Integer)に変換するメソッドです。to_iの変数にイレギュラーな値がセットされた場合、どのような挙動を示すのか、動作確認してみました。
動作確認
- 元々数値である変数にto_iしても、元の木阿弥です。
- プラマイ符号がある場合は、プラマイ符号が取れます。
- float型の文字列に対してto_iした場合は、小数点以下が取れます。
test.rb
puts "123".to_i # => 123
puts 123.to_i # => 123
puts "-123".to_i # => -123
puts "-0".to_i # => 0
puts "+123".to_i # => 123
puts "123.0".to_i # => 123
puts "123.9".to_i # => 123
puts "0.5".to_i # => 0
- このような変数は0に変換されます。例外に飛ばされることはありません。
test.rb
puts "aaa".to_i # => 0
puts "".to_i # => 0
puts ''.to_i # => 0
puts nil.to_i # => 0
- このようなヘマはあまり考えられないとは思いますが、配列やハッシュに対してto_iをしてしまった場合は、エラーになります。例外処理を設定している場合は例外に飛びます。
test.rb
puts [1,2].to_i # => undefined method `to_i' for [1, 2]:Array (NoMethodError)
puts [].to_i # => undefined method `to_i' for []:Array (NoMethodError)
puts {"うどん" => "300円"}.to_i # => syntax error
- 数値とアルファベットが混在した文字列に対してto_iをした場合、文字列の先頭が数字であれば、先頭の数字の分だけが変換されます。いっそのこと、0を返してくれてもよさそうな気がしますが、なぜかこのような仕様になっています。
test.rb
puts "123aa".to_i # => 123
puts "123aa11".to_i # => 123
puts "1a2a3".to_i # => 1
puts "aaa3".to_i # => 0
- 数値の前後にブランクが含まれる場合も、先頭の数字の分だけが変換されます。中途半端な仕様のような印象ではありますが、このような仕様になっているようです。
test.rb
puts " 1".to_i # => 1
puts "1 ".to_i # => 1
puts " 8 2 ".to_i # => 8
- アンダーバーは区切り文字として使えるため、数値の真ん中にアンダーバーがある場合でも変換してくれます。中途半端な個所にアンダーバーがあったとしても問題ありません。
- 金額で使われるカンマは区切り文字として認識されません。単なる文字列が紛れ込んでいると認識されてしまいます。金額を計算する場合は、カンマを省いてやる必要があります。Rubyには金額を扱う型(VBでいうCurrency型)というのは存在していません。
test.rb
puts "123_123".to_i # => 123123
puts "1231_23".to_i # => 123123
puts "123,123".to_i # => 123