无法使printf正确对齐

时间:2018-01-23 04:23:31

标签: java

我正在编写一种方法来打印我预先计算的值表。在表格的最后,我打印了一行

Sum of Deposits:   $XXXX.XX
End of Year Total: $XXXX.XX

我的代码如下:

System.out.println("");
System.out.printf("%1$-10s $%2$-10.2f", "Sum of Deposits: ", (monthsToPay * monthDep));
System.out.println("");
System.out.printf("%1$-10s $%2$-10.2f", "End of Year Total: ", allDepTotal);

不幸的是,代替对齐以使数字在彼此之上(正确的列),填充格式似乎没有做任何事情。我可以把它改成

System.out.println("");
System.out.printf("%1$-10s $%2$-15.2f", "Sum of Deposits: ", (monthsToPay * monthDep));
System.out.println("");
System.out.printf("%1$-10s $%2$-15.2f", "End of Year Total: ", allDepTotal);

并且间距/格式不会改变。我究竟做错了什么?我已经尝试了所有我能想到的故障排除

3 个答案:

答案 0 :(得分:0)

有两种格式是密钥:一种用于前面的字符串,另一种用于值。

"%-20.20s"允许您根据需要格式化String,您只想将20更改为要将字符串格式化为的长度。前20个字符串定义为20的最小长度;如果它不符合这个,它将用空格填充String。第二个20将字符串的最大长度定义为20.如果不满足此值,它将从右侧开始截断字符串。前面的' - '表示填充右边的空格,给出左对齐的效果。

"%07.2f允许您根据需要格式化浮点数。 .2表示适合2位小数,如果需要填充0。 “07”部分适合数字的整个部分到4位小数。它基本上表示字符串的最小长度为7,但是因为你有2个小数位和一个小数点,这意味着数字的整个部分的最小长度是4.前面的0如果整个部分小于0则附加0 1000.但是,这并没有设置上限,但如果要强制执行此限制,可以通过获取浮点数的模数来轻松实现。

虽然删除数字的较低分辨率是可以接受的,但不建议强制执行上限,因为您丢失非常重要信息;特别是在金融领域。

System.out.printf("%-20.20s $%07.2f", "Sum of Deposits: ", 10.02 % 1000);
System.out.println("");
System.out.printf("%-20.20s $%07.2f", "End of Year Totals: ", 12300.02 % 1000);

答案 1 :(得分:0)

格式为%2$-10.2f的减号会导致您的数字左对齐。更改宽度只会在数字之后打印更多空白,因此没有任何视觉差异。

只需使用%210.2f(不使用减号)即可获得右对齐。阅读所有相关内容here

答案 2 :(得分:0)

尝试:

   System.out.println("");
   System.out.printf("%1$-19s $%2$10.2f", "Sum of Deposits: ", (monthsToPay * monthDep));
   System.out.println("");
   System.out.printf("%1$-19s $%2$10.2f", "End of Year Total: ", allDepTotal);

第二个字面是19个字符宽。 - 标志意味着左对齐,而不是你想要的数字。您可能打算使用+。

我建议你看一下the formatter specification