android.icu.text.Десятичный формат сбрасывает денежные разделители

#android #locale #icu

Вопрос:

Во-первых, как говорится в названии, речь идет о android.icu.text.DecimalFormat том , а не java.text.DecimalFormat о другом .

Я использую DecimalFormat , чтобы получить decimalFormatSymbols.monetaryGroupingSeparator и decimalFormatSymbols.monetaryDecimalSeparator , а затем использовать их для форматирования суммы, введенной пользователем.

DecimalFormat также есть withCurrency вход, который, как я вижу, не должен влиять на денежные разделители.

Но для некоторых стран ( en_SE и en_DK ) и валют (евро) это меняет денежные разделители. Как вы можете видеть, это английский язык для стран ЕС, в которых в качестве валюты не используется евро.

Из того, что я вижу, у нас есть следующие случаи:

Английский EU Евро место действия установить ЕВРО установить GBP
X X X en_AT,БЫТЬ,ДЕ,ФИ , и . уже , и . уже
X X en_DK,SE X работает
X X не могу найти локаль
X en_CA,ГБ,США,ЗА работает работает
X X fr_FR работает работает
X ro_RO, dk_DK, se_SE работает работает
X ca_AD ХУЖЕ работает
nb_NO работает работает

Итак, давайте предположим, что у нас есть этот класс

 class DecimalFormatWrapper(private val locale: Locale) {
    val decimalFormat: DecimalFormat = NumberFormat.getCurrencyInstance(locale) as DecimalFormat

    val monetaryGroupingSeparator: Char
        get() = decimalFormat.decimalFormatSymbols.monetaryGroupingSeparator

    val monetaryDecimalSeparator: Char
        get() = decimalFormat.decimalFormatSymbols.monetaryDecimalSeparator

    fun withCurrency(currencyCode: String) {
        Log.d("DF-S", "[$monetaryGroupingSeparator] / [$monetaryDecimalSeparator]")
        decimalFormat.withCurrency(Currency.getInstance(currencyCode))
        Log.d("DF-E", "[$monetaryGroupingSeparator] / [$monetaryDecimalSeparator]")
    }
}
 

И мы используем его вот так:

 DecimalFormatWrapper(en_DK).withCurrency("EUR")
// DF-S: [.] / [,]
// DF-E: [,] / [.]

DecimalFormatWrapper(en_DK).withCurrency("GBP")
// DF-S: [.] / [,]
// DF-E: [.] / [,]

DecimalFormatWrapper(en_SE).withCurrency("EUR")
// DF-S: [ ] / [,]
// DF-E: [,] / [.]

DecimalFormatWrapper(en_SE).withCurrency("GBP")
// DF-S: [ ] / [,]
// DF-E: [ ] / [,]

DecimalFormatWrapper(en_ZA).withCurrency("EUR")
// DF-S: [ ] / [,]
// DF-E: [ ] / [,]

DecimalFormatWrapper(ro_RO).withCurrency("EUR")
// DF-S: [.] / [,]
// DF-E: [.] / [,]

// etc
 

Мой вопрос: есть ли какая-либо причина для такого поведения, или это ошибка в реализации DecimalFormat / NumberFormat ?