Reputation: 13
In my app, there is a place where the user has to enter a decimal into a text field. However, I do not know how to restrict a text field to only valid decimals. I tried an example here, but the text field still lets me input more than one decimal point, lets me put a decimal point in the beginning of the text field, and it doesn't let me delete characters. How do you restrict a text field to only valid decimals? Thanks!
Upvotes: 1
Views: 1779
Reputation: 847
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
let textFieldString = textField.text! as NSString;
var newString = textFieldString.stringByReplacingCharactersInRange(range, withString:string)
let floatRegEx = "^([0-9]+)?(\\.([0-9]+)?)?$"
let floatExPredicate = NSPredicate(format:"SELF MATCHES %@", floatRegEx)
return floatExPredicate.evaluateWithObject(newString)
}
Upvotes: 1
Reputation: 1047
Here's what I've tried and works for me.
// TextField Delegate
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
if string.isEmpty { return true }
let currentLocale = NSLocale.currentLocale()
let decimalSeparator = currentLocale.objectForKey(NSLocaleDecimalSeparator) as! String
let existingTextHasDecimalSeparator = textField.text?.rangeOfString(decimalSeparator)
let replacementStringHasDecimalSeparator = string.rangeOfString(decimalSeparator)
let allowedCharactersSet = NSCharacterSet(charactersInString: decimalSeparator + "0123456789")
let allowedCharacters = string.rangeOfCharacterFromSet(allowedCharactersSet)
if existingTextHasDecimalSeparator != nil && replacementStringHasDecimalSeparator != nil || allowedCharacters == nil
{
return false
}
else
{
return true
}
}
Upvotes: 0
Reputation: 1278
In the link that you have provided in the question the code checks only for one decimal place. You have to modify your code as follows. I am quoting the code from the link that you provided
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
//Textfield delegates
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return false to not change text
// max 2 fractional digits allowed
let newText = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
let regex = try! NSRegularExpression(pattern: "\\..{3,}", options: [])
let matches = regex.matchesInString(newText, options:[], range:NSMakeRange(0, newText.characters.count))
guard matches.count == 0 else { return false }
switch string {
case "0","1","2","3","4","5","6","7","8","9":
return true
case ".":
let array = textField.text?.characters.map { String($0) }
var decimalCount = 0
for character in array! {
if character == "." {
decimalCount++
}
}
if decimalCount > 0 {
return false
} else {
return true
}
default:
let array = string.characters.map { String($0) }
if array.count == 0 {
return true
}
return false
}
}
}
Hope this helps
Upvotes: 0