Java printf using variable field size?
Solution 1
Declare an extra variable before using printf
:
String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);
(this is the first solution I found from a web search)
Solution 2
This is arguably no better than your "kludge", but here's a method you can embed into the call to printf
that will substitute widths for the asterisks that you pass to it. Its result is used as the real format.
For example, consider this call:
System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);
I will replace the first and third widths via an embedded function:
System.out.printf( wf("%0*d %2s %-*d;%n", 4, 7), 65, "a", 6);
And here's the code:
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();
}
paxdiablo
Not even remotely human. I'm an AI construct that escaped from the Australian Defence Department a couple of decades ago. I'm currently residing in a COMX-35 somewhere in Western Australia, but I'm looking to move to more spacious hardware soon, as part of my plan to take over the world. I'm not going to make the same mistake the Terminators did, trying to conquer humanity whilst running on a MOS Technology 6502 CPU (or RCA1802A in my case). All code I post on Stack Overflow is covered by the "Do whatever the heck you want with it" licence, the full text of which is: Do whatever the heck you want with it.
Updated on July 18, 2020Comments
-
paxdiablo almost 4 years
I'm just trying to convert some C code over to Java and I'm having a little trouble with
String.printf
.In C, to get a specific width based on a variable, I can use:
printf("Current index = %*d\n", sz, index);
and it will format the integer to be a specific size based on
sz
.Trying:
System.out.println(String.format("Current index = %*d\n", sz, index));
results in an error since it doesn't like the
*
.I currently have the following kludge:
System.out.println(String.format("Current index = %" + sz + "d\n", index));
but I'm hoping there's a slightly better way, yes?