我尝试使用java.util.Formatter
类的简单示例。
在我看来,它与System.out.printf()
完全相同。
但我的简单程序显示出意想不到的结果。
可以解释为什么?
预计单行 字段名称: 和 此值的值 。
的代码: 的
class DataHolder {
int i=145;
long l = 789L;
float f = 78.8F;
double d = 34.9;
public String toString() {
StringBuilder sb = new StringBuilder("DataHolder class: \n\n");
Formatter formatter = new Formatter(Locale.US);
sb.append(formatter.format("int field: %d\n", i));
sb.append(formatter.format("long field: %d\n", l));
sb.append(formatter.format("float field: %f\n", f));
sb.append(formatter.format("double field: %f\n", d));
return sb.toString();
}
}
public class Test {
public static void main(String[] args) {
System.out.println(new DataHolder());
}
}
的输出: 的
DataHolder class:
int field: 145
int field: 145
long field: 789
int field: 145
long field: 789
float field: 78.800003
int field: 145
long field: 789
float field: 78.800003
double field: 34.900000
为什么我们可以在这里看到重复的行,其中一些不正确。
有什么问题以及如何正确使用Formatter
?
答案 0 :(得分:2)
每次调用format时,它会附加给定的字符串,然后将其附加到StringBuffer。所以在第一次调用格式化程序后会包含
int field: %d\n
第二次电话后:
int field: 145
long field: 789
等等。
因此,最好将格式化程序用作String缓冲区,并将其用于字符串:
formatter.format("int field: %d\n", i);
formatter.format("long field: %d\n", l);
formatter.format("float field: %f\n", f);
formatter.format("double field: %f\n", d);
答案 1 :(得分:1)
试
package com.linkage.test;
import java.util.Formatter;
import java.util.Locale;
class DataHolder {
int i = 145;
long l = 789L;
float f = 78.8F;
double d = 34.9;
public String toString() {
StringBuilder sb = new StringBuilder("DataHolder class: \n\n");
Formatter formatter = new Formatter(Locale.US);
sb.append(formatter.format("int field: %d\n", i));
//this new object Formatter
formatter = new Formatter(Locale.US);
sb.append(formatter.format("long field: %d\n", l));
//this new object Formatter
formatter = new Formatter(Locale.US);
sb.append(formatter.format("float field: %f\n", f));
//this new object Formatter
formatter = new Formatter(Locale.US);
sb.append(formatter.format("double field: %f\n", d));
return sb.toString();
}
}
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
答案 2 :(得分:1)
来自JavaDoc
使用指定的格式字符串和参数将格式化字符串写入此对象的目标。
因此,您将内容附加到格式化程序并反复调用其toString(),这就是您看到的原因:
你应该做的是将StringBuilder作为参数传递给Formatter,然后在最后打印StringBuilder。
希望有所帮助。