見出し画像

いろいろな言語での書式指定子たち#4 - Java言語

プログラムを作れば結局のところ何らかのアウトプットが必要なわけで、文字としてアウトプットする際に必ずお世話になるのが print 関連の関数で使われる書式設定です。前回はC言語についてまとめましたが、今回はJavaです。

いろいろな言語での書式指定子たち#3 - C言語

Javaは比較的新しい言語ですし、この時代になるとコンソール画面というよりはGUIに何かを出すことも増え、GUIとなると文字の幅も一定ではなくなるので書式で頑張っても限度が出てくるのですが、テキスト形式でデータをファイルに書き出したりするには、まだまだ書式指定が活躍する場所も残っています。JavaでもC言語とほぼ同じ仕様の printf が使えますし、オブジェクトに出す場合には VB にもありましたが format 関数を使って文字列を作って、それを渡します。いずれも書式指定子はほぼC言語と同じなのですが、ちょっとだけ異なる部分もあるようです。

【Java入門】printfメソッドで書式を指定して文字列を表示する方法

printf および最後に自動的に改行が付加される println は、呼び出された時に書式文字列をインタプリトして実行する System クラスで、コンソールに文字列を出力するには以下の形式で呼び出します。

System.out.printf(書式指定文字列,引き数1,引き数2,…);

printlnも同じ

書式文字列の中で"%"が出てくるたびに"%"の後ろで指定された形式で続く引き数で渡された値が評価されて文字列に変換されて埋め込まれた文字列が出力されます。"%"に続く書式指定文字列は

%[対象となる引き数の位置][フラグ][全体の幅][.精度]型指定

[]内は省略可

という形式でC言語と異なるのは変換対象となる引き数の位置を指定すること「も」出来ることです。これで同じ引き数を2度使う時に同じ変数を2度書かずに済みます。この指定を行う時には何番目の引き数が対象であるかの数値に続き”$”を書きます。最初の引き数(書式文字列の次の値)を対象とするのであれば”%1$”となる訳です。

int a = 100;
System.out.println(”10進数(%1$d),8進数(%1$o),16進数(%1$x).”, a);
100,144,64.

となります。

この時に"%"に続いて数字ではなく”<”とすると、一つ前に使った値を再び使うことを意味します。ですから

System.out.println(”10進数(%d),8進数(%<o),16進数(%<x).”, a);

と順序を気にせずに使うことができます。

次のフラグというのは左詰めの”-”であるとか”0”で指定した桁数になるように先頭を0で埋めると行った指示で、こちらもC言語と比べると負の数を"()"で囲むなどの機能が追加されているようです。

int p = 100;
System.out.println("[%d]",p);
System.out.println("[%+d]",p);
System.out.println("[% d]",p);
int m = -100;
System.out.println("[%d]",m);
System.out.println("[%+d]",m);
System.out.println("[%(d]",m);
[100]
[+100]
[ 100]
[-100]
[-100]
[(100)]

そして幅と精度に関してはほぼC言語と同じで全体の文字列としての長さと小数点以下の桁数を指定します。C言語と同じく変換した結果が指定した幅で収まらない時は指定を無視して変換結果全体を使います。

int i = 1000;
double x = 20.07;
System.out.println("[%05d]",i);
System.out.println("[%,05d]",i);
System.out.println("[%5.1f]",x);
System.out.println("[%.3f]",x);
[01000]
[1,000]
[ 20.1]
[20.070]

文字列の場合、幅の部分が最大文字数。ピリオドの次が最小文字数です。幅に収まらない時は溢れて長くなるのですが、最小の方は収まらないと切り捨てられるのが仕様のようです。

String s = “sample”;
System.out.println(”[%7s]”, s);
System.out.println(”[%-7s]”, s);
System.out.println(”[%.3s]”, s);
[ sample]
[sample ]
[sam]

最後にいちばん大事な型指定ですが、おなじみの%d,%c,%s,%e,%fはC言語とほぼ同じですが、Javaは型に厳しい言語なので、どんな型の変数も指定できるのではなく、ここで変換が出来ないと実行時に例外が発生します(これらの変換は実行時に行われるからです)。

d 整数など 10進数
o 整数など 8進数
x 整数など 16進数 (X で10~15を小文字ではなく大文字)
e 小数 指数形式
f 小数 小数点を使った数字
c 文字 Javaの文字コード(Unicode)
s 文字列 文字列以外の型の場合は、その型の to_string が呼び出される
b 論理値 true false という文字列
h 整数など shortではなくてハッシュ値
n 対応する値は無し 改行文字列(適切な改行コードが選ばれるので、\nや\rで悩まなくて良い)
% %を出すとき

代表的な型指定文字

そして特徴的なのが "%t" です。C言語でも一部の処理系では日時に関する書式が追加されていますが、Javaでは標準化されています。tに続く文字がYであれば4桁の年、mは月、dは日というように使えます。かなり細かな書式を選ぶことも出来、形式によってはロケールを使って表現を選択してくれます。もちろん対象となる変数は適切な型を与えなければなりません。

フォーマット入出力

Java で数値出力をフォーマットする

そして、これらの指定は String クラスの format メソッドでも同じものが使えます。

formatメソッド

int i = 100;
System.out.println(String.format(”[%d]”, i));
[100]

Javaの場合、クラスごとに適切な書式化出力を追加する必要も出てくるので、formatterクラスのインターフェースを使うことで実装できます。ただ慎重に使わないとロケールによっては小数点の文字が変わりますし、スレッドセーフかどうかは自分で管理する必要があります。

クラスFormatter

かなりいろいろな書式が使えるのですが、C言語に比べれば標準化されているので、あまり見かけない書式も安心して使って大丈夫なようです。

ヘッダ画像は、Copilotの作品です。

#プログラミング言語 #書式 #printf  #println #format #Java #fomatter


いいなと思ったら応援しよう!