使用变量字段大小?

问题描述 投票:0回答:4
中遇到了一些麻烦。 Cin C,为了根据变量获得特定的宽度,我可以使用:

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

它将将整数格式化为基于

sz

的特定尺寸。 trying:
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);

java string formatting printf
4个回答
34
投票

可以说,这可以说是您的“ kludge”,但是这是您可以嵌入到to

printf
呼叫中的方法,可以将宽度代替您传递给它的星号。它的结果用作真实格式。
例如,请考虑以下电话:

System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);


2
投票

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

0
投票

注意,通过不使用

Format

或其任何子类别,没有诸如'',''的tepent faction字符。或“,”添加到输出中。

或他们可以修复Java。
我旧的C程序员只是学习Java(使用NetBeans IDE 23)。

我正在使用的教科书指定printf()放入Java中,以使将C代码移到Java中更加容易。 因此,我第一次尝试使用printf而不是println的尝试是:

System.out.printf(“%*s”,11,mylabel);

试图处理“*”宽度指定器的运行时间异常。
我在网上找到的每条Java参考都提供了类似于我的代码的一些例子。
不提到必须将其kludge,将字符设置转换为宽或UTF-8,或编写一种花式方法将指定格式转换为格式字符串,该格式将欺骗解析器做应做的事情。  抱歉,Java printf格式解析器被打破了。  他们知道他们正在抛出一个例外,因为他们找到了一个“*”,将其作为宽度指定器进行处理有多困难? C至少在1988年之前就已经弄清楚了(参见K&R第二版)。现在是2025年。Java需要解决此问题。
    


0
投票

Locale

在Java1.8

中进行测试

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.