Skip to content

Instantly share code, notes, and snippets.

@st-small
Created October 6, 2017 17:36
Show Gist options
  • Save st-small/bac1d0b455c3d37e0686d7eef4789848 to your computer and use it in GitHub Desktop.
Save st-small/bac1d0b455c3d37e0686d7eef4789848 to your computer and use it in GitHub Desktop.
checkPhoneNumber
func checkPhoneNumber(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let validationSet = NSCharacterSet.decimalDigits.inverted
let components = string.components(separatedBy: validationSet)
guard components.count == 1 else { return false }
guard var newString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else { return false }
let validComponents = newString.components(separatedBy: validationSet)
newString = validComponents.joined(separator: "")
let localNumberMaxLength = 7
let areaCodeMaxLength = 3
let countryCodeMaxLength = 3
if newString.count > (localNumberMaxLength + areaCodeMaxLength + countryCodeMaxLength) {
return false
}
var resultString = ""
let localNumberLength = min(newString.count, localNumberMaxLength)
if localNumberLength > 0 {
let offset = newString.count - localNumberLength
let number = String(describing: newString.suffix(from: String.Index.init(encodedOffset: offset)))
resultString.append(number)
if resultString.count > 5 {
resultString.insert("-", at: String.Index.init(encodedOffset: 5)) // XXXXX-XX
}
if resultString.count > 3 {
resultString.insert("-", at: String.Index.init(encodedOffset: 3)) // XXX-XX-XX
}
}
if newString.count > localNumberLength {
let areaCodeLength = min((newString.count - localNumberMaxLength), areaCodeMaxLength)
let start = newString.index(newString.startIndex, offsetBy: (newString.count - localNumberMaxLength - areaCodeLength))
let end = newString.index(newString.startIndex, offsetBy: (newString.count - localNumberMaxLength))
let area = "(\(newString[start..<end])) "
resultString = "\(area)\(resultString)"
}
if newString.count > localNumberLength + areaCodeMaxLength {
let countryCodeLength = min((newString.count - localNumberMaxLength - areaCodeMaxLength), countryCodeMaxLength)
let countryCode = "+\(newString[newString.index(newString.startIndex, offsetBy: 0)..<newString.index(newString.startIndex, offsetBy: countryCodeLength)]) "
resultString = "\(countryCode)\(resultString)"
}
textField.text = resultString
return false
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment