【Java】文字列を整形するFormatter.formatメソッドの使い方

スポンサーリンク

文字列を指定された書式文字列で整形する Formatter#format メソッドの使い方についてです。

Formatter#formatメソッドについて

Formatterクラスのformat()メソッドは以下の通りです。戻り値は自身のインスタンスです。

メソッド 説明
format(String format, Object... args) 第1引数に書式パターン、第2引数に値を指定。
format(Locale l, String format, Object... args) ロケールを指定可能。省略した場合はデフォルト。

また、java.lang.Stringjava.io.PrintStreamjava.io.PrintWriterに実装されているformat()メソッドや、System.out.printfも内部ではFormatter#formatを呼び出していますので、同じように書式化が可能です。

import java.util.Formatter;

public class FormatterSample {
    public static void main(String[] args) {
        Formatter fm = new Formatter();
        fm.format("Hello %s!", "World");
        System.out.println(fm);
    }
}

// 結果
Hello World!

 Formatter (Java Platform SE 8)

書式の指定方法

書式は%を接頭辞で書式の開始文字として扱います。%を出力したい場合は%%と指定してください。大文字で書かれている書式は、変換の結果が大文字になります。String#toUpperCase()のメソッドを使用するのと同様です。

書式 説明
s, S 文字列リテラル
c, C 文字リテラル
b, B 真偽値
h, H ハッシュ値を16進数で表示
d 10進整数
o 8進整数
x, X 16進整数
e, E 浮動小数点
f 浮動小数点
g, G 浮動小数点
a, A 浮動小数点
t, T 日付および時刻変換文字の接頭辞
n 改行コード

文字列

引数のtoString()が取得され、引数がFormattableを実装している場合、formatTo()が呼び出されます。引数が null の場合は null になります。

System.out.printf("1:%s 2:%S 3:%s 4:%s 5:%s", "hoge", "hoge", 1234.5, true, null);
// 結果
1:hoge 2:HOGE 3:1234.5 4:true 5:null

真偽値

引数が boolean または Boolean の場合true | false、null の場合false、そうでない場合はtrueになります。

System.out.printf("1:%b 2:%B 3:%b 4:%b 5:%b", true, true, false, null, "hoge");
// 結果
1:true 2:True 3:false 4:false 5:true

ハッシュ値

オブジェクトのハッシュ値が取得され、引数が null の場合は null になります。

System.out.printf("1:%h 2:%H 3:%h 4:%h", "hoge", "hoge", true, null);
// 結果
1:30f425 2:30F425 3:4cf 4:null

浮動小数点

浮動小数点の表示形式は以下の通りです。

float f = 1.2345F;
System.out.printf("1:%e 2:%E 3:%f 4:%g 5:%G 6:%a 7:%A", f, f, f, f, f, f, f);
// 結果
1:1.234500e+00 2:1.234500E+00 3:1.234500 4:1.23450 5:1.23450 6:0x1.3c0832p0 7:0X1.3C0832P0

日付/時刻変換

%tは接頭辞ですのでこれだけでは意味をなしません。%tの後に以下の書式を追加する必要があります。

書式 説明
Y, y 年を4桁, 年を2桁(00-99)で表現
m 月を2桁で表現(01-12)
d, e 日を2桁(01-31), 日を1~2桁(1-31)で表現
j 年の何日目かを3桁で表現(001-366)
Date date = new Date();
System.out.printf("年:%tY 年:%ty 月:%tm 日:%td 日:%te 年間経過日数:%tj", date, date, date, date, date, date);
// 結果
年:2015 年:15 月:09 日:27 日:27 年間経過日数:270
書式 説明
H, k 24時間制の時を0埋め(00-23), 24時間制の時(0-23)
I, l 12時間制の時を0埋め(01-12), 12時間制の時(1-12)
M 分を0埋め(00-59)
S 秒の0埋め(00-60)
L ミリ秒の0埋め(000-999)
Date date = new Date();
System.out.printf("時:%tH 時:%tk 3:%tI 4:%tl 5:%tM 6:%tS 7:%tL", date, date, date, date, date, date, date);
// 結果
24時:22 24時:22 12時:10 12時:10 分:30 秒:45 ミリ秒:087
書式 説明
R %tH:%tMとして24時間制で書式設定された時刻
T %tH:%tM:%tSとして24時間制で書式設定された時刻
r %tI:%tM:%tS %Tpとして12時間制で書式設定された時刻
D "%tm/%td/%ty"として書式設定された日付
F %tY-%tm-%tdとして書式設定されたISO 8601に準拠した日付
c %ta %tb %td %tT %tZ %tYとして書式設定された日付および時間
System.out.printf("1:[%tR] 2:[%tT] 3:[%tr] 4:[%tD] 5:[%tF] 6:[%tc]", date, date, date, date, date, date);
// 結果
1:[22:47] 2:[22:47:00] 3:[10:47:00 午後] 4:[09/27/15] 5:[2015-09-27] 6:[日 9 27 22:47:00 JST 2015]

出力する文字数の指定

書式 説明
%n@ 出力に書き込まれる最小文字数。
%.n@ 出力に書き込まれる最大文字数。浮動小数点では基数点以下の桁数。整数は使えない。
System.out.printf("1:[%5s] 2:[%-5s] 3:[%5d] 4:[%5f]", "hoge", "fuga", 1234, 1.234F);
// 結果
1:[ hoge] 2:[fuga ] 3:[ 1234] 4:[1.234000]

System.out.printf("1:[%.2s] 2:[%.2s] 3:[%.2f]", "hoge", "fuga", 1.234F);
// 結果
1:[ho] 2:[fu] 3:[1.23]

関連書籍