为什么值不能在Java中正确对齐?

时间:2019-09-25 15:03:14

标签: java printf padding right-align

我正在尝试用Java生成一个输出表,第二列的值恰好彼此对齐。相反,我将值“推”到了右边,即使String不与填充重叠。我知道它是一个相当长的String,但是它只有27,并且padding指定为30,所以它不应该只填写最后三个空格并在那里打印出来而不是跳到右边吗?

我尝试将所有填充值更改为1,将所有填充值更改为15,但是它们仍然没有对齐。当我更改其填充值以匹配时,价格会移动,但不会与其他行对齐。

我想我可以给它们加上不同的数字,但是我希望它与30个字符以下的任意大小的String正确对齐。将价格长度从17.46更改为0.0似乎也无济于事。

为了使它起作用,我必须将其完全切成“ 2 Medium Red Roaste”,在“ 2 Medium Red Roasted”处它开始转移。因此它可以以19个字符正常工作,但不能以20个字符工作。

System.out.printf ("%d %-13s%30.2f%n",2,"Medium Roasted Red Pepper",17.46);
System.out.printf ("%d %-13s%30.2f%n",1, "Large Cheese" ,7.69);
System.out.printf ("%-13s %30.2f%n","Tax" , 1.76);
System.out.printf ("%-13s %30.2f%n","Delivery" , 2.69);
System.out.printf ("%-13s %30.2f%n","Total" , 29.61);

我一直得到这个作为输出:

2 Medium Roasted Red Pepper___________________________17.46
1 Large Cheese___________________________7.69
Tax_____________________________________1.76
Delivery________________________________2.69
Total__________________________________29.61

我期望如此:

2 Medium Roasted Red Pepper_____________17.46
1 Large Cheese__________________________7.69
Tax____________________________________1.76
Delivery________________________________2.69
Total__________________________________29.61

(所有数字都在右边排列)

1 个答案:

答案 0 :(得分:0)

您的代码未按预期对齐,因为负宽度表示该字段为minimum width。如果字段的宽度大于指定的宽度,它将使用所需的空间。 (一个丑陋的表可能比值被截断的误导性表要好。)

要正确对齐,您需要针对要显示的最大项目进行调整。您也不能为此使用价格列的宽度,%30.2f表示始终显示小数点前30位(有余数)。您应该在此处对列的宽度做出合理的猜测,或者检查所需的最大长度。

public class RightAligned {
    public static void main(String[] args){
        String[] items = new String[] {
            "some really long item that extends far to the right",
            "short item",
            "medium longish item",
        };

        int longest = 0;
        for (String item : items) {
            if (longest < item.length()) {
                longest = item.length();
            }
        }

        String formatString = "%-" + longest + "s %5.2f%n";
        for (String item : items) {
            System.out.printf(formatString, item, 123.45);
        }
    }
}