2016-12-30 1 views
1

У меня есть следующая проблема с вычислениями iOS, когда пользователь находится в разных локалях. Здесь в Европе разделитель десятичной точки является «,», а в других местах он может быть «.». Пока пользователь находится в локали с символом «.». все вычисления работают нормально, но когда вместо запятой используется ошибка, я получаю сообщение об ошибке. Вот простой код до сих пор:Как решить ошибку iOS с десятичной точкой/запятой в вычислениях? (с NumberFormatter)

if let expense = expenseTextField.text 
     let expenseValue = Double(expense) 
     let guests = guestTextField.text 
     let guestValue = Double(guests) { 

     let result = round((expenseValue/guestValue) * 100)/100 

     resultLabel.text = priceString 
     //resultLabel.text = String(result) 
    } else { 
     resultLabel.text = "No values!" 
    } 

Я уверен, что я должен использовать NumberFormatter, насколько я понимаю, другие вопросы здесь, но я не понимаю, как это сделать, и документация не укажите пример создания двойного или float из строки. Я попытался следующие, но я получаю сообщение об ошибке о том, что я не могу ни создавать двойников и не использовать эти переменные для расчетов:

if let expense = expenseTextField.text 
     let expenseValue = String(expense), 
     let guests = guestTextField.text 
     let guestValue = String(guests) { 


     let expenseFormatter = NumberFormatter() 
     expenseFormatter.number(from: expenseValue) 

     let guestFormatter = NumberFormatter() 
     guestFormatter.number(from: guestValue) 

     let expenseDouble = Double(expenseFormatter) 
     let guestDouble = Double(guestFormatter) 


     let result = round((expenseDouble/guestDouble) * 100)/100 

     resultLabel.text = priceString 
    } else { 
     resultLabel.text = "No values!" 
    } 

Я не знаю, как создать реальные парный из этих строк с NumberFormatter, а затем использовать их в вычислениях ,

Может кто-нибудь дать мне совет? Благодаря

+0

При представлении номера пользователю вы должны использовать 'NSNumberFormatter'. При разборе обычно достаточно просто заменить все ',' на '.'. – Sulthan

+0

Это сработало хорошо, хотя я должен признать, что я не думал об этом решении, потому что это не кажется самым изящным для меня. Я использовал следующее, чтобы вернуть строку: – RjC

+0

пусть CurrencyFormatter = NumberFormatter() currencyFormatter.usesGroupingSeparator = истинный currencyFormatter.numberStyle = NumberFormatter.Style.currency currencyFormatter.locale = NSLocale.current пусть PRICESTRING = currencyFormatter.string (для: результата) print (priceString 0) – RjC

ответ

0

Единственное, что вам нужно, это написать вызов метода правильно:

let expenseDouble = expenseFormatter.number(from: expenseValue)?.doubleValue ?? 0 
let guestDouble = guestFormatter.number(from: guestValue)?.doubleValue ?? 0 

форматчик/анализатор непосредственно преобразует строку в number. Затем вам нужно взять значение Double. Обратите внимание, что синтаксический анализ может завершиться неудачей, и вам придется решить возникший необязательный вариант в этом случае, например. используя ?? 0.

+0

Вам все равно придется накладывать 'NSNumber' на' Double'. (И вам не нужны отдельные форматирования для каждого преобразования.) –

+0

@MartinR Да, ему также не нужен этот 'String (расход)'. – Sulthan

Смежные вопросы