gets
でデータを読み込む場合、
たとえ数字が入力されてもそれは必ず「文字列」として読み込まれる。
数値として計算に利用したい場合は文字列を数値に変換する必要がある。
逆に、数値を文字列に戻すことが必要になることもある。各々の
変換をしてくれるメソッドを紹介する。
to_i
(to Integer)
数字が並んでいる文字列を10進数と見なして整数の数値に変換する。
"123".to_i → 123
"3.1415".to_i → 3
to_f
(to Floating Point Number)
数字が並んでいる文字列を10進数と見なして浮動小数点数に変換する。
"3.1415".to_f → 3.1415
小数を表現できる数値のことを浮動小数点数(Floating Point Number)という。一般に計算機では、整数と浮動小数点数は別の形式で 内部処理される。このため、整数を割り算した結果は小数点以下が切り捨てられ、 やはり整数になる。
上記の to_i, to_f
いずれも、変換前の値は、
文字列でなくとも構わない。たとえば、
pi=3.1415 q=pi.to_i
も正しい使い方で、q
の値は3となる。
Rubyを含めた多くの言語では小数点を含まない数は整数 として処理される。それを意識しないと割り算をするときに結果が異なるので 注意が必要である。
x=5 # xには「整数」の5が入る y=x/2 # 2で割っても「整数」なので2.5 → 2 となる printf("%f\n", y) 2.000000 # %f を使ってもyが2なので2.0となる
割り算をする前には、割る方か割られる方のどちらかをto_f
で浮動小数点数に変換しておかなければならない。以下のいずれでも、
yは正しく2.5となる。
# その(1) x=5.0 # 小数点を付けると最初から浮動小数点数 y=x/2 # 5.0が浮動小数点数なので割り算も浮動小数点数 # その(2) x=5 # この時点ではまだ整数 y=x/2.0 # 2.0が浮動小数点数なので割り算も浮動小数点数 # その(3) x=5 # この時点ではまだ整数 y=x/2.to_f # 整数の2を浮動小数点数に変換 # その(4) x=5 # この時点ではまだ整数 y=x.to_f/2 # xを浮動小数点数に変換してから2で割る
プログラムの中で数値を処理する場合でも、その結果を出力するためには また文字列に戻す必要がある。そのため
のいずれかの方法を知っておく必要がある。これまで利用していた
printf
は後者に相当する。まずprintf
について説明し、続いて数値を文字列化する to_s, sprintf
メソッドについて説明する。
printf
(print with format)
最初の引数の文字列の中にある %X を、2個目以降の引数で与えた 値に置き換えて出力する。
printf("ほげー%X1うりゃ%X2
",
X1, X2)
のようにすると、最初の%X1
が
X1の値に置き換えられ、
次の%X2
が
X2の値に置き換えらる。
%X1
、
%X2
の部分には、
%d、%x、%f、%s
などが使える。
%d
- (Decimal; 10進数)
対応する値を10進整数の文字列に置き換える
%x
- (heXa decimal; 16進数)
対応する値を16進整数の文字列に置き換える
%f
- (Floating point number)
対応する値を10進浮動小数点数の文字列に置き換える
%s
- (String)
対応する値を文字列に置き換える
%
とd, x, f, s
の間には置き換えたあと
の桁数を指定する数を入れることができる。たとえば、
printf("合計%5d円です。\n", price)
とすると、price
の値が5桁に満たなくても5桁分確保し
て出力する。たとえば、price=50
だとしても、
合計 50円です。 ^^^^^
と出力する。
小数(浮動小数点数)に変換する%f
では、
全体の桁数と、小数点以下の桁数を指定できる。
printf("答は%5.2fです。\n", answer)
とすると、「全体で5桁、そのうち小数点以下2桁」で出力する。
たとえば、answser=2.5
なら、
答は 2.50です。 ^^^^^
と出力する。
Ruby-1.9以降は、日本語文字列の表示幅を合わせることを標準ではしてくれない。 日本語文字列の表示幅を合わせたい場合は、プログラムの coding を euc-jp にしたうえで、プログラムの先頭に
Encoding.default_external = "binary"
を記述するとよい。
桁数の指定に負の数値を与えると、「左詰め」して出力する。 たとえば、正の値で桁数指定すると
printf("%10s, %20s\n", "中町太郎", "ナカマチタロウ")
とすると、
中町太郎 |
, |
ナカマチタロウ |
^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^ |
と右詰めで出力するが、 桁数に負の数を与えると
printf("%-10s, %-20s\n", "中町太郎", "ナカマチタロウ")
とすると、
中町太郎 |
, |
ナカマチタロウ |
^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^ |
と左詰めで出力する。
printf
で数値を出力するのではなく、文字列に変換して
別の変数に入れるようなときは以下のメソッドを利用する。
sprintf
printf
で出力されるものを文字列として返す。
以下の例を見よ。
month = 3 day = 1 printf("%02d%02d", month, day) # (文字列"0301"が出力される) s = sprintf("%02d%02d", month, day) # (文字列"0301"が変数sに代入される)
to_s
- (to String)
すべての型の値を文字列に変換する。