CコードをJavaに変換しようとしていますが、String.printf
で少し問題が発生しています。
Cでは、変数に基づいて特定の幅を取得するには、次を使用できます。
printf("Current index = %*d\n", sz, index);
sz
に基づいて特定のサイズになるように整数をフォーマットします。
試してみる:
System.out.println(String.format("Current index = %*d\n", sz, index));
*
が気に入らないため、エラーが発生します。
私は現在次のような汚物を持っています:
System.out.println(String.format("Current index = %" + sz + "d\n", index));
しかし、私は少し良い方法があるといいのですが、そうですか?
printf
を使用する前に、追加の変数を宣言します。
String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);
(これは私がウェブ検索から見つけた最初の解決策です)
これは間違いなく「クラッジ」よりも優れているわけではありませんが、printf
の呼び出しに埋め込むことができるメソッドは、渡すアスタリスクの代わりに幅を使用します。その結果が実際の形式として使用されます。たとえば、次の呼び出しを考えてみます。
System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);
埋め込み関数を使用して、1番目と3番目の幅を置き換えます。
System.out.printf( wf("%0*d %2s %-*d;%n", 4, 7), 65, "a", 6);
そしてここにコードがあります:
public static String wf(String fmt, int... widths) {
return metaWidthFormat('*', fmt, widths);
}
public static String metaWidthFormat(char wmeta, String fmt, int ... widths) {
if (fmt == null) return null;
int wix = 0;
boolean outside = true;
// initial capacity is sufficient for each substituted width to be 2 digs
StringBuilder result = new StringBuilder(fmt.length() + widths.length);
for (char ch : fmt.toCharArray()) {
if (outside) {
result.append(ch);
outside = (ch != '%');
} else {
if (ch == wmeta) {
result.append(widths[wix++]);
} else {
result.append(ch);
}
outside = (ch == wmeta) || (ch == '%') || Character.isAlphabetic(ch);
}
}
return result.toString();
}
インデックスがsz内に収まると仮定すると、次のようなことができます。
char[] temp = new char[sz];
Arrays.fill(temp, '0');
DecimalFormat df = new DecimalFormat(new String(temp));
System.out.println(String.format("Current index = %s\n", df.format(index)));
Format
またはそのサブクラスを使用しないことにより、 ''、 '。'のようなLocale
依存文字がないことに注意してください。または '、'が出力に追加されます。
手遅れかもしれないが、他の人のためにここに置く
int width = 5;
int precision = 2;
float f = 12.34567f;
System.out.printf("%"+width+"."+precision+"f%n",f);
Java 1.8でテスト済み