Измените валюту на форматер валюты - PullRequest
0 голосов
/ 21 октября 2019

У меня есть следующий метод для создания форматера валюты. Есть 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

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

1 Ответ

1 голос
/ 21 октября 2019

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

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
}
...