Java格式说明符重复打印输出

时间:2016-05-11 13:53:26

标签: java format

我编写了一个Java程序来打印1到10之间的数字,格式间隔。使用java.util.Formatter,我得不到预期的输出。为什么呢?

预期输出为:

1 2 3 4 5 6 7 8 9 10 
   1   2   3   4   5   6   7   8   9  10

这是我的代码:

import java.util.*;

public class CountTo10 {
    static void formatterFunc() {
        String myString = "";
        Formatter fmt = new Formatter();

        for(int i=1; i<=10; i++) {
            fmt.format("%4d", i);
            myString = myString + fmt;
        }
        System.out.println(myString);
    }

    static void stringFunc() {
        String myString = "";
        for(int i=1; i<=10; i++) {
            myString = myString + i + " ";
        }
        System.out.println(myString);
    }

    public static void main(String args[]) {
        stringFunc();
        System.out.println("\n");
        formatterFunc();
    }
}

1 个答案:

答案 0 :(得分:0)

java.util.Formatter的一些构造函数将Appendable作为参数。但是根据Java API docs默认构造函数(您正在使用的)使用StringBuilder。 (StringBuilder实施Appendable

  

格式化输出的目标是StringBuilder ...

因此,每次拨打fmt.format()时,您每次都会追加相同的StringBuilder

您的修复选择是:

  1. 使用String连接进行分配,并仅使用Formatter

    static void formatterFunc() {
        try(Formatter fmt = new Formatter()) {  // Formatter should also be properly closed
            for(int i=1; i<=10; i++) {
                fmt.format("%4d", i);
            }
            System.out.println(fmt);
        }
    }
    
  2. 每次使用新的Formatter

    static void formatterFunc() {
        String myString = "";
        for(int i=1; i<=10; i++) {
            myString = myString + new Formatter().format("%4d", i); // But needs closing strictly speaking
        }
        System.out.println(myString);
    }
    
  3. 提供您自己的Appendable

    static void formatterFunc() {
        StringBuilder sb = new StringBuilder();
        try(Formatter fmt = new Formatter(sb)) {  // Formatter should be properly closed
            for(int i=1; i<=10; i++) {
                fmt.format("%4d", i);
            }
        }
        System.out.println(sb.toString()); // We can print this even after Formatter has been closed
    }