Check that a input to UITextField is numeric only

Viewed 105380

How do I validate the string input to a UITextField? I want to check that the string is numeric, including decimal points.

22 Answers

In Swift 4:

let formatString = "12345"
if let number = Decimal(string:formatString){

    print("String contains only number")
}
else{
    print("String doesn't contains only number")
}

This covers: Decimal part control (including number of decimals allowed), copy/paste control, international separators.

Steps:

  1. Make sure your view controller inherits from UITextFieldDelegate

    class MyViewController: UIViewController, UITextFieldDelegate {...

  2. In viewDidLoad, set your control delegate to self:

    override func viewDidLoad() { super.viewDidLoad(); yourTextField.delegate = self }

  3. Implement the following method and update the "decsAllowed" constant with the desired amount of decimals or 0 if you want a natural number.

Swift 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let decsAllowed: Int = 2
    let candidateText = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
    let decSeparator: String = NumberFormatter().decimalSeparator!;

    let splitted = candidateText.components(separatedBy: decSeparator)
    let decSeparatorsFound = splitted.count - 1
    let decimalPart = decSeparatorsFound > 0 ? splitted.last! : ""
    let decimalPartCount = decimalPart.characters.count

    let characterSet = NSMutableCharacterSet.decimalDigit()
    if decsAllowed > 0 {characterSet.addCharacters(in: decSeparator)}

    let valid = characterSet.isSuperset(of: CharacterSet(charactersIn: candidateText)) &&
                decSeparatorsFound <= 1 &&
                decsAllowed >= decimalPartCount

    return valid
}

If afterwards you need to safely convert that string into a number, you can just use Double(yourstring) or Int(yourstring) type cast, or the more academic way:

let formatter = NumberFormatter()
let theNumber: NSNumber = formatter.number(from: yourTextField.text)!
Related