toString使用StringBuilder覆盖使用特定Tab键的格式

时间:2013-09-11 00:25:05

标签: java formatting tostring

这是我的Java编码尝试覆盖toString以整齐地格式化输出。

@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(getEmpID())
.append(getLastName())
.append(getFirstName())
.append(getHours())
.append(getRate())
.append(getGross());

return String.format("%-58", sb.toString());

以下是输出结果:

42345 Bruch      Max             40.00    21.50 $  860.00 

23456 Elgar      Eddie           43.00    20.00 $  890.00 

34567 Bach       John            30.00    30.00 $  900.00 

12345 Wagner     Rick            41.00    30.00 $ 1245.00 

88888 Mozart     Wolfie          36.00    40.00 $ 1440.00 

65432 Chopin     Fred            45.00    23.25 $ 1104.38 

72345 Strauss    Butch           50.00    25.00 $ 1375.00

我的问题是:有没有办法在退货声明中添加特定追加的\ t标签?

例如,与姓氏相比,工作时间比第一个名称标签更远。

我不确定“%-58”是否会按照我想要的方式均匀分隔输出。

2 个答案:

答案 0 :(得分:2)

我将StringBuilder包装在Formatter中,并使用格式String一次性添加所有字段。

例如......

@Override
public String toString() {
  StringBuilder stringBuilder = new StringBuilder();
  Formatter formatter = new Formatter(stringBuilder);

  String template = "%-7s %-15s %-15s %-35.2f %-5.2f $ %-8.2f"; // a rough guess!
  formatter.format(template, getEmpID(), getLastName(), getFirstName(), 
            getHours(), getRate(), getGross());
  return stringBuilder.toString();
}

您也可以将\t放在模板字符串中,但我发现它更符合逻辑且更安全,只使用带格式说明符的数字。如果单个属性的字符串长度存在显着差异,则制表符可能会失败。这些数字甚至可以是包含数字的变量,然后在模板String中将其转换为String表示。

代码和数字只是一个粗略的估计,必须改变,但希望你能得到这个想法。


修改
您在评论中说明:

  

这个看起来几乎适用于所有类别的任何长度,但是你能解释一下Formatter在做什么吗?它只是在我的return语句中替换String.format调用吗?

是的,实际上String.format(...)可能在幕后使用java.util.Formatter对象。请查看API以获取详细信息。通过使用单个模板String将所有数据收集在一起,您可以为每个属性提供自己的格式大小,精度和说明符。

例如:

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;

public class FormatExample {
   public static void main(String[] args) {
      List<FormatExData> data = new ArrayList<>();
      data.add(new FormatExData("42345", "Max", "Bruch", 40, 21.5));
      data.add(new FormatExData("23456", "Eddie", "Elgar", 43, 20));
      data.add(new FormatExData("1111", "John", "Bach", 30, 30));
      data.add(new FormatExData("00001", "Donald", "Duck", 50, 40));
      data.add(new FormatExData("99999", "Mickey", "Mouse", 20, 15));
      data.add(new FormatExData("666", "Satan", "Mephistopheles", 100, 100));

      for (FormatExData datum : data) {
         System.out.println(datum);
      }
   }
}

class FormatExData {
   private String id;
   private String firstName;
   private String lastName;
   private double hours;
   private double rate;

   public FormatExData(String id, String firstName, String lastName,
         double hours, double rate) {
      this.id = id;
      this.firstName = firstName;
      this.lastName = lastName;
      this.hours = hours;
      this.rate = rate;
   }

   public String getId() {
      return id;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }

   public double getHours() {
      return hours;
   }

   public double getRate() {
      return rate;
   }

   public double getGross() {
      return hours * rate;
   }

   @Override
   public String toString() {
      NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
      StringBuilder stringBuilder = new StringBuilder();
      Formatter formatter = new Formatter(stringBuilder);
      String template = "%-7s %-15s %-10s %10.2f %10.2f %11s";
      formatter.format(template, getId(), getLastName(), getFirstName(),
            getHours(), getRate(), currencyFormat.format(getGross()));
      formatter.close();
      return stringBuilder.toString();
   }

}

哪会回来:

42345   Bruch           Max             40.00      21.50     $860.00
23456   Elgar           Eddie           43.00      20.00     $860.00
1111    Bach            John            30.00      30.00     $900.00
00001   Duck            Donald          50.00      40.00   $2,000.00
99999   Mouse           Mickey          20.00      15.00     $300.00
666     Mephistopheles  Satan          100.00     100.00  $10,000.00

答案 1 :(得分:0)

我会这样做只是连接标签,所以它会是这样的:

@Override
public String toString(){
    String sb = getEmpID() + "\t" + getLastName() + "\t\t" +
                getFirstName() + "\t\t\t" + getHours() + "\t" +
                getRate() + "\t" + getGross());

    return sb;
}

我知道不是那么干净,但它应该有用。