Rubyで文字列を整数にするときはto_iメソッドを使用します。また、数値を文字列にするときはto_sメソッドを使います。
この記事では、「toi」や「tos」メソッドを使用して文字列→数値、数値→文字列に変換する方法やそれ以外の変換メソッドについても解説していきます。
「to_i」メソッドの使い方
「toi」メソッドは文字列を整数に変換する時に使用します。使い方ら次のように変換するオブジェクトに対して「toi」メソッドを呼び出します。
オブジェクト.to_i
では、文字列を「to_i」メソッドを使って整数に変換するサンプルコードを作ってみましょう。
str = "1000"
p str.to_i
実行結果
------------
1000
文字列の「1000」が整数に変換されています。
これでは、実行結果が本当に整数型の値かが分かりにくいため、変換前のオブジェクトと「to_i」で変換した値のデータ型を表示して、文字列型→整数型への変換が行われているか確認してみましょう
str = "1000"
toi = str.to_i
puts "strの型=" + str.class.name
puts "toiの型=" + toi.class.name
実行結果
------------
strの型=String
toiの型=Integer
元の変数のデータ型が「String」で表示されているのに対し、「to_i」で取得したオブジェクトは数値型である「Integer」となっています。
数値に変換できない文字でもエラーにならない
数値以外の文字列を「to_i」に指定した時にはエラーにはならず、戻り値が 「0」になることに注意が必要です。
#数値以外の文字列を設定して to_iを呼び出す
str = "ABCDEFG"
p str.to_i
実行結果
------------
0
値が存在しないことを表す「nil」でさえも「to_i」メソッドを読んでもエラーにならず、結果に「0」が返されます。
#nilに対して to_iメソッドを呼び出す
p nil.to_i
実行結果
------------
0
また、数値以外の文字が混在する文字列に対して「to_i」メソッドを呼ぶと、先頭から数値の部分だけを変換し、数字以外の文字列が見つかった時点で評価を中断します。
つまり「1000ABC200」のような文字列に対し「to_i」メソッドを呼び出すと、結果が「1000」となります。
str = "1000ABC200"
p str.to_i
実行結果
------------
1000
「to_i」は小数点以下は切り捨てられる
「to_i」メソッドに小数点を含む文字列を指定した場合も、前述の通り.(ピリオド)が数値以外として判定され、結果的に小数点以下の数値が切り捨てられた形で整数型の値に変換されます。
#小数点を含む文字列を to_iで変換
str = "1234.567"
p str.to_i
実行結果
------------
1234
「toi」メソッドは文字列を整数(Integer)へ変換するメソッドであるため、小数点を含む文字列の変換を行う場合は「tof」メソッドを使用します。
「to_s」メソッドの使い方
「to_s」メソッドは、数値やクラスオブジェクトなどの文字列型のオブジェクトを文字列に変換するメソッドです。数値を文字列にしたり、クラスオブジェクトの文字列表現をえたりするときに使用します。
使用方法は「toi」メソッドと同じく、文字列にしたいオブジェクトに対して「tos」メソッドを呼び出します。
実際に数値を「to_s」メソッドを使って文字列に変換するサンプルコードを作ってみましょう。
i = 10000
p i.to_s
実行結果
------------
"1000"
実行結果の値が、ダブルクォーテーションで囲まれていることから、文字列が数値に変換されているのが分かります。
数値型以外で「to_s」メソッドを使う
「tos」メソッドは数値型以外のほとんどの型に用意されているため、日付や配列、その他クラスオブジェクトの文字列表現を「tos」メソッドで取得できます。
i = 10000
p i.to_s
nilエラー回避で「to_s」メソッドを使う
値がないことを表す「nil」に対しても「tos」メソッドを呼ぶことが可能です。「nil」の変数に対し「tos」を呼び出すと次のような結果になります。
ruby
#nilを変数にセットして to_sをコール
val = nil
p val.to_s
実行結果
------------
""
このように、通常「nil」になっているオブジェクトに対するメソッドを呼び出しは「」エラーが発生しますが、「to_s」メソッドに関しては呼び出してもエラーにはならず、ブランク文字が返却されます。
これを利用することで、次のように「downcase」メソッドで変数の中の文字を大文字に変換する前に「to_s」を呼び出すことでエラーを回避し、統一的に処理を行えます。
# nilの値の場合
str = nil
p str.to_s.downcase
str = "RUBY"
p str.to_s.downcase
実行結果
------------
""
"ruby"
他にもある変換系メソッド
to_r
Rubyには有理数をあらわすRationalクラスが用意されています。有理数とは 2つの数を用いて a/b という形で分数で表せる数のことを言います。
有理数のオブジェクトは次のようにして作ります。
p Rational(1, 2) #=> (1/2)
p Rational("0.5") #=> (1/2)
この有理数は「to_r」メソッドを使用すると、文字列や数値などから有理数に変換をすることがでます。
p 40.to_r
p 42.0.to_r
p ' 2 '.to_r
p '1/3'.to_r
実行結果
------------
(40/1)
(42/1)
(2/1)
(1/3)
to_a
「toaメソッド」は一言で言えば、レシーバーの配列を返すメソッドです。レシーバーには配列やハッシュ、範囲オブジェクトなどが指定でき、配列を指定した場合は、レシーバーの配列自身が「toa」の戻り値になります。
・配列を指定した場合
array = [1, 2 ]
p range.to_a
・範囲オブジェクトの場合
#数値の範囲
range = 1..10
p range.to_a
#文字の範囲
("a".."z").to_a
=> ["a", "b"
ハッシュの場合
h = {name: "potepan", age: 27}
h.to_a
=> [[:name, "potepan"], [:age, 27]]
さいごに
Rubyの「toi」や「tos」などの変関係メソッドの使い方について紹介してきました。特に文字列→数値、数値→文字列の変換は、実際の開発現場でもよく使われますので、是非マスターしておきましょう。
上記のように数値と文字が混在する値に対し、「toi」メソッドを使用すると意図しない結果となることがあるため注意が必要です。よくある問題として、3桁ごとにカンマを挿入した「100,000,000」のような文字列に対し「toi」を使用すると、先頭から数字を探していき、カンマを見つけた時点で評価を終了するため、結果が「100」となります。
事前にスペースを取り除く対処などを行うようにしましょう。