#java #kotlin
Вопрос:
Как правильно форматировать число с заданной локализацией и с заданными десятичными знаками?
Если бы у меня был следующий код:
fun main() { val number = BigDecimal("1000"); println(formatNumber(number,Locale("de","DE"),2)) // should print 1.000,00 println(formatNumber(number,Locale("de","CH"),3)) // should print 1'000.000 }
Как должен быть реализован форматномер?
Я нашел 2 распространенных способа форматирования чисел в котлине в Интернете, но оба они не полностью удовлетворяют потребностям:
Десятичный формат
fun formatNumber(number: BigDecimal, locale: Locale, decimalPlaces: Int) = DecimalFormat("#,###." ("0".repeat(decimalPlaces))).format(number)
Недостаток: Отсутствует локализация
Числоформат
fun formatNumber(number: BigDecimal, locale: Locale, decimalPlaces: Int) = NumberFormat.getNumberInstance(locale).format(number)
Недостаток: Не хватает знаков после запятой
Есть ли способ поставить галочки во всех графах? Я чувствую, что NumberFormat должен быть правильным решением, но я не могу понять, как указать десятичные знаки..
Ответ №1:
Вы можете установить maximumFractionDigits
и minimumFractionDigits
в числовом формате:
fun formatNumber(number: BigDecimal, locale: Locale, decimalPlaces: Int) = with(NumberFormat.getNumberInstance(locale)) { maximumFractionDigits = decimalPlaces minimumFractionDigits = decimalPlaces format(number) }
Комментарии:
1. А, понятно, спасибо! Не знал, что это тоже сеттеры..
Ответ №2:
Вы также можете использовать DecimalFormat
, который действительно поддерживает локализацию с помощью DecimalFormatSymbols
параметра:
DecimalFormat("#,###." ("0".repeat(decimalPlaces)), DecimalFormatSymbols.getInstance(locale)) .format(number)
Комментарии:
1. Ах, приятно знать, спасибо. Хотя я все равно пойду по пути NumberFormat, поскольку он правильно обрабатывает случай с нулевыми десятичными знаками. Исправить было бы несложно, но с NumberFormat он выглядит чище.
2. @VanCoding конечно, выбирайте то, что вам больше всего подходит 🙂