Java中String.format()中的条件字符串

时间:2019-06-21 22:32:08

标签: java

我有一个程序,可以以天/小时/分钟等形式转换给定的分钟数。

如果天数= 0,我尝试不显示部分x days。同样,小时和分钟也是如此。

因此,一些示例输出将是:

5 days

-

5 days 2 hrs

-

2 hrs 10 mins

如何在不使打印语句与一元三元运算符混淆的情况下做到这一点?

我当前的解决方案是:

        final StringBuilder remDaysBuilder = new StringBuilder();

        long remMins = Math.abs(request.getTimeRemaining());

        final int remDays = (int) (remMins / 1440);
        if (remDays > 0) {
            remDaysBuilder.append(remDays + " Days");
        }
        remMins = remMins % 1440;
        final int remHrs = (int) (remMins / 60);
        if (remHrs > 0) {
            remDaysBuilder.append(remHrs + " Hrs");
        }
        remMins = remMins % 60;
        if (remMins > 0) {
            remDaysBuilder.append(remMins + " Mins");
        }

但是我觉得对于这么小的逻辑来说,这是太多代码了!

3 个答案:

答案 0 :(得分:0)

final StringBuilder remDaysBuilder = new StringBuilder();

long remMins = Math.abs(request.getTimeRemaining());

final int remDays = remMins/24/60;
final int remHours = remMins/60%24;
final int remMins = remMins % 60;

remDaysBuilder
    .append(String.format("%s",(remDays>0)?(Integer.toString(remDays)+" days "):"")
    .append(String.format("%s",(remHours>0)?(Integer.toString(remHours)+" days "):"")
    .append(String.format("%s",(remMins>0)?(Integer.toString(remMins)+" days "):"");

这样,它变得更易读,也更简短。

答案 1 :(得分:0)

通过编写辅助子例程减少重复。

首先...

  private static long addTerm(StringBuilder sb, long rem, int div, String what) {
       int n = (int)(rem / div);
       if (n > 0) sb.append(n)
                    .append(' ')
                    .append(what)
                    .append(n > 1 ? "s " : " ");
       return rem % div;
    }

然后...

    StringBuilder sb = new StringBuilder();
    long remMins = Math.abs(request.getTimeRemaining());
    remMins = addTerm(sb, remMins, 1440, "Day");
    remMins = addTerm(sb, remMins, 60, "Hr");
    remMins = addTerm(sb, remMins, 1, "Min");

(此代码没有经过彻底检查,但足以传达这个想法)

答案 2 :(得分:0)

根据Elliott的建议,我使用了images软件包,它降低了很多复杂性,但显然对java.time.Duration语句没有任何作用。

在搜索了SO之后,我发现DurationFormatUtils非常适合我的目的。