こんにちは!システムエンジニアのオオイシです。
System.out.printfメソッドを使って出力する変数を編集してますか?Javaではprintfメソッドを使ってデバッグ内容の出力を行ったり、処理内容のログを出力したりします。
そんな場合に、printfメソッドを使って文字列の中に変数を入れたり、また出力形式を揃えたりなどして読みやすく編集できると便利です。この記事では、printfメソッドを使った変数の出力と編集について
- printfメソッドとは
- 書式指定子の一覧表
- printfメソッドの使い方
といった、printfメソッドの基本的な内容からprintとprintfの違いや文字列への変換にはString.formatメソッドを使うことなどの応用的な内容についても解説していきます。今回はprintfメソッドについて、使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
printfメソッドとは
Javaにはprintfというメソッドがあります。このメソッドは文字列や数値などを指定した書式で画面に出力することができます。例えば、10000という値を10,000とカンマ区切りで整形し、さらに単位の「円」を加えて10,000円と画面に出力するときなどです。
printfメソッドは第1引数に出力したい書式を、第2引数以降に使用する変数を記入します。第2引数以降は可変長引数で、必要なだけ引数を指定することができます。次のように記述します。
System.out.printf(書式, 引数1, 引数2, 引数3…)
なお、JavaのprintfメソッドはC言語のprintf関数を参考に作られているので、同じような使い方ができます。C言語のprintf関数については、こちらで詳しく説明していますので、ぜひ参考にしてください!
書式指定子の一覧表
Javaのprintfメソッドで出力する変数を編集するためには書式指定子という記号を使用します。書式指定子は、編集したい内容によって色々な書き方や種類があるため一覧表にしました。
型を指定する書式指定子
指定子 | 主な型 | 簡単な説明 | 記述例 | 出力例 |
---|---|---|---|---|
% | なし | 書式指定子の開始 | なし | なし |
d | 整数 | 10進数で出力 | printf("%d", 123) | 123 |
o | 整数 | 8進数で出力 | printf("%o", 123) | 173 |
x | 整数 | 16進数で出力 | printf("%x", 123) | 7b |
e | 小数 | 指数で出力 | printf("%e", 123.4f) | 1.23E+02 |
f | 小数 | 小数点数出力 | printf("%f", 123.4f) | 123.4 |
s | 文字列 | 文字列を出力 | printf("%s", “abc”) | abc |
c | 文字 | 文字を出力 | printf("%c", ‘a’) | a |
b | 真偽値 | 真偽値を出力 | printf("%b", true) | true |
桁数・左詰・0埋め・改行 ・引数番号 (※△=スペースの意味)
指定子 | 簡単な説明 | 記述例 | 出力例 |
---|---|---|---|
数 | 最小桁数を指定 | printf("[%5d]", 123) | [△△123] |
.数 | 文字列の最大幅を指定 | printf([%.3s]", "abcde") | [abc] |
- | 左詰 | printf([%-5s]", "abc") | [abc△△] |
0 | 0埋め | printf("[%05d]",123); | [00123] |
n | 改行 | printf("abc%ndef"); | abc def |
数$ | 引数の番号 | printf( "%3$s,%2$s,%1$s", "str1","str2","str3"); | str3,str2,str1 |
日付 (※日時は2018年1月5日 17時4分5秒を想定)
指定子 | 簡単な説明 | 記述例 | 出力例 |
---|---|---|---|
tY | 年(4桁) | printf("%tY", new Date()); | 2018 |
ty | 年(2桁) | printf("%ty", new Date()); | 18 |
tm | 月(2桁) | printf("%tm", new Date()); | 01 |
td | 日(2桁) | printf("%td", new Date()); | 05 |
te | 日(1~2桁) | printf("%te", new Date()); | 5 |
tH | 時(2桁)24時間制 | printf("%tH", new Date()); | 17 |
tl | 時(1~2桁)12時間制 | printf("%tl", new Date()); | 5 |
tM | 分(2桁) | printf("%tM", new Date()); | 04 |
tS | 秒(2桁) | printf("%tS", new Date()); | 05 |
tF | 日付 | printf("%tF", new Date()); | 2018-01-05 |
tT | 時刻 | printf("%tT", new Date()); | 17:04:05 |
このように、printfメソッドでいろいろな書式で出力できることがわかりましたね!実際にprintfメソッドを使ったプログラミングをするときは、この表を見ながら目的の書式指定子を探すと良いでしょう。
printfメソッドの使い方
変数の値を表示する方法
printfメソッドの第2引数以降には、編集の元となる整数や文字列などの変数を入れることができます。整数の変数に100を代入して、第1引数の「%d」で編集し、さらに単位の円を加えて「100円と出力する方法を次のサンプルプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { int num = 100; String str = "円"; System.out.printf("%d%s", num, str); } }
実行結果:
100円
このように”100円”と出力されたのが確認できました。第1引数の書式指定子は
- 「%」変換指定子の開始
- 「d」 第2引数の変数numが整数(デシマルのd)
- 「s」 第3引数の変数strが文字列(ストリングのs)
と書式の指定をしています。
桁数を指定して表示する方法
printfメソッドの書式指定子には最小桁数を指定して表示する方法があります。最小桁数を指定すると、画面に出力する文字列を整列させることができます。例えば、
金額は10,000円です。 金額は 100円です。
のように整列させると見やすいですよね。書き方は、データ型を表現する「%d」(整数)や「%s」(文字列)の間に最小桁数を表す数字を入れて「%6d」や「%6s」と記述します。
書式指定子で6桁を指定して、3通りの変数123、12345、123456を出力する場合のサンプルプログラムを確認してみましょう。
public class Main { public static void main(String[] args) { int num1 = 123; int num2 = 12345; int num3 = 123456; String str = "円"; System.out.printf("金額は%,6d%sです。\n", num1, str); System.out.printf("金額は%,6d%sです。\n", num2, str); System.out.printf("金額は%,6d%sです。", num3, str); } }
実行結果:
金額は 123円です。 金額は12,345円です。 金額は123,456円です。
このように、変数num1と変数num2ともにカンマを含めて桁数6桁で出力できました。変数num3については、最小桁数の6桁を超えても7桁で出力されることが確認できました。
サンプルプログラムで使った書式指定子のそれぞれの意味は、「%,6d」が指定した整数の変数をカンマを含む6桁で出力する指定をしています。「%s」は文字列の変数を出力する指定をしています。
文字列の最大幅を指定して表示する方法
printfメソッドの書式指定子には文字列の最大幅を指定して表示する方法があります。最大幅を指定すると、文字列の左を優先して最大幅まで出力し、残りの文字列は削除されて出力されません。書き方は「%.6s」のように.(ドット)をつけて最大幅を指定します。
文字幅が7桁のabcdefgに対して、左から6桁を出力するサンプルプログラムを確認してみましょう。
public class Main { public static void main(String[] args) { String str = "abcdefg"; System.out.printf("%.6s", str); } }
実行結果:
abcdef
このように、変数strは 「abcdefg」なのに対し、出力が「abcdef」のように「g」が出力されないことが確認できました。なお、最大幅の書式を指定できるのは、文字列のみで整数は利用できないので注意してください。
プラットフォームに依存しない改行を「%n」で行う方法
printfメソッドでプラットフォームに依存しないように改行するためには「%n」という書式指定子を使います。文字列の途中で改行するには、エスケープシーケンスの「\n」という改行コードを使用できますが、printfメソッドには別途「%n」が準備されています。
実は、エスケープシーケンスの「\n」はプラットフォームに依存する文字になります。プラットフォームに依存する文字とは、改行コードを例にとると、
- Windows系OSは「\r\n(CR+LF)」
- Unix系OS全般、Mac OS Xは「\n(LF)」
- 古いMac OS(9以前)は「\r(CR)」
というように、OSが内部的に取り扱う改行コードが異なることを意味しています。プラットホーム依存の文字を使うと、MacでコンパイルしたJavaプログラムをUnixで実行した場合は改行されないことが起こる可能性があります。
そのため、printfメソッドを使うときに改行するときは「%n」を使うようにしましょう。ここでは「%n」「\n」を使ったサンプルプログラムで改行されるか確認してみましょう。
public class Main { public static void main(String[] args) { System.out.printf("侍%nエンジニア\n塾"); } }
実行結果:
侍 エンジニア 塾
実行結果では、「%n」「\n」のどちらも問題なく改行されますが、コンパイルした環境と実行する結果が異なる場合に「n」は改行されない可能性があるため注意してください。
printとprintfの違い
Javaには、printfメソッドとよく似たprintメソッドが存在します。printメソッドは、文字列や整数などの任意の値を画面に出力するメソッドです。printfメソッドとの構文の違いがわかりにくいので縦に並べると、
System.out.printf(書式, 変数1,変数2,変数3…) System.out.print(変数)
のように若干違いますよね?違いは、
- printメソッドはprintfメソッドのように、フォーマット(書式)を意味する「f」がないというメソッド名の違い
- 書式を指定する書式指定子がないため、引数は1つのみ
となります。printfメソッドとprintメソッドのそれぞれで、123という整数を表示する方法を次のサンプルプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { int num = 123; System.out.printf("変数numの値は%dです。%n", num); System.out.print("変数numの値は" + num + "です。\n"); } }
実行結果:
変数numの値は123です。 変数numの値は123です。
このように、printとprintfの実行結果を比較すると同じ出力結果になりました。
しかし、printメソッドは書式の指定をすることができません。単純に変数の出力であればprintメソッド、書式の指定をしたいのであればprintfメソッドを使うなど、ケースに応じて使い分けるとよいでしょう。
文字列への変換はString.formatメソッドを使う
Stringクラスの変数に対して書式を指定したい場合もあります。例えば、
- 指定した書式の文字列をファイルに出力
- 指定した書式の文字列をプリンタに出力
- 指定した書式の文字列をWeb画面に出力
など、ざまざまな場面が想定できます。System.out.printメソッドは、あくまでも、変数などを画面に出力するためのメソッドなので、ファイル出力などには使えません。
これらを解決する方法としてJavaにはString.formatメソッドという便利な機能があります。次のように記述します。
String.format(書式, 引数1, 引数2, 引数3…) // 戻り値の型はStringクラス
どこかでみたような構文ですよね!?実はString.formatメソッドは、この記事で紹介したprintfメソッドと使い方が同じなのです。printfメソッドは、Javaの内部的な処理ではString.formatメソッドを使用しているため使い方は全く同じとなるのです。
String.formatメソッドについては、こちらで詳しく説明していますので、ぜひ参考にしてください。
まとめ
いかかでしたか?今回はprintfメソッドの使い方について説明しました。printfは文字列などの値を指定した書式で画面に表示するために利用します。プログラムのデバッグで変数を出力したり、実行結果を見やすいように整形する場面で便利なので、ぜひ活用してください。
もし、printfメソッドの使い方を忘れてしまったらこの記事を確認してください!