В моей модели я храню цены как NSDecimalNumber
значения.
struct Item {
var price: NSDecimalNumber // eg. 3.543
var currencyCode: String // eg. "USD"
}
Я бы хотел, чтобы они отображались правильно, используя Locale
пользователя. Я нашел решение использовать NumberFormatter
:
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = item.currencyCode
formatter.string(from: item.price)
Как и ожидалось, он дает разные результаты в зависимости от локали пользователя.
Если я установил formatter.currencyCode
на USD
:
- Для
"en_US"
: "$3.543"
- Для
"fr_CA"
: "US$3.543"
- Для
"de_DE"
: "3,543 US$"
- Для
"da_DK"
: "3,543 US$"
Если я установил formatter.currencyCode
на DKK
:
- Для
"en_US"
: "DKK 3.543"
- Для
"fr_CA"
: "DKK 3.543"
- Для
"de_DE"
: "3,543 DKK"
- Для
"da_DK"
: "3,543 kr."
Проблема в что с большим количеством валют exoti c (например, DKK - Dani sh krone) форматировщик использует currencyCode вместо currencySymbol. Мне кажется, что использование символов вместо кодов более значимо.
В идеале, если я установлю formatter.currencyCode
на DKK
, я бы хотел иметь:
- Для
"en_US"
: "kr. 3.543"
- Для
"fr_CA"
: "kr. 3.543"
- Для
"de_DE"
: "3,543 kr."
- Для
"da_DK"
: "3,543 kr."
Как этого добиться? Или мне следует придерживаться способа установки Locale.current
и не трогать его?
Примечание: я не могу использовать NumberFormatter
только для чисел, а затем вручную добавить символ валюты, потому что символы могут быть назначенным для разных валют: $3.543
- это цена в долларах США в en_US Locale
, но в fr_CA Locale
это цена в канадских долларах.
РЕДАКТИРОВАТЬ Как предложено в комментариях , Я изменил тип цены на NSDecimalNumber
.