Существует ли шаблон формата для DecimalFormat, чтобы перед числами были положительные и отрицательные знаки, за исключением 0?

Я использую формат для отображения знаков в своем проекте Kotlin/Java, и этот формат делает именно то, что и должен: положительные знаки перед положительными числами и отрицательный знак перед отрицательными числами. Однако ноль имеет положительный знак, и это моя проблема, я не хочу никаких знаков перед 0.

Этот код отображается для примера +1 +2 +3 ... -1 -2 -3.., а для нуля он имеет положительный знак +0. Я хочу, чтобы ноль не имел знака.

private companion object {
        const val DECIMAL_SIGN_FORMAT = "+#;-#"
    }
private val numberSignFormatter = DecimalFormat(DECIMAL_SIGN_FORMAT)
numberSignFormatter.format(progress).toString()

Я думаю, вам, вероятно, просто придется добавить в свой код специальную обработку числа 0 (ноль).

Abra 23.04.2024 12:10

Вот чего я боялся.

CHARFEDDINE Amine 23.04.2024 12:28

Если progress (число, которое вы хотите отформатировать) представляет собой float или double, то между +0,0 и -0,0 есть разница, и DecimalFormat показывает, какой из них.

k314159 23.04.2024 13:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что это можно сделать напрямую с помощью какого-либо Java API (или Kotlin, если уж на то пошло, который просто предоставляет оболочки вокруг Java API).

Вы всегда можете определить свою собственную функцию, которая будет регулярно форматировать число, а затем удалять +.

Простая версия может выглядеть так:

inline fun String.formatZeroWithoutSign(number: Number): String =
    format(number).replace("+0", "0")

Вы можете использовать его так (или выберите любой другой формат, который вам нравится):

"%1$+d".formatZeroWithoutSign(progress)

Я выбрал форматтер в стиле printf, поскольку его немного проще использовать, но, очевидно, это можно сделать и с помощью DecimalFormat, если вы хотите его придерживаться.

Как также отмечается в комментариях, это может не дать точных результатов во всех ситуациях. Более узкий подход будет более ребутным:

inline fun String.formatZeroAs0(number: Number): String =
    if (number == 0) "0"
    else format(number)

При этом вы можете форматировать только одно число за раз, но его поведение более предсказуемо: оно будет форматировать число по заданному шаблону, если не указан 0, тогда оно будет обходить все форматирование и просто выводить "0".

Кроме того, если вы используете Android, Android SDK предоставляет NumberFormatter со встроенной функцией:

NumberFormatter
    .withLocale(...)
    .sign(SignDisplay.EXCEPT_ZERO)
    .format(progress)
.replace("+0", "0") не кажется хорошим выбором, потому что это повлияет на «+0,1». У меня сложилось впечатление, что это был всего лишь ноль, который не должен иметь знака, то есть «+0,1», «0», «-0,1». Я бы просто сделал if (formatted.equals("+0")) return "0"
Michael 23.04.2024 13:24

Да, это также может привести к неверным результатам в некоторых других крайних случаях, когда + может встречаться где-то еще в выводе (с несколькими числами или каким-либо другим шаблоном формата). Все зависит от того, насколько прочным он должен быть. Я отредактировал свой ответ, чтобы сделать его более понятным, и предоставил более надежную альтернативу.

Leviathan 23.04.2024 13:53

@Michael: if (formatted.equals("+0")) return "0" также не будет работать, если шаблон содержит больше, чем просто простое форматирование чисел, что также может быть неожиданным поведением.

Leviathan 23.04.2024 13:56
if (number == 0) не компилируется. Number несовместим с int. Вероятно (иногда) вам может сойти с рук выполнение if (number.doubleValue() == 0.0).
k314159 23.04.2024 19:16

Другие вопросы по теме