Java 格式化程序-显示奇怪的输出

Java 格式化程序-显示奇怪的输出,java,output,formatter,Java,Output,Formatter,我尝试使用java.util.Formatter类的简单示例 在我看来,它的工作原理与System.out.printf()完全相同 但是我的easy程序显示了意想不到的结果 中小企业能否解释原因 应为字段名的单行处,以及该值的值 代码: 输出: 为什么我们可以在这里看到重复的线条,其中一些是不正确的 有什么问题以及如何正确使用格式化程序?试试看 package com.linkage.test; import java.util.Formatter; import java.util.Loc

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

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

但是我的easy程序显示了意想不到的结果

中小企业能否解释原因

应为字段名的单行处,以及该值的

代码:

输出:

为什么我们可以在这里看到重复的线条,其中一些是不正确的

有什么问题以及如何正确使用
格式化程序

试试看

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();
    }
}
试试看

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();
    }
}

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

int field: %d\n 
第二次呼叫后:

int field: 145
long field: 789
等等

因此,最好将formatter用作字符串缓冲区,并使用just to make to 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);

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

int field: %d\n 
第二次呼叫后:

int field: 145
long field: 789
等等

因此,最好将formatter用作字符串缓冲区,并使用just to make to 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);
来自JavaDoc

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

因此,您将内容附加到格式化程序,并一次又一次地调用其toString(),这就是为什么您会看到:

  • 附加1:int
  • 附加2:int,long
  • 附加3:int、long、float
  • 附加4: int、long、float、double
您应该做的是将StringBuilder作为参数传递给格式化程序,然后在最后打印StringBuilder

希望有帮助。

来自JavaDoc

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

因此,您将内容附加到格式化程序,并一次又一次地调用其toString(),这就是为什么您会看到:

  • 附加1:int
  • 附加2:int,long
  • 附加3:int、long、float
  • 附加4: int、long、float、double
您应该做的是将StringBuilder作为参数传递给格式化程序,然后在最后打印StringBuilder


希望能有所帮助。

更好的方法是使用
sb.append(新的格式化程序(Locale.US).format(“int字段:%d\n”,i))用于每个字段。更好的方法是使用
sb.append(新格式化程序(Locale.US).format(“int字段:%d\n”,i))针对每个字段。