prntfメソッド

■ 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と併せて覚えておくと、様々な要件へ柔軟に対応できるようになるので
今のうちにしっかりと学習しておくと良いでしょう。

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami