java-打印格式宽度

时间:2018-09-25 20:25:25

标签: java formatting printf

今天,我了解到我无法正确格式化输出以挽救生命。我一直在努力打印两个字符串和一个这样的整数。

Account holder   Social security number
Steve jensen                 XXXXXXXXX
Mary Chapman                 XXXXXXXXX
Steve Zappa                  XXXXXXXXX
Frank Vai                    XXXXXXXXX
Yuzo Shimomura               XXXXXXXXX

这甚至可能吗?通过左对齐这样的姓氏和右对齐这样的数字,我得到了更好的结果

ps.printf("%s %-12s",bankarray[count].getFirst(),bankarray[count].getLast());
ps.printf("%17d",bankarray[count].getSoNumber());

但这只是让我到目前为止。

Account holder   Social security number
Steve jensen         XXXXXXXXX
Mary Chapman        XXXXXXXXX
Steve Zappa          XXXXXXXXX
Frank Vai            XXXXXXXXX
Yuzo Shimomura      XXXXXXXXX

必须有一种我看不到的清晰方法。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题

问题在于%s %-12s中的填充仅填充最后一个属性(bankarray[count].getLast())。如果您进行测试,请执行以下代码,即使字符串的长度不同,它也会为您提供正确对齐的文本。

代码

System.out.printf("%s %-12s", "Firstname", "Last");
System.out.printf("%17d%n", 123456789);
System.out.printf("%s %-12s", "Firstname", "Lastname");
System.out.printf("%17d%n", 123456789);

输出

Firstname Last                123456789
Firstname Lastname            123456789

但是,由于没有填充第一个属性,以下内容会使其混乱。

代码

    System.out.printf("%s %-12s", "First", "Lastname");
    System.out.printf("%17d%n", 123456789);
    System.out.printf("%s %-12s", "Firstname", "Lastname");
    System.out.printf("%17d%n", 123456789);

输出

First Lastname            123456789
Firstname Lastname            123456789

解决方案

我不确定是否可以同时使用printf填充2个字符串,因此我建议在bankarray[count].getFirst()语句之外将bankarray[count].getLast()printf连接起来。

String name = String.format("%s %s", bankarray[count].getFirst(), bankarray[count].getLast());

ps.printf("%s-12s", name);
ps.printf("%17d", bankarray[count].getSoNumber());

额外:填充卡号

如果要填充名称,则无需填充卡号,因为这只会将卡号推离上一个填充垫结束的位置。这应该足够了(和同一件事):

String name = String.format("%s %s", bankarray[count].getFirst(), bankarray[count].getLast());

// Added 12+17=29 as padding
ps.printf("%s-29s", name);
// Removed padding enteirely
ps.printf("%d", bankarray[count].getSoNumber());