如何限制在文本字段中输入的年份的大小
How can I limit the size of the year entered on the text field
我正在尝试为信用卡有效期创建一个文本字段并使用以下代码。
if range.length > 0 {
return true
}
if string == "" {
return false
}
if range.location > 6 {
return false
}
var originalText = textField.text
let replacementText = string.replacingOccurrences(of: " ", with: "")
if !CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: replacementText)) {
return false
}
if range.location == 4 {
originalText?.append("/")
textField.text = originalText
}
return true
但是,使用该代码用户可以编写 5145/52,这对于到期日期来说是不正常的。如何将年份限制在 2000 到 2018 之间以及月份值 01 到 12 之间?
通常,输入文本的格式及其验证是两个不同的问题。 NSRegularExpression
真是个好地方。这里有一个日期验证示例,年份在 2000-2099 范围内,月份在 01-12 之间。
func validate(string: String) -> Bool {
let regex = try! NSRegularExpression(pattern: "^(20)\d\d[/](0[1-9]|1[012])$")
return regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.characters.count)) != nil
}
validate(string: "2012/02") // true
validate(string: "2012/2") // false
validate(string: "1912/12") // false
validate(string: "2012/112") // false
更新:
在你的情况下它看起来像这样:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.count + string.count - range.length
let characterSet = CharacterSet(charactersIn: string)
if text.characters.count == 4, !string.characters.isEmpty {
textField.text = text + "/"
}
return CharacterSet.decimalDigits.isSuperset(of: characterSet) && newLength <= 7
}
func textFieldDidEndEditing(_ textField: UITextField) {
guard let text = textField.text else { return }
let isUserInputValid = validate(string: text)
if !isUserInputValid {
//TODO: Notify user that expiration date is invalid
}
}
我正在尝试为信用卡有效期创建一个文本字段并使用以下代码。
if range.length > 0 {
return true
}
if string == "" {
return false
}
if range.location > 6 {
return false
}
var originalText = textField.text
let replacementText = string.replacingOccurrences(of: " ", with: "")
if !CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: replacementText)) {
return false
}
if range.location == 4 {
originalText?.append("/")
textField.text = originalText
}
return true
但是,使用该代码用户可以编写 5145/52,这对于到期日期来说是不正常的。如何将年份限制在 2000 到 2018 之间以及月份值 01 到 12 之间?
通常,输入文本的格式及其验证是两个不同的问题。 NSRegularExpression
真是个好地方。这里有一个日期验证示例,年份在 2000-2099 范围内,月份在 01-12 之间。
func validate(string: String) -> Bool {
let regex = try! NSRegularExpression(pattern: "^(20)\d\d[/](0[1-9]|1[012])$")
return regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.characters.count)) != nil
}
validate(string: "2012/02") // true
validate(string: "2012/2") // false
validate(string: "1912/12") // false
validate(string: "2012/112") // false
更新:
在你的情况下它看起来像这样:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.count + string.count - range.length
let characterSet = CharacterSet(charactersIn: string)
if text.characters.count == 4, !string.characters.isEmpty {
textField.text = text + "/"
}
return CharacterSet.decimalDigits.isSuperset(of: characterSet) && newLength <= 7
}
func textFieldDidEndEditing(_ textField: UITextField) {
guard let text = textField.text else { return }
let isUserInputValid = validate(string: text)
if !isUserInputValid {
//TODO: Notify user that expiration date is invalid
}
}