【问题标题】:String formatting in Java for Date classJava中日期类的字符串格式
【发布时间】:2014-01-21 19:40:35
【问题描述】:

我有这个程序可以打印所需的format 中的数据。但我很难让它工作。

这是我的代码和输出:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestingStuff {

    public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();
        calendar = new GregorianCalendar(2014, 07, 18);
        Date startDate = calendar.getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy");
        String formatted = simpleDateFormat.format(startDate);
        String result="";
        String header2=String.format("%s %20s %20s %20s%n", "Account","Date","Hours","Skill");
        result+=header2;
        result+="-----------------------------------------------------------------------\n";
        result+=String.format("summary %20s%n",formatted);
        result+=String.format("Totabl Billable: %25s%n", 40);
        result+=String.format("Total Non-Billable: %25s%n", 0);
        result+=String.format("Total Hours %25s%n", 40);
        System.out.println(result);

    }

}

输出:

Account                 Date                Hours                Skill
-----------------------------------------------------------------------
summary             08/18/14
Totabl Billable:                        40
Total Non-Billable:                         0
Total Hours                        40

预期输出:

    Account                 Date                Hours                Skill
    -----------------------------------------------------------------------
    summary                08/18/14
    Totabl Billable:                              40
    Total Non-Billable:                            0
    Total Hours                                   40

如您所见,这些数字并未相对于选项卡标题居中。我还在硬编码spaces 的数量,例如(%20s),我认为这不是正确的方法。有没有办法告诉 使用居中自动格式化?

【问题讨论】:

  • 您是否尝试使用 \t 格式化您的字符串?它的“标签” .. 应该让你得到预期的输出。
  • @TomasBisciak:我试过tab,但这是为标题提供了分隔,而不是为下面的行提供了分隔

标签: java date format formatter string.format


【解决方案1】:

我建议对左对齐使用 java.util.Formatter '-' 标志。来自 Javadoc:

'-' '\u002d' 左对齐输出。空格 ('\u0020') 将根据需要添加到转换值的末尾以填充字段的最小宽度。

所以,如果我们将此应用于您的示例:

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    calendar = new GregorianCalendar(2014, 07, 18);
    Date startDate = calendar.getTime();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy");
    String formatted = simpleDateFormat.format(startDate);
    String result = "";
    String header2 = String.format("%s %20s %20s %20s%n", "Account", "Date", "Hours", "Skill");
    result += header2;
    result += "-----------------------------------------------------------------------\n";
    result += String.format("summary %20s%n", formatted);
    result += String.format("%-40s %4d%n", "Totabl Billable:", 40);
    result += String.format("%-40s %4d%n", "Total Non-Billable:", 0);
    result += String.format("%-40s %4d%n", "Total Hours:", 40);
    System.out.println(result);
}

将用空格填充第一个输入(行标签)以匹配固定宽度(在本例中为 40)。这将产生:

Account                 Date                Hours                Skill
-----------------------------------------------------------------------
summary             08/18/14
Totabl Billable:                           40
Total Non-Billable:                         0
Total Hours                                40

这为动态行标签提供了额外的好处,因为它会自动填充到指定的宽度,而不管标签的长度如何。它会比尝试计算每个可能的标签的空间更灵活。

【讨论】:

  • 当您说String.format("%-40s %4d%n", "Total Billable:", 40); 时,您指定Total Billable 必须是最左端,然后用空格填充总共40。我的理解正确吗?
  • 是的,没错。它左对齐输入并将其填充到指定的总数。注意,它是根据前一个条目左对齐的,所以你也可以在第二个参数中添加'-'标志,它会根据第一个参数左对齐并相应地填充。
  • 我将%-40 更改为%-42,这样我就可以将40Hours 标头居中。而且看起来好多了..
【解决方案2】:
        String header2=String.format("%s\t\t\t%s\t\t\t%s\t\t\t%s\n", "Account","Date","Hours","Skill");
        result+=header2;
        result+="-------------------------------------------------------------------------------\n";
        result+=String.format("summary \t\t%s\n",formatted);
        result+=String.format("Totabl Billable: \t\t\t\t%s\n", 40);
        result+=String.format("Total Non-Billable: \t\t\t\t%s\n", 0);
        result+=String.format("Total Hours \t\t\t\t\t%s\n", 40);
        System.out.println(result);

这应该工作。即使我输入不同的数字也为我工作。

【讨论】:

  • 这看起来好多了。一个问题是数字没有居中(它们与标题左对齐)..你能看到吗?
  • 您可以在控制台中对该字符串执行的操作可能会受到限制。如果您愿意,您可以通过算法来执行此操作并使用空格、字符串格式化。这会花费您更多的处理能力。如果我真的需要按照你想要的方式做,至少这就是我要做的。不确定是否有任何简单的方法可以在没有任何字符串操作的情况下将它们对齐
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2011-02-18
  • 2021-08-15
  • 2012-12-30
  • 2023-03-18
相关资源
最近更新 更多