我编写了一个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();
}
}
答案 0 :(得分:0)
java.util.Formatter
的一些构造函数将Appendable
作为参数。但是根据Java API docs默认构造函数(您正在使用的)使用StringBuilder
。 (StringBuilder
实施Appendable
)
格式化输出的目标是StringBuilder ...
因此,每次拨打fmt.format()
时,您每次都会追加相同的StringBuilder
。
您的修复选择是:
使用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);
}
}
每次使用新的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);
}
提供您自己的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
}