Я использую формат для отображения знаков в своем проекте 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()
Вот чего я боялся.
Если progress
(число, которое вы хотите отформатировать) представляет собой float
или double
, то между +0,0 и -0,0 есть разница, и DecimalFormat
показывает, какой из них.
Я не думаю, что это можно сделать напрямую с помощью какого-либо 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: if (formatted.equals("+0")) return "0"
также не будет работать, если шаблон содержит больше, чем просто простое форматирование чисел, что также может быть неожиданным поведением.
if (number == 0)
не компилируется. Number
несовместим с int
. Вероятно (иногда) вам может сойти с рук выполнение if (number.doubleValue() == 0.0)
.
Я думаю, вам, вероятно, просто придется добавить в свой код специальную обработку числа 0 (ноль).