пытаясь преобразовать строку в десятичную для iOS 13 - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть приложение, которое до iOS 13 работало корректно. Я проверил несколько сообщений, но, похоже, они говорят о том, что я уже сделал.

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

func changeCurrencyToDecimal(stringNumber:String) -> Decimal {


    let numberFormatter = 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] = options?.currencyCode // or any other specific currency code
    // Get the updated locale identifier
    let locId = Locale.identifier(fromComponents: locComps)
    // Get the new custom locale
    //numberFormatter.locale = Locale(identifier: locId)

    if(options?.currencyCode == nil) {
           print("There is no currency code so use the default locale")
           numberFormatter.locale = Locale.current
       }
       else{
           print("We have a currency code!")
           numberFormatter.locale = Locale(identifier: locId)
       }

    numberFormatter.numberStyle = .currency
    numberFormatter.currencySymbol = ""
    numberFormatter.decimalSeparator = ","  

    print("\(stringNumber) is the number being passed")

    let number = numberFormatter.number(from: stringNumber)

    // check to see if the number is nil and if so, return 0.

    print("\(number) is the number converted")
    if number == nil{
        return 0
    }
    else{
        print("\(number!) is the number")
        let amount = number?.decimalValue
        return amount!
    }

}

Пример строки, которую я передаю: $ 300.00 $ всегда вызывает возврат nil.Если я прохожу 300,00, то конвертер работает просто отлично.Но мне нужно иметь возможность проверить любую валюту, которую пользователь установил для своего устройства.

Коды валют, которые я проверяю, являются теми, которые Apple предоставляет в опциях var currencyCode: String? { get }, именно там, где я их храню.коды.

NumberFormatter каждый раз выдает nil, и кажется, что мой десятичный код не лишен своего форматирования.

Опять же, это работало до iOS 13, так что я предполагаю, что что-то изменилось на стороне Apple, и я, возможно, еще не натолкнулся на это.

ОБНОВЛЕНИЕ Вот пользовательseniaro.Пользователь вводит сумму.Если пользователь нажимает сохранить сразу, я беру сумму и преобразую ее в десятичную, чтобы сохранить в coredata.Но если пользователь отклоняет клавиатуру, я беру эту сумму и преобразую ее в строку для отображения символа валюты.Я разрешаю пользователю устанавливать свою валюту, поэтому использование локали для меня не работает, так как иногда они не используют эту систему.Поэтому после того, как клавиатура отклонена и их количество отображается с правильным форматированием, я запрограммировал ее на то, что если произойдет изменение их количества и снова будет отклонена клавиатура, и те же шаги повторяются.Символы валюты убираются, а строка преобразуется в десятичную.

Надеюсь, это лучше даст вам представление о том, как это работает в моем приложении.

ОБНОВЛЕНИЕ Iдобавлен оператор if / else, чтобы увидеть, была ли установлена ​​локаль или она возвращается nil, и если да, установить ее в Locale.current

1 Ответ

0 голосов
/ 29 сентября 2019

Предполагая, что входная строка использует текущий языковой стандарт устройства, вы можете создать NumberFormatter с помощью Locale.current и установить numberStyle в валюту.

Я использовал небольшую игровую площадку для проверки:

import Foundation

func changeCurrencyToDecimal(_ stringNumber: String) -> Decimal? {
  let numberFormatter = NumberFormatter()
  numberFormatter.numberStyle = .currency

  let number = numberFormatter.number(from: stringNumber)
  return number?.decimalValue
}

let numbersFormatted = ["$300", "$3,000.04", "3.000,04", "Wazaa", "3000000"]
numbersFormatted
  .map { changeCurrencyToDecimal($0) }
  .forEach { print($0 ?? "Not a value") }

Это печатает:

  • 300
  • 3000.04
  • Не значение
  • Не значение
  • 3000000

Если вы продолжаете получать nil, в результате локаль вашего устройства отличается от номера строки примера, который вы используете в вопросе ($ 300).

...