我会将 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