Измените валюту на средство форматирования валюты

У меня есть следующий метод для создания средства форматирования валюты. Есть 2 поля ввода, локаль и валюта:

    private fun getCurrencyDecimalFormat(locale: Locale, currency: Currency): DecimalFormat {
        val currencyFormat = NumberFormat.getCurrencyInstance(locale) as DecimalFormat
        currencyFormat.positivePrefix = currencyFormat.positivePrefix + " "
        currencyFormat.roundingMode = RoundingMode.DOWN 
        val symbol = currency.getSymbol(locale)
        val decimalFormatSymbols = currencyFormat.decimalFormatSymbols
        decimalFormatSymbols.currencySymbol = symbol
        currencyFormat.decimalFormatSymbols = decimalFormatSymbols
        currencyFormat.isParseBigDecimal = true
        return currencyFormat
    }

И называется так:

    val currencyFormat = getCurrencyDecimalFormat(locale, currency)
    return currencyFormat.format(amount)

Он отлично работает, когда ввод валюты совпадает с валютой ввода локали, поэтому:

  • локаль: es_ES, валюта: EUR = 0,00 € -> OK
  • локаль: en_US, валюта: USD = $0.00 -> OK

Но если у нас есть следующее, это неправильно:

  • локаль: es_ES, валюта: USD = 0,00 $ -> KO
  • локаль: en_US, валюта: EUR = $0.00 -> KO

Кажется, валюта установлена ​​неправильно... есть идеи? Я делаю что-то не так?


person SergiBC    schedule 21.10.2019    source источник


Ответы (1)


Кажется, это связано с этой строкой:

currencyFormat.positivePrefix = currencyFormat.positivePrefix + " "

Положительный префикс в этот момент зависит от валюты переданной локали. Если, например, вы вызываете свой метод как getCurrencyDecimalFormat(Locale.US, Currency.getInstance("EUR")), то ваш currencyFormat в этот момент привязан к доллару США (а currencyFormat.positivePrefix приводит к $).

Переместите эту строку ниже, ниже установки символов формата. Но ТБХ, я даже не уверен, зачем вам это нужно. Наличие пробела после символа валюты должно зависеть от локали, а не жестко запрограммировано.

fun getCurrencyDecimalFormat(locale: Locale, currency: Currency): DecimalFormat {
    val currencyFormat = NumberFormat.getCurrencyInstance(locale) as DecimalFormat

    currencyFormat.roundingMode = RoundingMode.DOWN

    val symbol = currency.getSymbol(locale)
    val decimalFormatSymbols = currencyFormat.decimalFormatSymbols

    decimalFormatSymbols.currencySymbol = symbol

    currencyFormat.decimalFormatSymbols = decimalFormatSymbols
    currencyFormat.isParseBigDecimal = true
    currencyFormat.positivePrefix = currencyFormat.positivePrefix + " "

    return currencyFormat
}
person SqueezyMo    schedule 21.10.2019