Получение валюты NumberFormatter по стране ISO - PullRequest
0 голосов
/ 28 августа 2018

Я создал большой список валют стран и их код ISO.

Пример:

 "USD" - "United States"
 "EUR" - "Euro"
 "JPY" - "Yen"

Пользователь выбирает свою собственную валюту, и я сохраняю ее в UserDefaults.

В моем редакторе чисел, как я могу получить отображаемую валюту, передав ISO-код?

У меня есть что-то подобное, но, похоже, оно работает неправильно.

 let formatter = NumberFormatter()

 let locale = Locale.availableIdentifiers.map { Locale(identifier: $0) }.first { $0.currencyCode == "EUR" }

// Instead of EUR I would display the user defaults. Testing Purposes Only.

 formatter.numberStyle = .currency
 formatter.locale  = locale as Locale
 formatter.maximumFractionDigits = 2
 $0.formatter = formatter

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

У меня есть приложение, которое делает то, о чем вы спрашиваете. Это позволяет пользователю выбрать определенный код валюты, а затем значения валют можно отформатировать в собственном языковом стандарте пользователя, но с использованием специального кода валюты.

Что я делаю, это создаю пользовательский идентификатор локали на основе собственной локали пользователя и конкретного кода валюты. Затем эта пользовательская локаль используется в качестве локали обычной настройки NumberFormatter для стиля валюты.

// Pull apart the components of the user's locale
var locComps = Locale.components(fromIdentifier: Locale.current.identifier)
// Set the specific currency code
locComps[NSLocale.Key.currencyCode.rawValue] = "JPY" // or any other specific currency code
// Get the updated locale identifier
let locId = Locale.identifier(fromComponents: locComps)
// Get the new custom locale
let loc = Locale(identifier: locId)

// Create a normal currency formatter using the custom locale
let currFmt = NumberFormatter()
currFmt.locale = loc
currFmt.numberStyle = .currency

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

Пользователь в США увидит валюты, отформатированные примерно так:

$ 1,234.56
€ 1,234.56
¥ 1235

пока пользователь в Германии увидит:

1.234,56 $
1.234,56 €
1,235 ¥

0 голосов
/ 28 августа 2018

Вы можете сделать что-то вроде этого:

if let userLocaleName = UserDefaults.standard.string(forKey: "put here the string used to store the the locale"),
    !userLocaleName.isEmpty
{
    formatter.locale = Locale(identifier: userLocaleName)
}
//if the user locale is not set, revert to the default locale
else if let defaultLocaleName = Locale.availableIdentifiers.first(where: {Locale(identifier: $0).currencyCode == "EUR"})
{
    let defaultLocale = Locale(identifier: defaultLocaleName)
    formatter.locale = defaultLocale
} else {
    fatalError("Error setting the locale")
}

Конструкция if-let использовалась в приведенном выше коде, чтобы избежать принудительного развертывания необязательных переменных.

А затем установите остальные свойства форматера:

formatter.numberStyle = .currency
formatter.maximumFractionDigits = 2
...