【问题标题】:How to use String.format() in Java to replicate tab "\t"?如何在 Java 中使用 String.format() 复制选项卡“\t”?
【发布时间】:2012-12-09 16:10:38
【问题描述】:

我正在逐行打印数据,并希望它像表格一样组织。

我最初使用firstName + ", " + lastName + "\t" + phoneNumber

但是对于一些较大的名字,电话号码会被排除在对齐之外

我正在尝试使用 String.format() 来实现此效果。谁能告诉我要使用的格式语法吗?

我试过String.format("%s, %s, %20s", firstName, lastName, phoneNumber),但这不是我想要的。我希望它看起来像这样:

约翰·史密斯            123456789

麦迪逊鲍勃         123456789

查尔斯·理查兹 123456789

编辑: 这些答案似乎适用于 System.out.println()。但我需要它为 JTextArea 工作。我正在使用 textArea.setText()

解决了。 JTextArea 默认不使用等宽字体。我使用 setFont() 来改变它,现在它就像一个魅力。谢谢大家的解决方案。

【问题讨论】:

    标签: java syntax tabs format


    【解决方案1】:

    考虑为您的长度说明符使用负数:%-20s。例如:

       public static void main(String[] args) {
         String[] firstNames = {"Pete", "Jon", "Fred"};
         String[] lastNames = {"Klein", "Jones", "Flinstone"};
         String phoneNumber = "555-123-4567";
    
          for (int i = 0; i < firstNames.length; i++) {
            String foo = String.format("%-20s %s", lastNames[i] + ", " + 
                 firstNames[i], phoneNumber);
            System.out.println(foo);
          }   
       }
    

    返回

    Klein, Pete          555-123-4567
    Jones, Jon           555-123-4567
    Flinstone, Fred      555-123-4567
    

    【讨论】:

    • 由于某种原因,这不适用于 JTextAreas。知道为什么吗?
    • 发现了。它需要是等宽字体。
    • @ask:确实。使用简单的 JTable 显示数据可能会更好。
    • 我知道。这是一项任务,他们强迫我使用文本区域。但我正在努力让它看起来不错。
    【解决方案2】:

    尝试将 宽度放入第二个占位符,并使用 - 符号进行右侧填充

      String.format("%s, %-20s %s", firstName, lastName, phoneNumber)
    

    这将为第二个参数(姓氏)提供指定的宽度,并带有右填充,电话号码将仅在指定宽度字符串之后开始。

    编辑:演示:

    String firstName = "John";
    String lastName = "Smith";
    String phoneNumber = "1234456677";
    System.out.println(String.format("%s, %-20s %s",firstName, lastName, phoneNumber));
    

    打印:

    约翰·史密斯               1234456677

    【讨论】:

    • 不起作用。这使电话号码在“,”之后的 30 个字符处开始。但是,它本身取决于名字的长度。
    • @ask 你到底是什么意思?对于 firstName = John lastName = Smith 和 phoneNumber 为 1234456677,它打印:John, Smith 1234456677。 with for last name 字段分配有 20 个字符长度,所以我看到在 Smith 之后和电话号码之前出现了 15 个空格。我用一个示例演示更新了答案。如果您正在寻找不同的东西,请告诉我。
    • 谢谢。它适用于 System.out.println()。但是当我将此文本设置为文本区域时,它不起作用。
    • @ask:只是好奇,你在这个答案和另一个答案中发现了什么不同,你接受了吗?
    • @ask:这很好。我只是想如果您注意到任何差异或更喜欢串联:)
    【解决方案3】:

    唯一的选择是循环名称列表,计算字符串的最大长度,并根据需要在每个名称后添加空格,以确保所有数字都从同一列开始。

    使用制表符的缺点是您无法知道a priori 有多少个空格相当于一个制表符,因为它取决于编辑器。

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 2015-11-22
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-05-24
      相关资源
      最近更新 更多