Saltar al contenido

¿Cómo convertir números arábigos a números ingleses en Swift?

Este post ha sido analizado por expertos así garantizamos la veracidad de nuestro tutorial.

Solución:

Necesitas convertir el número arábigo string al inglés primero y luego hacer la parte de cálculo.

    let numberStr: String = "٨٦٩١٢٨٨١"
    let formatter: NumberFormatter = NumberFormatter()
    formatter.locale = NSLocale(localeIdentifier: "EN") as Locale!
    let final = formatter.number(from: numberStr)
    let doubleNumber = Double(final!)
    print("(doubleNumber)")

Solución Swift-5 para todos los no latinos string ocurrencias

extension String 
    var containsNonEnglishNumbers: Bool 
        return !isEmpty && range(of: "[^0-9]", options: .regularExpression) == nil
    

    var english: String 
        return self.applyingTransform(StringTransform.toLatin, reverse: false) ?? self
    

uso –

textField.addTarget(self, action: #selector(didChangeText(field:)), for: .editingChanged)

@objc func didChangeText(field: UITextField) 
    if ((field.text?.containsNonEnglishNumbers) != nil) 
        field.text = field.text?.english
    

De cualquier idioma, a cualquier idioma

con la siguiente extensión, puedes hacerlo:

extension String 
    private static let formatter = NumberFormatter()

    func clippingCharacters(in characterSet: CharacterSet) -> String 
        components(separatedBy: characterSet).joined()
    

    func convertedDigitsToLocale(_ locale: Locale = .current) -> String 
        let digits = Set(clippingCharacters(in: CharacterSet.decimalDigits.inverted))
        guard !digits.isEmpty else  return self 

        Self.formatter.locale = locale
        let maps: [(original: String, converted: String)] = digits.map 
            let original = String($0)
            guard let digit = Self.formatter.number(from: String($0)) else 
                assertionFailure("Can not convert to number from: (original)")
                return (original, original)
            
            guard let localized = Self.formatter.string(from: digit) else 
                assertionFailure("Can not convert to string from: (digit)")
                return (original, original)
            
            return (original, localized)
        

        var converted = self
        for map in maps  converted = converted.replacingOccurrences(of: map.original, with: map.converted) 
        return converted
    


Uso

"12345".convertedDigitsToLocale(Locale(identifier: "FA")) /* ۱۲۳۴۵ */
"۱۲۳۴۵".convertedDigitsToLocale(Locale(identifier: "EN")) /* 12345 */

Si te ha sido de ayuda este post, sería de mucha ayuda si lo compartes con más juniors y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *