формат числа с локализацией до фиксированных десятичных знаков

#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 конечно, выбирайте то, что вам больше всего подходит 🙂