繁体   English   中英

用Java格式化字符串输出

[英]Formatting String Output in Java

我试图以不同于已经在程序中格式化的方式来格式化输出中的字符串。 这是一个披萨配料菜单,在程序的大部分内容中,每当输出时,它都会在配料之间用“ \\ n”正确格式化,以创建一个“感觉”列表。 但是,在要显示用户选择的最终菜单中,我也要放入配料表,因为用户可以自定义比萨饼上的配料。 垂直列出配料很难做到这一点,因为如果用户有多个比萨饼,则最终输出的确会很长。 我正在尝试找出是否可以采用与格式化为垂直显示相同的字符串并将其水平显示的方式,并在成分之间使用逗号而不是“ \\ n”。 有任何想法吗? 还是我应该创建一个新字符串,该字符串以所需的信息格式格式化?

String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
String ingredients = i1 + "\n" + i2 + "\n" + i3 + "\n";
System.out.print(ingredients);
System.out.printf("Your pizza includes only these ingredients: %s", ingredients);

第一个System.out.print(ingredients)与我拥有的代码相似,该代码在整个程序中垂直打印成分,以便用户轻松阅读。

我正在尝试格式化第二个System.out.print(...),以便成分列表水平显示。

String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
String ingredients = i1 + "\n" + i2 + "\n" + i3;
System.out.println(ingredients);
System.out.println("Your pizza includes only these ingredients: " + ingredients.replace("\n", ", ")
String s = "hi\nthere";
s.replaceAll("\n", ","); // (returns "hi,there")

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#replaceAll(java.lang.String,java.lang.String

我以为这更清楚了:

String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
System.out.printf("%s\n%s\n%s\n", i1, i2, i3);
System.out.printf("Your pizza includes ingredients: %s %s %s", i1, i2, i3);

关键是,如果您将要完全使用printf ,则还可以利用其将字符串连接在一起的功能。


根据您的评论,我认为成分的数量是可变的。 如果是这样的话,使用printf格式化“列表”(就像我上面所做的那样)将不会削减它。 相反,您需要这样的帮助方法:

public static String join(String separator, Object[] things) {
    StringBuilder sb = new StringBuilder();
    for (Object thing : things) {
        if (sb.length() > 0) {
            sb.append(separator);
        }
        sb.append(thing);
    }
    return sb.toString();
}

然后 ...

Object[] ingredients = new Object[]{i1, i2, i3}; // ... or a dynamic sided array
System.out.print(join("\n", ingredients));
System.out.println("Your pizza includes ingredients: " + join(" ", ingredients));

我声称这比其他建议更通用(与可变大小数组配合使用),更容易理解并且可能更有效。

join helper方法以多种形式存在于许多类库中;例如,在Apache Commons StringUtils类中。)

用\\ n替换\\ n是菜鸟程序员的风格,很快就会回来咬你。 尝试用逗号代替(并像执行操作一样手动执行\\ n部分):

String [] ingredients = {"Pepperoni", "Sausage", "Canadian Bacon"};
String almost_there = Arrays.deepToString(ingredients);
String there = almost_there.substring(1, almost_there.length() - 1);
System.out.printf("Your pizza includes ingredients: ", there);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM