Rubyで与えられた文字列を、コンソールに出力する時は、printfメソッドやputsメソッドを用います。この記事では、printfメソッドの使い方や、putsメソッドとの違いを解説していきます。
printfメソッドとは
冒頭でも述べたとおり、printfメソッドは引数で与えられた文字列をコンソールに出力するメソッドです。
さらに、フォーマットを指定して数値を左寄せ・右寄せしたり、指定した桁数まで数値に「0」を埋める、いわゆるゼロ埋めをしたりできます。
printfを使った文字列のコンソール出力は、コンソール上で動作するRubyアプリはもちろんのこと、その他のアプリの開発でも、デバッグ用途で変数の中身を出力して確認する時に使用するなど、多くのシーンで活躍するメソッドです。
printfメソッドの構文
printfの使い方(構文)は次の通りです。
printf( "フォーマット", パラメータ )
メソッドの使用例は次の通り。
printf( "私は%sです。年齢は%dです。", )
1つ目の引数のフォーマットは基本的に C 言語のprintfメソッドで指定できるフォーマットと同じで、次の表に示すものが使用可能です。
指示子 | 意味 |
---|---|
%c | 引数の数値を文字コードとみなして対応する文字を出力 |
%s | 文字列を出力 |
%p | inspectメソッドを呼び出した結果を出力 |
%b, %B | 数値を2進数で出力 |
%o | 数値を8進数で出力 |
%d, %i | 数値を10進数で出力 |
%x, %X | 数値を16進数で出力 |
%f | 999.999のような小数点の表現で数値を出力 |
%e | 9.999e+10のような指数表現で数値を出力 |
%% | %そのものを出力(%のエスケープ シーケンス) |
– | 幅の指定がある場合に出力を左寄せにする。 |
+ | + または –の符号を出力 |
空白 | 数値が負の数のとき–を出力。正の数の時は半角スペースを出力。 |
数値 | 幅を指定する。ここで指定された数だけスペースが埋められた文字が出力される。 |
0 | 幅の指定時に、あまった文字をスペースではなく0で埋める。 |
このように、printfメソッドの1つ目の引数には、固定で出力する文字と、動的に変わる値の型や書式を指定します。
printfメソッドを使ってみよう
printfメソッドの構文を確認したところで、実際にさまざまなフォーマットを指定して、コンソールに出力するサンプルコードを見ていきましょう。
数値のフォーマット
数値をprintfメソッドで出力する場合、値をそのままや、指定桁数で左寄せ・右寄せ、ゼロ埋めなど、さまざまな書式を指定できます。
作成例1:単純な数値の出力
最初は、なんの書式指定しないもっとも単純な数値を出力する例です。
a = 1000
printf("a=%d", a)
------------
a=1000
作成例2:指定桁数まで数値を右詰で出力
%幅dのように指定することで、指定した幅(桁数)になるまで、スペースを埋めて出力します。
a = 1000
printf("a=%6d", a) #6桁になるまで右詰
------------
a= 1000
作成例3:指定桁数まで数値を左詰で出力
幅の桁数指定の前に–を指定すると、左詰で結果を出力します。
a = 1000
printf("a=%-6d", a) #6桁になるまで左詰
------------
a=[1000 ]
作成例4:指定桁数まで数値を右詰(余った部分はゼロ埋め)
幅の桁数指定の手前に0を指定すると、指定桁数までであまった文字を0で埋めます。
a = 1000
printf("a=%06d", a) #6桁になるまで右詰(ゼロ埋め)
------------
a=001000
作成例5:小数点以下の桁数を指定して浮動小数点を出力
小数点以下の桁数は、浮動小数点の指示子(f)の前に固定で出力する桁数を指定します。値で指定した浮動小数点の値が、フォーマットで指定した桁数に満たない場合はゼロ(0)で余った部分が埋められます。
a = 10.2
printf("a=%10.3f", a)
------------
a= 10.200
作成例6:符号付きで数値を出力
+または–の符号付きで数値を出力する場合は、次のように書きます。
a = 1000
b = -1000
printf("a=%+5d\n", a)
printf("b=%+5d", b)
------------
a=+1000
b=-1000
作成例7:2つ以上の数値を出力
次のように、printfメソッドで2つ以上の数値を出力する場合、出力する数値の数だけ引数にパラメータを設定する必要があります。またパラメータはフォーマットの出現順に指定します。
a = 1000
b = 1
printf("a=%5d, b=%03d", a, b)
------------
a= 1000, b=001
カンマ区切りで出力できる?
数値を999,999のように、3桁ごとにカンマで区切って出力することがありますが、printfメソッドはカンマ区切の出力には対応していません。自前のコードで3桁ごとにカンマを挿入するコードを組み込む方法や次の Active_Supportを使う方法が考えられます。
もし「Ruby on Rails」で開発しているのであれば、Railsの Active_Supportを利用すると、:delimitedメソッドを使用して、次のように簡単なコードで数値をカンマ区切に編集できます。
require 'active_support/core_ext/numeric/conversions'
12345678.to_s(:delimited) # => 12,345,678
「Ruby on Rails」を使用していない環境であっても、gemでRailsの機能の内、Active_Supportのみを個別でインストールすることが可能であるため、Railsの機能は不要だが、:delimitedメソッドだけは使いたい場合は、こちらの方法でも対応が可能です。
gem 'activesupport'
文字列のフォーマット
文字列も%s指示子を使って、指定した値をprintfメソッド出力したり、数値の時と同様に指定桁数で右詰や左詰して出力することが可能です。
いくつかの作成例を見ていきましょう。
作成例1:単純な文字の出力
文字列は%s指示子を使って出力します。
a = "Ruby"
printf("a=%s", a)
------------
a=Ruby
作成例2:文字列を右詰で出力
数値の時と同様に、%s指示子の前に幅を指定することで、指定桁数になるまで文字列を右詰で出力できます。
a = "Ruby"
printf("a=%6s", a)
------------
a= Ruby
作成例3:文字列を左詰で出力
指定桁数の左詰で文字列を出力する場合は、幅指定の前に–を指定します。
a = "Ruby"
printf("a=[%-6s]", a)
------------
a=[Ruby ]
文字列でゼロ埋め出来る?
結論から言うと、文字列では数値のようにスペースをゼロで埋めることはできません。
数値の時と同様にフォーマットにゼロ埋め指定を行ってみると、次の結果の通りスペースが埋められた結果で出力されます。
a = "1000"
printf("a=%06s", a)
------------
a= 1000
まとめ
Rubyのprintfメソッドで、フォーマットを指定して数値や文字列をコンソールに出力する方法を解説していきました。
Rubyではprintfメソッドの他に、putsメソッドでも文字列を出力できますが、printfメソッドの場合はフォーマットを指定して複数の値を出力できることや、強制的に改行がされないといった違いがあります。
これらの違いを理解して、用途に合わせてメソッドを使い分けていきましょう。
【関連記事】
▶Rubyのif文で条件分岐!数値や文字列の比較方法を解説
パラメータとして指定する値と指示子の型があっていないとエラーになるため注意しましょう。指示子は、整数は%d、浮動小数点であれば%f、文字列の場合は%sを指定します。