Как отформатировать мобильный номер с персидскими цифрами в Swift? - PullRequest
0 голосов
/ 21 апреля 2019

Я использую это расширение для создания мобильного формата в текстовом поле, но оно не работает с персидскими числами [۰۱۲۳۴۵۶۷۸۹]

   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
     }
}

для использования

let mobile = "+18004449999"
let pattern = "+# (###) ###-####"
textfield.text = mobile.applyPatternOnNumbers(pattern: pattern)
// result +1 (800) 4444-9999

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Правильный шаблон регулярного выражения будет [^۰-۹0-9], но вы используете String.Index.init(encodedOffset:) неправильно. (Многие программисты используют его неправильно, поэтому в Swift 5 это устарело.)

Я немного переписал ваше расширение, чтобы оно работало со Swift 5 и более поздними версиями:

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
    }
}

Примеры:

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 +۰۹ (۸۹۱) ۲۳۴-۵۶۷۸
}

Пожалуйста, попробуйте.

0 голосов
/ 21 апреля 2019

Это из-за:

var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)

[^0-9] должно быть [^۰-۹] | [^0-9]:

var pureNumber = self.replacingOccurrences( of: "[^۰-۹] | [^0-9]", with: "", options: .regularExpression)

Таким образом:

let mobile = "+۰۱۲۳۴۵۶۷۸۹۹"
let pattern = "+# (###) ###-####"
let result = mobile.applyPatternOnNumbers(pattern: pattern)
print(result) // ++ (۰۱۲) ۳۴۵-۶۷۸۹۹
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...