Java printf using variable field size?

后端 未结 4 1706
南方客
南方客 2020-11-29 06:49

I\'m just trying to convert some C code over to Java and I\'m having a little trouble with String.printf.

In C, to get a specific width based on a varia

相关标签:
4条回答
  • 2020-11-29 07:00

    This is arguably no better than your "kludge", but here's a method you can embed into the call to printf that will substitute widths for the asterisks that you pass to it. Its result is used as the real format. For example, consider this call:

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

    I will replace the first and third widths via an embedded function:

    System.out.printf( wf("%0*d %2s %-*d;%n", 4, 7), 65, "a", 6);
    

    And here's the code:

    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();
    }
    
    0 讨论(0)
  • 2020-11-29 07:11

    Declare an extra variable before using printf:

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

    (this is the first solution I found from a web search)

    0 讨论(0)
  • 2020-11-29 07:11

    Presuming that index fits inside sz you can do something like:

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

    Note, by not using Format or any of its subclasses, there is no Locale dependent characters like ' ', '.' or ',' added to the output.

    0 讨论(0)
  • 2020-11-29 07:19

    maybe it's too late but putting it here for others

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

    tested in java 1.8

    0 讨论(0)
提交回复
热议问题