web-dev-qa-db-ja.com

Java printfは可変フィールドサイズを使用していますか?

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));

しかし、私は少し良い方法があるといいのですが、そうですか?

29
paxdiablo

printfを使用する前に、追加の変数を宣言します。

String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);

(これは私がウェブ検索から見つけた最初の解決策です)

29
user1970914

これは間違いなく「クラッジ」よりも優れているわけではありませんが、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();
}
2
Como

インデックスが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依存文字がないことに注意してください。または '、'が出力に追加されます。

0
matsev

手遅れかもしれないが、他の人のためにここに置く

int width = 5;
int precision = 2;
float f = 12.34567f;
System.out.printf("%"+width+"."+precision+"f%n",f);

Java 1.8でテスト済み

0
Harsh Gundecha