如果是英语或阿拉伯语/波斯语,请检查数字的语言

时间:2017-07-20 16:33:16

标签: swift unicode persian nslocale farsi

在我的项目中,我打算将任何类型编号的语言更改为波斯语,这就是我所做的:

public extension String {
    func perstianString (string: String)->String {
        let digitSet = CharacterSet.decimalDigits
        var finalString = String()
        for ch in string.unicodeScalars {
            if digitSet.contains(ch) {
                let sh = convertoPersianNum(num: "\(ch)")
                finalString += sh
                }
            } else {
                finalString += "\(ch)"
            }
        }
        return finalString
    }

    func convertoPersianNum(num: String)->String{
        var retVlue = String()
        var num1 = num

        let number = NSNumber(value: Int(num1)!)

        let numb = (num as NSString).intValue
        let format = NumberFormatter()
        format.locale = Locale(identifier: "fa_IR")
        let faNumber = format.string(from: number)

        return faNumber!
    }
}

但是当源值有波斯数字时,应用程序崩溃了。简单地说,我想检查它是否是波斯数字,不做任何事情,否则进行上述转换:

let string = "ییسس ۱۲۳۴"

使用此类型不做任何其他事情。

1 个答案:

答案 0 :(得分:0)

public extension String {

    private var isPersian: Bool {

        let predicate = NSPredicate(format: "SELF MATCHES %@", "(?s).*\\p{Arabic}.*")
        return predicate.evaluate(with: self)
    }

    private var toPersianNum: String {

        let number = NSDecimalNumber(string: self)
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "fa_IR")
        return formatter.string(from: number) ?? ""
    }

    var persian:String {

        var retVal = String()

        self.enumerateSubstrings(in: startIndex..<endIndex, options: .byComposedCharacterSequences) { (string, _, _, _) in
            guard let string = string else {return}

            if string.isPersian {
                retVal += string
            }else {
                retVal += string.toPersianNum
            }
        }
        return retVal
    }
}


let string = "9001ییسس2345777 ۱۲۳۴2345"

string.persian // "۹۰۰۱ییسس۲۳۴۵۷۷۷ناعدد۱۲۳۴۲۳۴۵" (result)