NSNumberFormatter.number для формата валюты не работает в устройстве, но работает в симуляторе - PullRequest
0 голосов
/ 28 июня 2018

Я пытался реализовать формат валюты на основе передачи моего пользовательского идентификатора языка.

Ниже мой код

func currencyFormatter(language:String, amount:String)  -> String  {

    let nsFormatter = NumberFormatter()
    nsFormatter.numberStyle = .currency
    nsFormatter.currencySymbol = ""
    var formattedString: String?
    var amountInNumber:NSNumber!
    if let number = nsFormatter.number(from: amount)
    {
        amountInNumber = number.doubleValue as NSNumber
    }
    nsFormatter.locale = Locale(identifier: language)
    formattedString = ((amountInNumber?.intValue) != nil) ? nsFormatter.string(from: amountInNumber) : amount

    guard let finalString = formattedString else {
        return ""
    }
    return finalString
}

Я пытаюсь передать язык как "fr-FR" и сумму как "1234.45", тогда ожидаю вывод "1 234,45".

Это нормально работает в симуляторе, но не работает в устройстве (возвращает то же значение 1234.45)

Я что-то пропустил. Пожалуйста помоги!

Заранее спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Десятичный разделитель зависит от локали, поэтому анализирует "1234.45" завершается неудачей, если разделитель языка не является точкой.

Если во входной строке используется фиксированный формат с точкой в ​​качестве десятичного разделителя тогда вы можете установить языковой стандарт для "en_US_POSIX" для преобразования из строки в число. Затем установите желаемую локаль для конвертации от числа к строке.

Пример:

func currencyFormatter(language: String, amount: String)  -> String  {

    let nsFormatter = NumberFormatter()
    nsFormatter.locale = Locale(identifier: "en_US_POSIX")
    nsFormatter.numberStyle = .decimal

    guard let number = nsFormatter.number(from: amount) else {
        return amount
    }

    nsFormatter.locale = Locale(identifier: language)
    nsFormatter.numberStyle = .currency

    return nsFormatter.string(from: number) ?? amount
}

print(currencyFormatter(language: "fr-FR", amount: "1234.45"))
// 1 234,45 €
...