【问题标题】:Using Java string.format() for printing使用 Java string.format() 进行打印
【发布时间】:2018-09-27 10:54:46
【问题描述】:

我是 java 新手,我编写了一个代码来打印一定范围之间的闰年,对于输出,我想每行打印 3 个闰年,每一年用逗号分隔。

例如,1999年到2045年之间,我想要的输出是:

2000,2004,2008
2012,2016,2020
2024,2028,2032
2036,2040,2044

我已经写好了代码:

for (int year = 1999; year<2045; year ++) {
            if (((year%4 == 0) && (year%100 !=0)) || (year%400==0)) {
                System.out.println(String.format(format, year));   #issue here
            }
}

我对字符串格式如何通过我计划在打印时使用的 String.format 表示法工作感到困惑。希望能得到一些帮助。

【问题讨论】:

  • 在当前设计下一次只能打印一年,因此在添加大量丑陋的代码(例如计数器)之前,无法打印以逗号分隔的 3 年达到 3 / 迭代结束。另外在旁注中,将String.format 包装在System.out.print... 中是没有意义的,而您可以只使用System.out.printf
  • 这可能有助于您了解format 的工作原理 - docs.oracle.com/javase/tutorial/java/data/numberformat.html
  • 我不认为 String.format() 是这样做的好人选。要么你在错误的地方使用它,要么你不理解你的作业问题:P

标签: java string format


【解决方案1】:

如果没有一些条件语句,这是无法实现的,最好这样做:

for (int year = 1999; year < 2045; year++) {
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {         
        System.out.print(year);
        column++;
        if (column % 3 == 0) {
            System.out.println();
        } else {
            System.out.print(",");
        }
    }
}

【讨论】:

  • 这只能在单线程模式下正常工作。否则其他线程可能会干扰您的打印。所以,不要使用它。
  • @Imaskar 考虑到 OP 是 Java 的新手,他可能没有从其他线程打印。虽然您的评论在技术上是正确的,但这并不是一个非常现实的可能性。
  • @Kayaman 是坚持不良做法的借口吗?他会记住它并在以后犯错误。只需将 System.out 与 StringBuilder 交换并在最后打印它就可以了。
  • @Imaskar 不要再夸大其词了。在他开始编写多线程代码之前,他会做很多更糟糕的事情。
  • @Imaskar 遗憾的是,StringBuilder 也不是线程安全的...stackoverflow.com/questions/48558432/…
【解决方案2】:

String.format() 粗略地采用第一个字符串参数,它是您想要的“布局”,以 % 开头的说明符代表变量类型(%s 代表字符串,%d 代表数字等)和下一个系列参数是实际数据 - 应该在数量和顺序上与格式布局中的说明符数量相匹配:

    int[] years = new int[3];
    int i = 0;
    for (int year = 1999; year < 2045; year++) {
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
            years[i++] = year;
            if (i > 2) {
                System.out.println(String.format("%d,%d,%d", years[0], years[1], years[2]));
                i = 0;
            }
        }
    }

2000,2004,2008
2012,2016,2020
2024,2028,2032
2036,2040,2044

String.format() 在这种情况下感觉有点矫枉过正。您可以(大约)在我的特定解决方案中完成相同的任务,而无需格式,只需使用:

 System.out.println(Arrays.toString(years));

除了在本例中使用的 int 数组周围还有方括号。

[2000, 2004, 2008]
[2012, 2016, 2020]
[2024, 2028, 2032]
[2036, 2040, 2044]

【讨论】:

    【解决方案3】:

    您可以使用 %tY 作为年份的格式。它会将年份格式化为四位数。

    String.format("%tY", year)
    

    这是我尝试过的代码:

    import java.util.Calendar;
    
    public class MyClass {
        public static void main(String args[]) {
            int year;
              Calendar cal = Calendar.getInstance();
            for (year = 1999; year<2045; year ++) {
                if (((year%4 == 0) && (year%100 !=0)) || (year%400==0)) {
                    cal.set(year, 0, 0);
                    System.out.println(String.format("%1$tY", cal));   
                }
            }
        }
    }
    

    【讨论】:

    • 这看起来不像 op 要求的那样。他想要连续 3 个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多