Как сделать чтобы TextField не принимал знак запятой или точки первым значением при вводе

textfield
ios
swift

#1

Добрый день!
Подскажите как сделать чтобы textField не принимал знак запятой или точки первым значением при вводе, благодарю заранее.

         func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            let text = (textField.text ?? "") as NSString
            let newText = text.replacingCharacters(in: range, with: string)
            
            if let regex = try? NSRegularExpression(pattern: "^[0-9]*((\\.|,)[0-9]{0,2})?$", options: .caseInsensitive) {
                return regex.numberOfMatches(in: newText, options: .reportProgress, range: NSRange(location: 0, length: (newText as NSString).length)) > 0
            }
           return false
        }
    }

Данный код фильтрует TF до двух знаков после разделителя, но дает указать первым знак “,” или “.”


#2

а поставить какую-то проверку на входе?


#3

Согласен, но в данной функции реализован делегат, автоматом проверяет формат “^[0-9]*((\.|,)[0-9]{0,2})?$”. Возможно есть готовое решение или альтернативные ?


#4

так а что мешает в той же функции поставить вначале проверку первого знака в строке?


#5

Пожалуйста подскажите, как поставить проверку. Благодарю заранее.


#6

попробуй так:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let regex = try? NSRegularExpression(pattern: "^[0-9]+((\\.|,)[0-9]{0,2})?$", options: .caseInsensitive) {
        let text = (textField.text ?? "") as NSString
        let newText = text.replacingCharacters(in: range, with: string)
        let item = regex.numberOfMatches(in: newText, range: NSRange(newText.startIndex..., in: newText))
        return item > 0 || textField.text!.count == 1
    }
    return false
}

#7

Или так:

         func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            let text = (textField.text ?? "") as NSString
            let newText = text.replacingCharacters(in: range, with: string)

            guard newText.first != "," && newText.first != "." else { return } // Check the first character of String
            
            if let regex = try? NSRegularExpression(pattern: "^[0-9]*((\\.|,)[0-9]{0,2})?$", options: .caseInsensitive) {
                return regex.numberOfMatches(in: newText, options: .reportProgress, range: NSRange(location: 0, length: (newText as NSString).length)) > 0
            }
           return false
        }
    }

#8

Просто :+1:! Спасибо!!!