【问题标题】:Java output formatting for Strings字符串的 Java 输出格式
【发布时间】:2010-12-11 18:42:05
【问题描述】:

我想知道是否有人可以告诉我如何使用 Java 字符串的格式方法。 例如,如果我希望所有输出的宽度相同

例如,假设我总是希望我的输出是相同的

Name =              Bob
Age =               27
Occupation =        Student
Status =            Single

在这个例子中,所有的输出都整齐地排列在彼此的下方;我将如何使用 format 方法完成此操作。

【问题讨论】:

  • 您真正想知道the documentationformat string documentation 没有向您展示什么?
  • 如何设置宽度,让我的字符串总是按照那个宽度输出
  • 您使用宽度说明符,例如%10s 为 10 的宽度。
  • 您似乎被要求不愿意自己锻炼。我只能假设这是家庭作业?
  • 有点,这只是我为我的班级工作的程序中的一个问题。

标签: java formatting


【解决方案1】:
System.out.println(String.format("%-20s= %s" , "label", "content" ));
  • 其中 %s 是字符串的占位符。
  • “-”使结果左对齐。
  • 20 是第一个字符串的宽度

输出如下:

label               = content

作为参考,我推荐Javadoc on formatter syntax

【讨论】:

  • 也可以使用System.out.printf,即System.out.printf("%-20s= %s" , "label", "content" );
  • 对于这个有道理的东西+1
  • @JustinHarris 请记住,随后的System.out.printf 调用不会在每个输出之间放置换行符。不过,您可以通过在格式字符串的末尾附加一个 \n 字符来解决此问题。
  • 如果您想让 "=" 出现在对齐之前,但在索引 0 和内容开头之间仍然有 20 个字符,该怎么办? (我目前的解决方案是只制作一个单独的字符串,包括"=" 并将其格式化。有更好的解决方案吗?)
  • 这个答案几乎是 OP 所要求的。例外(@JosieThompson 指出)是“=”符号结束的地方。你应该做 System.out.println(String.format("%-20s %s" , "label =", "content" )); 来得到 OP 想要的东西。不同之处在于您将“=”符号添加到标签字符串。如果需要,您也可以直接致电System.out.format(...)。您只需要通过String 来完成String str = String.format(...) 之类的构造。
【解决方案2】:

例如,如果您想要至少 4 个字符,

System.out.println(String.format("%4d", 5));
// Results in "   5", minimum of 4 characters

【讨论】:

  • 实际上不会导致“0005”吗?因为它是一个整数参数。我不确定相同的“空格数”参数是否适用于字符串。 (即 %4s 是否有类似的效果?)我不能说我在编写字符串时曾经担心过它们,但我一直使用这个参数来表示数字,我很确定它会导致领先正在添加 0。
  • 不! %4d 将使用三个前导空格进行格式化。要获得前导零,您需要 %04d。我刚刚在 IdeOne 中尝试过:ideone.com/dzNQU
  • 啊是的,你说的很对,就是我用的格式化字符串。
【解决方案3】:

要回答您更新的问题,您可以这样做

String[] lines = ("Name =              Bob\n" +
        "Age =               27\n" +
        "Occupation =        Student\n" +
        "Status =            Single").split("\n");

for (String line : lines) {
    String[] parts = line.split(" = +");
    System.out.printf("%-19s %s%n", parts[0] + " =", parts[1]);
}

打印

Name =              Bob
Age =               27
Occupation =        Student
Status =            Single

【讨论】:

    【解决方案4】:

    编辑:这是一个非常原始的答案,但我无法删除它,因为它已被接受。请参阅下面的答案以获得更好的解决方案

    为什么不动态生成一个空白字符串以插入到语句中。

    所以如果你想让它们都从第 50 个字符开始...

    String key = "Name =";
    String space = "";
    for(int i; i<(50-key.length); i++)
    {space = space + " ";}
    String value = "Bob\n";
    System.out.println(key+space+value);
    

    将所有这些放在一个循环中,并在每次迭代之前初始化/设置“键”和“值”变量,这样你就很成功了。我也会使用效率更高的StringBuilder 类。

    【讨论】:

      【解决方案5】:
           @Override
           public String toString() {
                return String.format("%15s /n %15d /n %15s /n %15s", name, age, Occupation, status);
           }
      

      【讨论】:

      • 欢迎来到 Stack Overflow,Amol。不只是添加一个代码 sn-p,为什么不也添加一个关于它是如何工作的小解释呢?
      【解决方案6】:

      对于十进制值,您可以使用 DecimalFormat

      import java.text.*;
      
      public class DecimalFormatDemo {
      
         static public void customFormat(String pattern, double value ) {
            DecimalFormat myFormatter = new DecimalFormat(pattern);
            String output = myFormatter.format(value);
            System.out.println(value + "  " + pattern + "  " + output);
         }
      
         static public void main(String[] args) {
      
            customFormat("###,###.###", 123456.789);
            customFormat("###.##", 123456.789);
            customFormat("000000.000", 123.78);
            customFormat("$###,###.###", 12345.67);  
         }
      }
      

      输出将是:

      123456.789  ###,###.###   123,456.789
      123456.789  ###.##        123456.79
      123.78      000000.000    000123.780
      12345.67    $###,###.###  $12,345.67
      

      更多详情请看这里:

      http://docs.oracle.com/javase/tutorial/java/data/numberformat.html

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 1970-01-01
        • 2014-05-12
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        相关资源
        最近更新 更多