Как разделить текстовое поле на запятую числового формата в iOS? - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу, чтобы число было 12,345,678, поэтому, когда я набираю текстовое поле, оно выходит.Максимальное значение для ввода текстового поля составляет 8 цифр.

Я использовал следующий код, но не могу очистить число после ввода 7 цифр.

Как это исправить?

override func viewDidLoad() {
    myTextfield.delegate = self
    self.myTextfield.keyboardType = .numberPad

    myTextfield.addTarget(self, action:#selector(textFieldValDidChange), for: .editingChanged)
}

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return range.location < 8
}

@objc func textFieldValDidChange(_ textField: UITextField) {
    let formatter = NumberFormatter()
    formatter.numberStyle = NumberFormatter.Style.decimal
    if textField.text!.count >= 1 {
        let number = Double(textField.text!.replacingOccurrences(of: ",", with: ""))
        let result = formatter.string(from: NSNumber(value: number!))
        textField.text = result!
    }
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Когда есть 7 цифр и две запятые, а курсор в конце, range.location будет 9. Поэтому используйте:

return range.location <= 9

Это позволит 8 цифр и две запятые.

Но даже тогда вашего чека недостаточно.Пользователь может переместить курсор к началу номера и ввести еще несколько цифр.Так что просто проверить местоположение курсора недостаточно.Вы хотите проверить длину полученной строки.

Ваш код также не прилагает усилий для предотвращения ввода нечислового текста.Пользователь может копировать и вставлять, пользователь может использовать внешнюю клавиатуру.А на iPad клавиатура .numberPad все еще показывает нормальную полноценную клавиатуру.Никогда не полагайтесь на назначенную клавиатуру.

Сводка - обновите shouldChangeCharactersIn, чтобы убедиться, что вводятся только цифры, и посмотрите, какой будет конечная длина строки, расположение курсора не имеет значения.

0 голосов
/ 03 декабря 2018
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return range.location < 10
    }

8 цифр плюс 2 запятых, это 10 символов (последний с индексом 9).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...