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

导致错误,因为它不喜欢*

我目前有以下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依赖字符。 或’,’添加到输出中。