2011-12-11 148 views
1

因此,我正在编写一个应该模拟飞机货物的类,并且无法格式化类的toString()方法。下面的代码:格式化字符串

public class Cargo 
{ 
    private String label; 
    private int weight, height, width, length; 

    public String toString() 
    { 
     return String.format("%s%s\t\t%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d", 
       getLabel(), ":", "Weight", "=", getWeight(), "Dimensions", 
       "=", getHeight(), "X", getWidth(), "X", getLength()); 
    } 

    public static void main(String[] args) 
    { 
     Cargo cargo1 = new Cargo("Bill's Beans", 1200, 20, 15, 30); 
     Cargo cargo6 = new Cargo("Chicago Bulls", 1000, 10, 10, 10); 
     Cargo cargo7 = new Cargo("Lots of Meat", 3000, 20, 20, 20); 
     Cargo cargo8 = new Cargo("Tammy's Tomatoes", 600, 6, 6, 6); 

     System.out.println(cargo1.toString()); 
     System.out.println(cargo6.toString()); 
     System.out.println(cargo7.toString()); 
     System.out.println(cargo8.toString()); 
    } 
} 

产生这样的输出:

Bill's Beans:  Weight = 1200 Dimensions = 20 X 15 X 30 
Chicago Bulls:  Weight = 1000 Dimensions = 10 X 10 X 10 
Lots of Meat:  Weight = 3000 Dimensions = 20 X 20 X 20 
Tammy's Tomatoes:  Weight = 600 Dimensions = 6 X 6 X 6 

正如你所看到的,一切良好比对,除了 “陈怡蓉的西红柿。”我怎样才能解决这个问题?谢谢。

+0

%s%s之后的额外选项卡可能适用于您。 – Bhushan

回答

5

除了“Tammy's Tomatoes”之外,它们都很好地对齐,因为您使用的是标签页。 在这种情况下,您的选项卡长度为4个字符。虽然“比尔的豆类:”是13个字符,“芝加哥公牛队:”是14,而“肉的数量:”为13,“塔米的西红柿:”是17

13/4 = 3 
14/4 = 3 
13/4 = 3 
17/4 = 4 

,或者至少这就是程序员认为;)

所以,当你把最后一个标签放在另一个标签上时,它会在剩下的4个字符后开始。

您可以通过调整选项卡的数量来解决此问题,具体取决于公司名称的字符数。

假设您希望尺寸从第4组空间开始。

首先,计算名称将占用的空间量。 除以4(如上所述)。

减去数字7. 所以Tammy的西红柿将是7-4=3。 运行一个循环,将3“\ t”添加到结果中(您想要添加它们的地方)。那么到底

,你的代码应该是这样的:

String result = String.format("%s%s", getLabel(), ":"); 

    int tabs = result.length()/4; 
    int desiredTabs = 7; 
    for(int i = 0; i < desiredTabs-tabs) { 
     result += "\t"; 
    } 
    result += String.format("%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d", 
      "Weight", "=", getWeight(), "Dimensions", 
      "=", getHeight(), "X", getWidth(), "X", getLength()); 
    return result; 

编辑回答问题的评论:

嘛,你不真的需要使用String.format()。您实际上可以只追加变量(例如,result + getWidth())。我刚刚使用String.format(),因为那是你用过的。你可以把它改写为:

String result = String.format("%s%s", getLabel(), ":"); 

    int tabs = result.length()/4; 
    int desiredTabs = 7; 
    for(int i = 0; i < desiredTabs-tabs) { 
     result += "\t"; 
    } 
    result += "Weight = " + getWeight() + " Dimensions = " + getHeight() + " X " + getWidth() + " X " + getLength(); 

    return result; 

简单多了:)

+0

感谢您的帮助,我将它插入到我的程序中,它的功能就像一个魅力! :)顺便说一句,你知道为什么Java使这个看似简单的任务如此复杂吗? – LTH

+0

我编辑了我的答案以回答您的评论。我从来没有使用String.format(),如果我可以帮助它! – eboix

2

我真的建议住从标签了。在某些情况下,程序输出到具有不同选项卡设置的位置,并且根据用于对齐输出的选项卡,在一般情况下会出现一个令人沮丧的前景,这正是您已经遇到的原因。 - 对齐事情取决于知道(或计算)与他们分离的数据的长度。在你的情况下,如果你的标签长度​​超过28个字符,你的计算就会失败。

为什么不使用字段的宽度标志来指定标签的宽度,而不是使用制表符?

另外,就像一个建议,我也发现格式化字符串更容易阅读(并创建!),如果它只是嵌入了常量:

String formatString = "%17s: Weight = %-5d Dimensions = %-2d X %-2d X %-2d"; 
String result = String.format(formatString, getWeight(), getHeight(), getWidth(), getLength()); 

现在,当我看的字符串,它是容易,我分不清哪里我把数据和总的结果将是什么样子,而不是尝试将常量与格式化字符串进行匹配。

无论如何,这是一个选择。

+0

经过进一步的思考,我认为这可能是最明智的做法。谢谢! – LTH