Saeed Rahmatolahi
Saeed Rahmatolahi

Reputation: 1338

How to use NSFormatter number for Persian or Arabic number in array in swift 3?

I know how to use NSFormatter Number for converting English numbers to Persian/Arabic numbers but the problem is that I have an Array and want to convert all of the numbers in the array to Persian/Arabic numbers.

How can I do that? please help.

Here is the code for one number :

let numberFormatter = NumberFormatter()
    numberFormatter.locale = Locale(identifier: "fa")
    numberFormatter.numberStyle = NumberFormatter.Style.decimal

    numberFormatter.string(from: NSNumber(value: checkNumber))
    let persianNumber = numberFormatter.string(from: NSNumber(value: checkNumber))!

As you see, I can convert one number (checkNumber is English Number and persianNumber is Persian/Arabic Number)

Upvotes: 1

Views: 802

Answers (2)

Mahdi Moayeri
Mahdi Moayeri

Reputation: 36

create swift file and apend this extension

extension String {


 func englishToPersian() -> String{
    var sum = ""
    let letters = self.characters.map { String($0) }
    for letter in letters {
        if (Int(letter) != nil) {
            let persianNumber = ["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"]
            sum = sum+persianNumber[Int("\(letter)")!]
        } else {
            sum = sum+letter
        }
    }
    return sum
 }

 func persianToEnglish() -> String{
    var sum = ""
    let letters = self.characters.map { String($0) }
    let persianNumber = ["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"]
    for letter in letters {
        for (index, element) in persianNumber.enumerated() {
            if letter == element {
                sum = sum + "\(index)"
            }
        }
    }
    return sum
 }

}

use this 😊

let strEnglish1 = "1234567890"
strEnglish1.englishToPersian() // ۱۲۳۴۵۶۷۸۹۰

let strEnglish2 = "1200 toman"
strEnglish2.englishToPersian() // ۱۲۰۰ toman

let strPersian1 = "۱۲۳۴۵۶۷۸۹۰"
strPersian1.persianToEnglish() // 1234567890

let strPersian2 = "۱۲۰۰  تومان"
strPersian1.persianToEnglish() // ۱۲۰۰  تومان

Upvotes: 1

deadbeef
deadbeef

Reputation: 5563

I'm not sure I understand your question, but I think a simple for loop will do what you want.

The important thing is to get rid of the optional String that you get from the number formatter because you can't append optional strings (String?) to an array of strings ([String]). You can use the nil coalescing operator (??) to fallback to the empty string ("") when the result from the number formatter is nil.

let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale(identifier: "fa")
numberFormatter.numberStyle = .decimal

let arrayOfNumbers = [1, 2, 3]
var arrayOfStrings = [String]()

for number in arrayOfNumbers {
    let string = numberFormatter.string(from: number as NSNumber) ?? ""
    arrayOfStrings.append(string)
}

Even better, you could use the map function instead of a for loop.

let arrayOfStrings = arrayOfNumbers.map { (number) in
    return numberFormatter.string(from: number as NSNumber) ?? ""
}

Upvotes: 1

Related Questions