文字列を指定された書式文字列で整形する Formatter#format メソッドの使い方についてです。
Formatter#formatメソッドについて
Formatter
クラスのformat()
メソッドは以下の通りです。戻り値は自身のインスタンスです。
メソッド | 説明 |
---|---|
format(String format, Object... args) | 第1引数に書式パターン、第2引数に値を指定。 |
format(Locale l, String format, Object... args) | ロケールを指定可能。省略した場合はデフォルト。 |
また、java.lang.String
、java.io.PrintStream
、java.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]
関連書籍