1

toString をオーバーライドして出力を適切にフォーマットする Java コーディングの試みを次に示します。

@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 でラップし、format 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();
}

テンプレート String を入れることもできますが、形式指定子で数値を使用する\t方がより論理的で安全だと思います。1 つのプロパティの文字列の長さに大きな違いがある場合、タブは失敗する可能性があります。これらの数値は、テンプレート文字列の文字列表現に変換される数値を保持する変数にすることもできます。

コードと数値は大まかな見積もりであり、変更する必要がありますが、うまくいけばアイデアが得られます.



コメントであなたの状態を編集します:

これは、すべてのカテゴリのほぼすべての長さのエントリで機能するように見えますが、フォーマッターが何をしているのか説明していただけますか? 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 に答える