■ printf()メソッド
はじめに
これまでは System.out.println()
や System.out.print()
を使用していました。
これらは単純に値を出力するためのメソッドでしたね。
しかし、 System.out.printf()
メソッドを使用すれば出力する文字などに 様々な装飾 を施すことが可能です。
Step1: System.out.printf()
文字へ装飾を施すためには 指定子 というものを記述する必要があります。
簡単にいうと「文字の好きな部分をちょっとだけ変える記号」です。
指定子は多くの種類が存在するため、順を追って少しずつ見ていきましょう。
(頻出するものを抜粋しています)
【型を指定する書式指定子】
指定子 | 指定子を付与することで得られる効果 |
---|---|
%d | 10進整数表記になる |
%o | 8進整数表記になる |
%x | 16進整数表記になる |
%f | 浮動小数点数表記になる |
【その他の書式指定子】
指定子 | 指定子を付与することで得られる効果 |
---|---|
– | 左寄せで出力される(幅指定必須) |
+ | 符号を出力する |
0 | 前に0を詰める(幅指定必須) |
このように 値の形式そのものを変更する 記号を 書式指定子 と呼びます。
具体的な使用例を見て見ましょう。
例) int型整数「12345」を8進数表記に変更したい場合
まず、下記変数
int math = 12345;
を準備します。
このint型変数mathの中身「12345」を8進数に変換してみましょう。
System.out.printf("%o", math); //printf()の第一引数に書式指定子、第二指定子に変換したい値を記述します。 //今回は「12345」を8進数表記にしたいので、 //数字を8進数表記に変換する指定子「%o」を指定しています。
【出力結果】
30071
整数「12345」が8進数表記に変換され、「30071」と出力されました。
続けてもうひとつ例見ていきましょう。
例) int型整数「1」の前に0を付けたい場合(0詰めして表示したい場合)
先ほどの例と同じように、変数
int one = 1;
を準備し、「1」を「01」に変換してみましょう。
System.out.printf("%02d", one); //「02」は出力される文字数を表しています。 //今回は1文字の「1」を0詰め表示させるので、結果は「01」となります。 //第二引数の不足分を0詰めするイメージですね。 //また、「d」は10進数表記の指定子です。 //つまり「第二引数の書式を維持したまま0詰めして出力する」記述が「%02d」となるわけです。
この記述を使用すれば、
・1月〜12月を表示(ただし1〜9は0詰めして表示させる)
といった要件にも簡単に対応することが可能です。
【サンプルコード】
public class monthTest { public static void main(String[] args) { for(int i = 0; i <= 12; i++) { if(i == 0) { continue; } System.out.printf("%02d", i); } } }
【出力結果】
010203040506070809101112
"%02"
と指定したので1〜9は0詰めで表示されましたが、10〜12は0詰めされずにそのまま表示されました。
もし"%03"
と記述すれば、出力結果は以下のようになります。
001002003004005006007008009010011012
"%03"
は第二引数を3文字で出力するため、3文字に満たない場合は不足分を0詰めされて上記のような結果となります。
この性質を覚えておくと、指定子の理解がグッと深まるでしょう。
Step2: System.out.printf()による日時の出力
printlf()
の指定子を用いることで、日時データのフォーマットを変換して出力することが可能です。
下記の表は、よく日時データの変換に用いられる指定子を抜粋したものです。
指定子 | 指定子を付与することで得られる効果 |
---|---|
tH, TH | 時間 (00 – 23) 0 が付加される |
tI, TI (大文字のアイ) | 時間 (01 – 12) 0 が付加される |
tk, Tk | 時間 (0 – 23) 0 は付加されない |
tl, Tl (小文字のエル) | 時間 (1 – 12) 0 は付加されない |
tM, TM | 分 (00 – 59) 0 が付加される |
tS, TS | 秒 (00 – 60) 0 が付加される |
tp, Tp | 午前・午後の表記 |
tB, TB | 月の表示 |
tb, Tb | 月表示の省略形 |
tA, TA | 曜日の表示 |
ta, Ta | 曜日の省略形 |
tY, TY | 年の4桁 0 が付加される |
ty, Ty | 年の下2桁 (00 – 99) 0 が付加される |
tm, Tm | 月 (01 – 13) 0 が付加される(13は太陰暦を使用する場合に使う) |
td, Td | 日 (01 – 31) 0 が付加される |
te, Te | 日 (1 – 31) 0 は付加されない |
これらの指定子を用いれば、取得した現在時刻を私たちが普段目にするフォーマットへ変換するといったことも
簡単に行えます。
まず、現在時刻を取得します。
Date date = new Date();
Date型変数「Date」の出力結果
※2019/03/06日時点の出力内容になります。
Wed Mar 06 16:39:32 JST 2019
では、取得した現在時刻の形式を「 年月日(曜日)午前or午後〇〇時〇〇分 」に変換してみましょう。
System.out.printf("%tY年%<tB%<te日(%<ta)%<tp%<tI時%<tM分", date);
このprintf()
内では、下記の指定子が記述されているので要チェックです。
指定子 | 指定子を付与することで得られる効果 |
---|---|
tY, TY | 年の4桁 0 が付加される |
tB, TB | 月の表示 |
te, Te | 日 (1 – 31) 0 は付加されない |
ta, Ta | 曜日の省略形 |
tp, Tp | 午前・午後の表記 |
tI, TI (大文字のアイ) | 時間 (01 – 12) 0 が付加される |
tM, TM | 分 (00 – 59) 0 が付加される |
【出力結果: printf()で「date」のフォーマットを変換した場合】
2018年12月29日(土)午後04時56分
日時の形式は現場によって千差万別なので、前章で学んだSimpleDateFormat・DateTimeFormatterと併せて
覚えておくと、業務を行う上で必ず役に立ちます。
まとめ
現場での業務において、値の形式を変更したいケースに遭遇することは非常に多いです。
前回学んだsimpleDateFormat
と併せて覚えておくと、様々な要件へ柔軟に対応できるようになるので
今のうちにしっかりと学習しておくと良いでしょう。