Форматирование валюты с помощью NumberFormatter заменить код валюты локали по умолчанию - PullRequest
0 голосов
/ 25 мая 2020

В моей модели я храню цены как 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.

1 Ответ

3 голосов
/ 25 мая 2020

Если вы действительно хотите использовать формат в вопросе, вы можете установить символ валюты отдельно после изменения локали

formatter.locale = Locale(identifier: "en_US")
formatter.currencySymbol = Locale.current.currencySymbol

if let str = formatter.string(for: 123.45) {
    print(str)
}

123,45 крон

Если у валюты нет символа, я предлагаю вместо этого использовать код валюты. В качестве альтернативы вам необходимо вести собственный список пар код / ​​знак валюты.

...