Как решить iOS ошибку с локали десятичной запятой / запятой в расчетах? (с NumberFormatter)

У меня есть следующая проблема с вычислениями iOS, когда пользователь находится в разных локалях. Здесь, в Европе, разделитель десятичной точки - это ",", а в других местах это может быть ".". Пока пользователь находится в локали с "." все вычисления работают нормально, но когда вместо них используется запятая, я получаю сообщение об ошибке. Вот простой код:

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, насколько я понимаю другие вопросы здесь, но я не понимаю, как это сделать, и в документации не приводится пример того, как создать double или 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, а затем использовать их в вычислениях.

Может кто-нибудь дать мне совет? Спасибо

1 ответ

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

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

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

Другие вопросы по тегам