Formatter - 显示奇怪的输出

时间:2013-10-09 10:44:38

标签: java output formatter

我尝试使用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

3 个答案:

答案 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(),这就是您看到的原因:

  • 追加1:int
  • 追加2:int,long
  • 追加3:int,long,float
  • 附加4: int,long,float,double

你应该做的是将StringBuilder作为参数传递给Formatter,然后在最后打印StringBuilder。

希望有所帮助。