First of all, like the title says, this is about android.icu.text.DecimalFormat
, and not java.text.DecimalFormat
.
I'm using DecimalFormat
to get decimalFormatSymbols.monetaryGroupingSeparator
and decimalFormatSymbols.monetaryDecimalSeparator
, and then use them to format amount input from the user.
DecimalFormat
also has a withCurrency
input, which from I see, shouldn't affect the monetary separators.
But, for some locales (en_SE
and en_DK
) and currencies (EUR), it does change the monetary separators.
As you can see, these are english locales for countries in EU which do not have EUR as currency.
From what I see we have the following cases:
English | EU | EUR | locale | set EUR | set GBP |
---|---|---|---|---|---|
X | X | X | en_AT,BE,DE,FI | , and . already |
, and . already |
X | X | en_DK,SE | X | WORKS | |
X | X | can't find locale | - | - | |
X | en_CA,GB,US,ZA | WORKS | WORKS | ||
X | X | fr_FR | WORKS | WORKS | |
X | ro_RO, dk_DK, se_SE | WORKS | WORKS | ||
X | ca_AD | WORSK | WORKS | ||
nb_NO | WORKS | WORKS |
So let's assume we have this class
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]")
}
}
And we use it like this:
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
My question is: is there any reason for this behaviour, or is this a bug in the DecimalFormat
/NumberFormat
implementation?