【初心者向け】Rubyプログラミングで変数を数値に変換する方法
プログラミングの中で、変数自体は文字列なんだけど中身は数値になっている、みたいなことがよくあります。
例えば、”12345″みたいな形式ですね。
内容は12345の数値ですが、”(ダブルクォーテーション)で囲まれているので、データ型としては文字列となります。
でも、こうした変数をデータベースに保存する時や、他の数値の変数と一緒に処理するときにはエラーが出て困ってしまいます。
そこで、今回は変数を数値に変換する方法を紹介していきます!
変換方法はもちろん、変数の種類や変換できる種類、できない種類も解説していきますので、ご参考にして下さい!
もくじ
to_i関数
最初に、to_i関数を紹介していきます。
書き方はこのようになります。
変数.to_i
記述も短くて、変数の後に書く形で、シンプルで扱いやすいですね。
コードを書く前に、数値のデータ型について抑えておきましょう。
Rubyでは、Numeric、Integer、Floatという数値のデータ型を持っています。
Integer型は整数、Floatは浮動小数点数、Numericはこの両方を含むデータ型を表します。
今回のto_i関数は、名前の通りInteger型つまり整数のデータ型に変換する関数です。
Rubyの数値のデータ型については、以下の記事でも紹介していますので、参考にしてみて下さいね。
【初心者向け】Rubyプログラミングで変数を数値判定する方法 | papaelblog
プログラミング進めていると、色んなデータを扱います。例えば、ユーザの個人情報を扱う場合には、住所や電話番号、生年月日など、です。ユーザがこのような情報を入力した際に、電話番号であれば、数値データじゃないといけません。
それでは、コードを書いていきましょう!
to_i_1.rb
val1 = "123"
puts val1.to_i
puts val1.to_i.is_a?(Integer)
val2 = "123.45"
puts val2.to_i
puts val2.to_i.is_a?(Integer)
val3 = "abc"
puts val3.to_i
puts val3.to_i.is_a?(Integer)
is_a?という関数が出てきますが、これは引数のデータ型と一致するかどうかを判定してくれます。
上記の記事にも紹介していますので、参考にしてみて下さいね。
では、実行してみます。
$ruby to_i.rb
123
true
123
true
0
true
実行結果を見ると、整数を表した文字列はそのままInteger型にちゃんと変換されています。
また、浮動小数点数を表した文字列は、整数値に直されています。
意外なのは、“abc”の文字列は0に直されている点です。
これは、文字列が数値をきちんと表していないときに活用できそうですね。
文字列が数値に変換されずに0になることが分かっていれば、0を条件に判定できます。
また、数値じゃない文字列であってもエラーにならないのは扱いやすいですね。
では、文字列のデータ型ではない変数をto_i関数に適用するとどうなるのでしょうか?
boolean型をサンプルにして、試してみましょう。
to_i_2.rb
val = true
puts val.to_i
実行してみましょう!
$ruby to_i_2.rb
Traceback (most recent call last):
to_i_2.rb:2:in `main': undefined method `to_i' for true:TrueClass (NoMethodError)
Did you mean? to_s
エラーが出てしまいました。
エラー文の内容としては、boolean型にはto_sという関数を使う方が適切となっていますね。
to_i関数は文字列にしか適用できない関数なんですね。
ですので、他のデータ型に適用しても同様のエラーが出てしまいます。
このto_i関数について、より詳細に知りたい場合は公式ドキュメントを参考にしてみて下さいね。
instance method String#to_i
to_f関数
次に、to_f関数を紹介していきます。
書き方はこのようになります。
変数.to_f
先程のto_i関数は文字列をInteger型に変換する関数でしたが、to_f関数は文字列をFloat型に変換する関数です。
使い方も一緒ですので、シンプルで使いやすいですね。
では、早速コードを書いていきましょう!
to_f_1.rb
val1 = "123"
puts val1.to_f
puts val1.to_f.is_a?(Float)
val2 = "123.45"
puts val2.to_f
puts val2.to_f.is_a?(Float)
val3 = "abc"
puts val3.to_f
puts val3.to_f.is_a?(Float)
実行してみましょう。
$ruby to_f.rb
123.0
true
123.45
true
0.0
true
浮動小数点数が文字列でちゃんと表されていればそのままFloat型の数値に変換されています。
他に、整数が表されている文字列は末尾に”.0″をつけてFloat型に、普通の文字列は0.0に変換されています。
変換結果も、to_i関数と同様になっていますね。
因みに、文字列以外のデータ型に適用するとどうなるでしょうか?
先程と同様にboolean型で試してみましょう。
to_f_2.rb
val = true
puts val.to_f
実行してみましょう。
$ruby to_f_2.rb
Traceback (most recent call last):
to_f_2.rb:2:in `main': undefined method `to_f' for true:TrueClass (NoMethodError)
Did you mean? to_s
to_i関数の場合と同様にエラーが出ましたね。
エラー文の内容も同様に、to_sという関数を使う方が適切となっています。
ですので、to_f関数も文字列にしか適用できない関数になります。
他のデータ型に適用してもエラーが出てしまいます。
このto_f関数について、より詳細に知りたい場合は公式ドキュメントを参考にしてみて下さいね。
instance method String#to_f
まとめ
- to_i関数:文字列をInteger型(整数)に変換
- to_f関数:文字列をFloat型(浮動小数点数)に変換
また、その文字列がちゃんと数値で表現されていない場合には0(もしくは0.0)に変換します。
加えて、文字列以外のデータ型に適用した場合にはエラーが出ます。
文字列以外のデータ型にはエラーが出てしまいますが、文字列のデータ型には必ず数値のデータ型を返してくれるので、活用しやすい関数だと思います。
シンプルで適用範囲が広い関数だと思うので、たくさん活用してみて下さいね!