1

在我的项目中,我计划将任何类型数字的语言更改为波斯语,这就是我所做的:

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 = "ییسس ۱۲۳۴"

用这种类型不做任何其他事情。

4

1 回答 1

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)
于 2018-07-23T17:44:45.813 回答