1
0

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 1 year has passed since last update.

to_iの挙動を確認する

Last updated at Posted at 2022-10-18

環境

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
1
0
2

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?