Условные строки в String.format () в Java - PullRequest
0 голосов
/ 22 июня 2019

У меня есть программа для преобразования заданного количества минут в дни / часы / минуты и т. Д.

Я пытаюсь не отображать часть x days, если дни = 0. Аналогично для часов и минут.

Таким образом, некоторые примеры выходных данных будут:

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 голосов
/ 22 июня 2019

Уменьшите повторение, написав вспомогательные подпрограммы.

Сначала ...

  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");

(Этот код не проверен полностьюно этого должно быть достаточно, чтобы передать идею)

0 голосов
/ 25 июня 2019

Как предположил Эллиотт, я пошел с пакетом java.time.Duration, который значительно уменьшил сложность, но, очевидно, ничего не сделал для операторов println.

После некоторых поисков в SO я наткнулся на DurationFormatUtils , который отлично подходит для моих целей.

0 голосов
/ 22 июня 2019
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 "):"");

Таким образом, он становится более читабельным и коротким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...