У меня есть приложение, которое до 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