我會將StringBuilder包裝在格式化程序中,並使用格式字符串一次添加所有字段。
例如...
@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
模板中的字符串爲好,但我覺得它更符合邏輯和安全只使用數字與格式說明。如果單個屬性的字符串長度存在重大變化,則製表可能會失敗。這些數字甚至可以是包含數字的變量,然後將這些數字轉換爲模板字符串中的字符串表示形式。
代碼和數字只是一個粗略的估計,將不得不改變,但希望你明白了。
編輯
幽州的評論:
這一個看起來像它會在所有類別的進入幾乎任何長度的工作,但是你能不能給我解釋一下格式化是什麼在做什麼?它只是在我的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
你試過在每個追加之間追加(「\ t」)嗎? –
哪個施特勞斯是「布奇」? – ajb
@ajb:別告訴我你不知道施特勞斯?他是理查德的鄉下兄弟。 –