2

我尝试使用简单的java.util.Formatter类示例。

在我看来,它的工作原理与System.out.printf().

但是我的简单程序显示出意想不到的结果。

smb 能解释一下为什么吗?

预期在field:的单行名称和此 value 的值

代码:

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

4

3 回答 3

2

每次调用 format 时,它都会附加给定的字符串,然后将其附加到 StringBuffer。所以在第一次调用格式化程序将包含

int field: %d\n 

第二次通话后:

int field: 145
long field: 789

等等。

所以最好将格式化程序用作字符串缓冲区,而只是制作字符串:

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);
于 2013-10-09T10:58:44.580 回答
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

于 2013-10-09T10:57:46.233 回答
1

来自 JavaDoc

使用指定的格式字符串和参数将格式化字符串写入此对象的目标。

因此,您将内容附加到格式化程序并一遍又一遍地调用其 toString(),这就是您看到的原因:

  • 附加1:整数
  • 附加2:int,long
  • 附加 3:int、long、float
  • 附加 4:int、long、float、double

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

希望有帮助。

于 2013-10-09T10:59:03.607 回答