1

这是我的 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

我的问题是:有没有办法在 return 语句中放置特定附加的 \t 选项卡?

例如,与姓氏相比,工作时间比名字更远。

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

4

2 回答 2

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模板字符串,但我发现仅使用带有格式说明符的数字更合乎逻辑且更安全。如果单个属性的字符串长度存在显着差异,则选项卡可能会失败。这些数字甚至可以是保存数字的变量,然后将其转换为模板字符串中的字符串表示形式。

代码和数字只是一个粗略的估计,必须改变,但希望你能明白。


编辑
您在评论中声明:

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

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

例如:

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
于 2013-09-11T00:27:51.700 回答
0

我会这样做只是连接选项卡,所以它会是这样的:

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

    return sb;
}

我知道不是那么干净,但它应该可以工作。

于 2013-09-11T00:33:26.173 回答