代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

使用变量字段大小的JavaPrimTf?

  •  27
  • paxdiablo  · 技术社区  · 15 年前

    我只是想把一些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));
    

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

    3 回复  |  直到 7 年前
        1
  •  27
  •   TooTone    11 年前

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

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

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

        2
  •  2
  •   kevinarpe Dario Hamidi    7 年前

    可以说,这并不比您的“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();
    }
    
        3
  •  0
  •   matsev    15 年前

    假设索引符合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 在输出中添加了诸如“”、“.”或“”之类的从属字符。