Может ли String.format удалить числа, если они равны нулю? - PullRequest
0 голосов
/ 13 мая 2018

Я создаю секундомер и хочу отображать поле только для часов, если они> 0. На данный момент я решаю это так, есть ли более короткий путь?

String timeLeftFormatted = "";
    if (hours > 0) {
        timeLeftFormatted = String.format(Locale.getDefault(),
                "%d:%02d:%02d", hours, minutes, seconds);
    } else {
        timeLeftFormatted = String.format(Locale.getDefault(),
                "%02d:%02d", minutes, seconds);
    }

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Существует трюк с использованием argument_index.

Документация синтаксиса строки формата показывает, что спецификаторы формата имеютследующий синтаксис:

%[argument_index$][flags][width][.precision]conversion

Используя argument_index, вы можете пропустить неиспользуемые аргументы, т. е. с фиксированным списком аргументов, вы можете заменить саму строку формата, чтобы использовать только некоторые иззначения.

Используя ваш пример и троичный условный оператор, для ясности показано одна строка на аргумент:

String timeLeftFormatted = String.format(
        Locale.getDefault(),
        (hours > 0 ? "%1$d:%2$02d:%3$02d" : "%2$02d:%3$02d"),
        hours,
        minutes,
        seconds
);

Это также можно записать так:

String timeLeftFormatted = String.format((hours > 0 ? "%1$d:" : "") + "%2$02d:%3$02d",
                                         hours, minutes, seconds);
0 голосов
/ 13 мая 2018

Есть несколько способов сделать это, самый простой способ, который я могу придумать, это что-то вроде:

timeLeftFormatted = String.format(Locale.getDefault(), "%s:%02d:%02d", hours > 0 ? String.valueOf(hours) : "", minutes, seconds);

Edit:

Аналогичным образом вы также можете изменить саму неотформатированную строку в зависимости от того, больше ли hours ноль.

...