Problème de Passage de US en FR

j’ai des champs de saisie textfield que je transforme en double pour faire des calculs
quand je suis en language Americain cela fonctionne correctement
séparateur . au clavier

mais cela ne fonctionne plus quand je suis en language Francais avec le séparateur ,
au clavier

Comment faire pour cela fonctionne dans les 2 cas
toujours ces problèmes d’internationalisation !!

Naïvement, un truc comme ça ?

let newValue = value
    .replacingOccurrences(of: ",", with: ".")
    .replacingOccurrences(of: ".", with: Locale.current.decimalSeparator ?? ".")

Tu remplaces les virgules par des points, puis les points par le décimal séparateur de la locale actuelle (ou par un point si le séparateur donné vaut nil)

1 J'aime

Petite question, comment à tu réussi à trouver ce genre de fonction ? Parce que pour le trouver dans la documentation c’est assez bien « « caché » ».

En tous cas je te remercie de la découverte je cherchais exactement une fonction capable de faire ce genre de chose !

Alors pour replacingOccurrences c’est une fonction de base des chaînes de caractères que tu trouves dans à peu près tous les langages évolués, avec un nom différent à chaque fois, mais la fonction est grosso modo toujours la même.

Concernant le séparateur décimal, c’est lié à la langue, c’est donc naturellement qu’il fallait chercher dans la classe Locale.

Après, malheureusement, c’est aussi l’expérience qui aide à trouver ce genre de choses, mais je te conseille de te plonger régulièrement dans les documentations des classes de bases, ne serait-ce que pour découvrir ce qui existe. Et franchement, on n’a pas à se plaindre, la doc apple est plutôt claire. Ce qui n’est pas le cas de toutes, loin de là.

1 J'aime

merci letatas

j’ai trouvé çà qui est plus général

// Using number formatters to handle separators and decimal symbols for different countries
let formatter = NumberFormatter()

formatter.locale = Locale.current
formatter.numberStyle = .decimal

let numberUSA = formatter.number(from: « 9,999.99 ») // 9999.99

let usLocale = Locale(identifier: « en_US »)
let frenchLocale = Locale(identifier: « fr_FR »)
let germanLocale = Locale(identifier: « de_DE »)
formatter.locale = frenchLocale

let numberFrance2 = formatter.number(from: « 9 999,99 ») // 9999.99

2 J'aimes

Oui effectivement, c’est la bonne façon de faire.

Petite précision : n’oublie pas que depuis iOS 13 (je crois) il faut différencier la locale du device et la locale de l’application.

Par exemple tu peux lancer l’application en anglais sur un iPhone en français, dans ces cas là, plutôt que d’utiliser la Locale.current je te préconise cette petite extension qui fait le job :

public extension Locale {
    /// Returns the preferred locale used in the app, if none is found, returns `Locale.current`
    static var appCurrent : Locale {
        if let preferred = Bundle.main.preferredLocalizations.first {
            return Locale(identifier: preferred)
        }
        else {
            return current
        }
    }
}

Ainsi tu utilises formatter.locale = Locale.appCurrent pour t’éviter les déconvenues des utilisations parfois hors du commun de certains utilisateurs.

Merci pour ces informations de plus en plus précises

1 J'aime