Java printf, используя переменный размер поля? - PullRequest
27 голосов
/ 31 марта 2010

Я просто пытаюсь преобразовать код 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));

но я надеюсь, что есть немного лучший способ, да?

Ответы [ 3 ]

28 голосов
/ 11 января 2013

Объявите дополнительную переменную перед использованием printf:

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

(это первое решение, которое я нашел из веб-поиска)

2 голосов
/ 29 июня 2014

Возможно, это не лучше, чем ваш "ключ", но вот метод, который вы можете встроить в вызов printf, который заменит ширину для звездочек, которые вы ему передаете. Его результат используется в качестве реального формата. Например, рассмотрим этот вызов:

System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);

Я заменю первую и третью ширину с помощью встроенной функции:

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();
}
0 голосов
/ 31 марта 2010

Предполагая, что индекс соответствует sz, вы можете сделать что-то вроде:

<code>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 зависимых символов, таких как '', '.' или ',' добавлено к выводу.

...