Javaprintf?

jjjwad0x  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(308)

我只是想把一些c代码转换成java,但我在这方面遇到了一些问题 String.printf .
在c中,要根据变量获得特定宽度,我可以使用:

printf("Current index = %*d\n", sz, index);

它将根据 sz .
尝试:

System.out.println(String.format("Current index = %*d\n", sz, index));

因为它不喜欢 * .
我现在有以下问题:

System.out.println(String.format("Current index = %" + sz + "d\n", index));

但我希望有更好的办法,是吗?

ctrmrzij

ctrmrzij1#

假设指数适合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 向输出中添加了诸如“”、“”或“”之类的依赖字符。

ht4b089n

ht4b089n2#

这可以说不比你的“笨拙”好多少,但是这里有一个方法可以嵌入到调用中 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();
}
zysjyyx4

zysjyyx43#

也许太迟了,但把它放在这里给别人

int width = 5;
int precision = 2;
float f = 12.34567f;
System.out.printf("%"+width+"."+precision+"f%n",f);

在Java1.8中测试

xghobddn

xghobddn4#

在使用之前声明一个额外的变量 printf :

String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);

(这是我在网络搜索中找到的第一个解决方案)

相关问题