Reputation: 481
I use this extension to create mobile format in text Field, but it does not work in Persian numbers [۰۱۲۳۴۵۶۷۸۹]
extension String{
func applyPatternOnNumbers(pattern: String) -> String {
let replacmentCharacter: Character = "#"
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
}
}
to use
let mobile = "+18004449999"
let pattern = "+# (###) ###-####"
textfield.text = mobile.applyPatternOnNumbers(pattern: pattern)
// result +1 (800) 4444-9999
Upvotes: 0
Views: 268
Reputation: 47876
The right regex pattern would be [^۰-۹0-9]
, but your usage of String.Index.init(encodedOffset:)
is wrong. (Many programmers use it wrongly, so it is deprecated in Swift 5.)
I have rewritten your extension a little more to make it work with Swift 5 and later:
extension String{
func applyPatternOnNumbers(pattern: String) -> String {
let replacmentCharacter: Character = "#"
let pureNumber = self.replacingOccurrences( of: "[^۰-۹0-9]", with: "", options: .regularExpression)
var result = ""
var pureNumberIndex = pureNumber.startIndex
for patternCharacter in pattern {
if patternCharacter == replacmentCharacter {
guard pureNumberIndex < pureNumber.endIndex else { return result }
result.append(pureNumber[pureNumberIndex])
pureNumber.formIndex(after: &pureNumberIndex)
} else {
result.append(patternCharacter)
}
}
return result
}
}
Examples:
do {
let mobile = "+18004449999"
let pattern = "+# (###) ###-####"
let result = mobile.applyPatternOnNumbers(pattern: pattern)
print("result \(result)") //->result +1 (800) 444-9999
}
do {
let mobile = "+۰۹۸۹۱۲۳۴۵۶۷۸۹"
let pattern = "+## (###) ###-####"
let result = mobile.applyPatternOnNumbers(pattern: pattern)
print("result \(result)") //->result +۰۹ (۸۹۱) ۲۳۴-۵۶۷۸
}
Please try.
Upvotes: 1
Reputation: 31645
That's because of:
var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
[^0-9]
should be [^۰-۹] | [^0-9]
:
var pureNumber = self.replacingOccurrences( of: "[^۰-۹] | [^0-9]", with: "", options: .regularExpression)
Thus:
let mobile = "+۰۱۲۳۴۵۶۷۸۹۹"
let pattern = "+# (###) ###-####"
let result = mobile.applyPatternOnNumbers(pattern: pattern)
print(result) // ++ (۰۱۲) ۳۴۵-۶۷۸۹۹
Upvotes: 0