Ответ 1
Объявите дополнительную переменную перед использованием printf
:
String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);
(это первое решение, которое я нашел в веб-поиске)
Я просто пытаюсь преобразовать код C в Java, и у меня есть небольшая проблема с String.printf
.
В C, чтобы получить определенную ширину, основанную на переменной, я могу использовать:
printf("Current index = %*d\n", sz, index);
и он будет форматировать целое число в определенном размере на основе sz
.
Попытка:
System.out.println(String.format("Current index = %*d\n", sz, index));
приводит к ошибке, так как ей не нравится *
.
В настоящее время у меня есть следующий kludge:
System.out.println(String.format("Current index = %" + sz + "d\n", index));
но я надеюсь, что там будет немного лучше, да?
Объявите дополнительную переменную перед использованием printf
:
String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);
(это первое решение, которое я нашел в веб-поиске)
Это, возможно, не лучше, чем ваш "kludge", но здесь вы можете встроить вызов в 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();
}
Предполагая, что индекс помещается внутри 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