I'm using below algorithm to mask phone number as "(###) ### ## ##". When users start typing in UITextfield, It works great. However, when I delete a space or parentheses then write a number, It add one more number to the textfield and It becomes like "(###) ### ## ###". Where am I doing wrong?
Algorithm:
func applyPatternOnNumbers(pattern: String = "(###) ### ## ##", replacmentCharacter: Character = "#") -> String {
var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
for index in 0 ..< pattern.count {
guard index < pureNumber.count else { return pureNumber }
let stringIndex = String.Index(encodedOffset: index)
let patternCharacter = pattern[stringIndex]
guard patternCharacter != replacmentCharacter else { continue }
pureNumber.insert(patternCharacter, at: stringIndex)
}
return pureNumber
}
How I implement it:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text {
phoneLbl.text = text.applyPatternOnNumbers()
}
}
By the way, I'm open to new ways to do it. I checked below posts and AnyFormatterKit framework but nothing helped me.