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
依赖字符。 或’,’添加到输出中。
- API或代码:Hibernate 3和4之间的区别?
- 流状态计算:累积总和
- 在Java中,如果子类使用实例子变量隐藏静态父变量,哪个变量将inheritance方法使用?
- 我该如何解决? KnapSack – 值全部相同,但每个其他对象有三个权重
- Hibernate使用自定义修订实体
- 每次更改时自动更新jTextFields的总和(Java)
- Spring MVC Apache Oltu和Salesforce Integration示例OAUTH_APPROVAL_ERROR_GENERIC:身份validation期间发生了意外错误
- 如何在Java中将字符串转换为hex
- 直接从URL读取并写入文件 – Java