Java将字符串中的文本对齐到最左边/开始和最右边/结束并在中间留出空间

Posted

技术标签:

【中文标题】Java将字符串中的文本对齐到最左边/开始和最右边/结束并在中间留出空间【英文标题】:Java Justify text in string to far left/start and far right/end and leave space in the middle 【发布时间】:2022-01-20 08:49:25 【问题描述】:

我在 java 中有一个字符串,我正在打印,并且有标题和金额,例如下面


Rice Ksh 150
Cooking Oil Ksh 200
Skinless White Meat Ksh 450
Honey Ksh 270
Cottage Cheese Ksh 539

我打印时想要达到的效果如下所示


Rice                Ksh 150
Cooking Oil         Ksh 200
Skinless White Meat Ksh 450
Honey               Ksh 270
Cottage Cheese      Ksh 539

下面是我尝试过但它不起作用的另一个函数,我可以使用另一个函数来使输出合理,其中项目的标题在最左边/开始并且数量在最右边/结束


for (Receipt receipt : receiptList) 


        String output = "";

        String itemAmount = String.format("%s %s %s", receipt.getItem(),
                    "Ksh", receipt.getAmount());

        for (int i = 0; i < itemAmount.length(); i++)
            char c = itemAmount.charAt(i);
            if (c==' ')
                output += " ";
            else 
                output += "" + c;
            
        

        // print output here



【问题讨论】:

您可以找到收据的最大长度。并用它来计算其他人的空间。 @MasterYi 你有示例代码吗 这个低效的复制循环有什么意义?之后,output 包含与itemAmount 完全相同的内容。无论如何,当您使用String.format 时,让它发挥作用,例如String output = String.format("%-20s Ksh%5s", receipt.getItem(), receipt.getAmount());。当您的“此处打印输出”意味着打印到控制台/响应时。 stdout,您可以使用System.out.printf("%-20s Ksh%5s%n", receipt.getItem(), receipt.getAmount()); 一次性格式化和打印。 @Holger 我正在使用硬拷贝打印机打印,这就是为什么我希望它们被安排好 我从来没有问过你为什么要格式化输出。我问你为什么添加了一个完全没有任何效果的毫无意义的复制循环。 【参考方案1】:
    List<Receipt> receiptList = asList(
            new Receipt("Rice Ksh", 150),
            new Receipt("Skinless White Meat Ksh", 150),
            new Receipt("Cottage Cheese Ksh", 150));
    int maxSize = 0;
    for (Receipt receipt : receiptList) 
        if(receipt.getItem().length()>maxSize)
            maxSize = receipt.getItem().length();
    
    for (Receipt receipt : receiptList) 
        int spaces = maxSize+1 - receipt.item.length();
        String s = String.format("%1$"+spaces+"s", "");
        System.out.println(receipt.item.substring(0,receipt.item.length()-3) + s + " KSH " + receipt.amount );
    

输出:

Rice                  KSH 150
Skinless White Meat   KSH 150
Cottage Cheese        KSH 150

性能日志(n)。

【讨论】:

这个是修剪项目标题,特别是如果它们很长【参考方案2】:

我会使用System.out.printf 并指定每列的宽度。

例子:

String[] item = "Rice", "Cooking Oil", "Skinless White Meat", "Honey", "Cottage Cheese";
int[] amount = 150,200,450,270,539;
        
for(int i=0; i<item.length; i++)
  System.out.printf("%-20s%4s%4d\n", item[i],"Ksh", amount[i]);

输出:

Rice                 Ksh 150
Cooking Oil          Ksh 200
Skinless White Meat  Ksh 450
Honey                Ksh 270
Cottage Cheese       Ksh 539

【讨论】:

以上是关于Java将字符串中的文本对齐到最左边/开始和最右边/结束并在中间留出空间的主要内容,如果未能解决你的问题,请参考以下文章

无边框的表格行(包括最左边和最右边)

Flutter:如何将 DropdownButton 菜单图标对齐到最右边?

#417(div2) B - Sagheer, the Hausmeister

如何对齐除一个导航栏项目以外的所有项目,从左边距开始,固定组合的最小和最大宽度,但最后一个项目发送到右边距?

是否可以在字符串中间更改文本对齐方式?

微信小程序移动到最右边属性