格式化字符串

时间:2011-12-11 23:18:59

标签: java

所以我正在编写一个应该为飞机货物建模的类,我在格式化类的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

正如你所看到的,除了“Tammy's Tomatoes”之外,一切都很好。我怎样才能解决这个问题?感谢。

2 个答案:

答案 0 :(得分:5)

除了“Tammy's Tomatoes”之外,它们都很好地对齐,因为你正在使用标签。 在这种情况下,您的标签长度​​为4个字符。虽然“Bill's Beans:”是13个字符,“Chicago Bulls:”是14,而“很多肉:”是13,“Tammy's Tomatoes:”是17。

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

或者至少那是程序员的想法;)

因此,当您在最后一个选项卡上放置另一个选项卡时,它会在其余选项卡后启动4个字符。

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

假设您希望尺寸从第7组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;

更简单:)

答案 1 :(得分:2)

我实际上建议远离标签。在某些情况下,程序会输出到具有不同选项卡设置的位置,并且根据用于对齐输出的选项卡在一般情况下是一个狡猾的前景,这正是您已经遇到的原因。 - 对齐事物取决于知道(或计算)与它们分离的数据的长度。在您的情况下,如果您的标签长度​​超过28个字符,则计算将失败。

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

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

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

现在,当我查看字符串时,我更容易告诉我放置数据的位置以及整体结果的样子,而不是尝试将常量与其格式字符串相匹配。

无论如何,这是另一种选择。