#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
?