amin
amin

Reputation: 481

How to format mobile number with Persian numerals in Swift?

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

Answers (2)

OOPer
OOPer

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

Ahmad F
Ahmad F

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

Related Questions