首页 > 解决方案 > 如何在 Swift 中的 UITextField 上应用手机号码模式

问题描述

我需要获取波斯语英语的用户手机号码。并应用电话号码模式显示。 我找到了两个解决方案,每个都有一个问题

1号:

extension String{
    func applyPatternOnNumbers(pattern: String) -> String {
        let  replacmentCharacter: Character = "#"
        var pure = self.replacingOccurrences( of: "[^۰-۹0-9]", with: "", options: .regularExpression)
        for index in 0 ..< pattern.count {
            guard index < pure.count else { return pure }
            let stringIndex = String.Index.init(encodedOffset: index)
            let patternCharacter = pattern[stringIndex]
            guard patternCharacter != replacmentCharacter else { continue }
            pure.insert(patternCharacter, at: stringIndex)
        }
       return pure
    }
 }

在编辑中使用已更改

class ViewController: UIViewController, UITextFieldDelegate {

    let textField = UITextField()
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.frame = CGRect(x: 10, y: 50, width: 300, height: 50)
        textField.delegate = self
        textField.backgroundColor = UIColor.lightGray
        textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        self.view.addSubview(textField)
    }

    @objc func editingChanged(){
        let pattern = "+# (###) ###-####"
        let mobile = textField.text
        textField.text = mobile!.applyPatternOnNumbers(pattern: pattern)
    }
}

当数字输入为英文时,例如 +1800444777,结果为 // +1 (800) 444-7777

但是当输入波斯数字时,例如 +10004447777,结果是这样的 // +۱ (۸۩ ´۷۷۷

2号:

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

使用此方法与上一个方法相同此方法适用于英语和波斯语

英语“+1800444777”结果是//+1 (800) 444-7777 波斯语“+18000444777”结果是//+۱ (۸۰۰) ۴۴۴-۷۷۷۷

但问题是 space& -, (, ),+字符在编辑时不能被删除textfield

标签: iosswiftregexstring

解决方案


请将 2 号分机替换为以下内容:

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 {
            guard pureNumberIndex < pureNumber.endIndex else { return result }
            if patternCharacter == replacmentCharacter {
                result.append(pureNumber[pureNumberIndex])
                pureNumber.formIndex(after: &pureNumberIndex)
            } else {
                result.append(patternCharacter)
            }
        }
        return result
    }
}

这个更新的代码检查是否pureNumberIndex到达最后,比前一个版本早一点。

随着这种变化,pattern需求以replacmentCharacter. 我希望您列出的所有模式都以"#".


推荐阅读