Возможно, это не лучше, чем ваш "ключ", но вот метод, который вы можете встроить в вызов 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();
}