Javaのフォーマット文字列の$を理解する


84
 StringBuilder sb = new StringBuilder();
 // Send all output to the Appendable object sb
 Formatter formatter = new Formatter(sb, Locale.US);

 // Explicit argument indices may be used to re-order output.
 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
 // -> " d  c  b  a"

この場合、$に2が追加されるのはなぜですか?

回答:


132

2は何の関係もありません$

  • %     =フォーマット文字列の開始
  • 4$   = 4番目の引数( 'd')
  • 2     = 2つの幅(右揃え)
  • s     =文字列のタイプ

それは本当に鮮明な説明に感謝します。ただし、%4 $ 2sを使用し、引数の値が「ABCDEFGH」の場合、2文字しか取得されません。完全な文字列を取得しました。どうして?
kandarp

49

2$手段は、ここでは、リストから二番目の引数を置きます。$ 次の番号ではなく、それに先行します。同様に、4$ここに4番目の引数を置くことを意味します。

明確にするために、%2$2sフォーマットをその部分に分解することができます。

  • % -これがフォーマット文字列であることを示します

  • 2$ -2番目の値の引数をここに配置する必要があることを示します

  • 2 -フォーマットは2文字の長さです

  • s -値を文字列としてフォーマットします

詳細については、ドキュメントを参照してください。


それが間違った答えだったとき、それは実際に反対票を投じられました。今は正しいので、反対票は削除されました。
Sven Lilienthal

1
@ Sven-答えは決して変わらなかった、私はあなたがそれを間違って読んだに違いないと思う。コンテンツを追加しましたが、変更していません。
Dave Webb

さて、私が反対票を投じたとき、「2 $は、リストの2番目の引数をここに置くことを意味します」と読みました。それは私が正解として数えるものではありません。
Sven Lilienthal

それは今でも正確にそれを言っています、そしてあなたはそれが今正しいと言いました。
Dave Webb

それ自体は間違っているか、少なくとも質問に答えていませんが、文脈に当てはめると、正しいです。
Sven Lilienthal

4

これらは%4$2s4番目の引数を幅2の文字列としてフォーマットする信号を送る位置引数です。これは、ソースコードに触れずに引数を並べ替える必要があるローカリゼーション用の文字列を提供する場合に特に役立ちます。

日付と時刻を表すために使用される型の形式指定子の構文は次のとおりです。

%[argument_index$][flags][width]conversion

オプションargument_indexは、引数リスト内の引数の位置を示す10進整数です。最初の引数は"1$"、によって参照され、2番目の引数は"2$"などによって参照されます。—フォーマッタのドキュメント


それでも、引数の位置がはるかに明確になるため、.NETのフォーマット文字列の方が好きです。
ジョーイ

4

%:フォーマット文字列

4$:4番目の値の引数

2:幅(引数を出力するときの長さ)

s:文字列引数の変換です

たとえば、次のスニペット:

StringBuffer sb=new StringBuffer();

Formatter formatter=new Formatter(sb,Locale.UK);

formatter.format("-%4$5s-%3$5s-%2$5s-%1$5s-", "a", "b", "c", "d");

System.out.println(sb);

の出力を生成します:

-    d-    c-    b-    a-

(引数ごとに5文字の幅、スペースで埋められます)

に置き換える52、次の出力が生成されます。

- d- c- b- a-

違いを見ます?:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.