这是我的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”是否会按照我想要的方式均匀分隔输出。
答案 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;
}
我知道不是那么干净,但它应该有用。