[Résolu] String, map, reduce etc.
iLandes
Membre
Je me penche sur la saisie d'une somme dans un UITextField... J'ai quelques questions
J'ai trouvé ce petit morceaux de code
let aString = "$123.56"
let replaced = String(map(aString.generate()) {
$0 == "$" ? "+" : $0
})
Il fonctionne le résultat dans replaced est +123.56
Je souhaiterais supprimer le $ et obtenir 123.56
J'ai tenté
import Cocoa
var currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = .CurrencyStyle
currencyFormatter.locale = NSLocale(localeIdentifier: "en_US")
let cs = currencyFormatter.currencySymbol
let aString = "$123.56"
let replaced = String(map(aString.generate()) {
$0 == cs! ? "" : $0
})
Et
import Cocoa
var currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = .CurrencyStyle
currencyFormatter.locale = NSLocale(localeIdentifier: "en_US")
let cs = currencyFormatter.currencySymbol
let aString = "$123.56"
let replaced = String(map(aString.generate()) {
$0 == "$" ? "" : $0
})
Je ne comprends pas l'erreur. Je débute en programmation fonctionnelle
J'ai une solution old school qui fonctionne
var currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = .CurrencyStyle
currencyFormatter.locale = NSLocale(localeIdentifier: "en_US")
let cs = currencyFormatter.currencySymbol
let replacedOldSchool = aString.stringByReplacingOccurrencesOfString(cs!, withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
Mais je souhaite comprendre la programmation fonctionnelle
D'avance merci pour votre aide.
s
e
b
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Et ensuite c'est quoi l'erreur que tu as, sur quelle ligne ?
J'ai corrigé le premier bloque (erreur de copier / coller)
Le message est "Could not find an overload for "==" that accept the supplied arguments"
Il te dit juste qu'il ne sait pas faire un "==" entre "$0" et "cs!" (ou entre $0 et "$" dans ton autre test). Ce qui quand tu y penses est normal, car quand tu itères sur une String tu as des Character (donc $0 ici est de type Character)... et toi tu essayes de faire un == entre un Character et une String (ce qui n'est pas supporté, donc).
Faut caster cs! en un Character (ou à l'inverse caster $0 en une String) avant de pouvoir faire ton == tout simplement.
Ok je comprends mais le problème est aussi au niveau de la chaà®ne vide "". Dès que je supprime le "+" et que je met "" l'erreur revient.
Pour le moment j'ai ça
La closure / le bloc que tu passes à Map prend un Character en entrée... et manifestement un Character en sortie. Dans le cas où ton test fait retourner $0 au bloc ça va. Dans le cas où tu retournes "+" à la limite c'est une String mais j'imagine qu'il arrive quand même à la casser tout seul en Character puisqu'il veut un Character en sortie et que "+" est justement une String d'un seul caractère.
Mais si tu retournes "" alors tu ne peux pas dans ce cas créer un Character à partir une chaà®ne vide (ça ne correspond à aucun Character t'en as même pas dans cette chaà®ne "" de Character !)
Map ne sait produire que des tableaux en sortie qui sont de la même taille que le tableau sur lequel Map est appliqué. En appliquant une fonction / closure sur chaque élément pour produire le nouveau. Là tu pars d'une chaà®ne (une tableau de Character) et tu souhaites produire en sortie une chaà®ne d'une longueur potentiellement différente (un tableau de Character ayant un nombre différent d'éléments), forcément ça va pas coller.
A la limite faut plutôt utiliser reduce() dans ce cas.
Au top
Ce qui donne pour supprimer le symbole monétaire d'une String en swift :
Bon après :
1) j'aurais fait le cast de cs en Character à l'extérieur du reduce (), de sorte que cs soit directement de type Character, c'est plus simple ensuite
2) Dans ton cas particulier j'ai du mal à comprendre l'intérêt d'utiliser un NSNumberFormatter en mode currency pour ensuite enlever le symbole monétaire de la chaà®ne produite...
Soit tu utilises ton NSNumberFormatter en mode normal (non-currency) pour pas qu'il te mette le symbole monétaire, soit tu changes le currencySymbol de ton NSNumberFormatter pour le forcer à "" avant de demander le formattage de ton nombre en chaà®ne... non ?
1) Ok
2) Je me sers de NSNumberFormatter en mode currency pour récupérer les réglages par défaut de l'utilisateur (séparateur de millier, symbol monétaire)
Je cherche à utiliser une chaine saisie par l'utilisateur qui doit être une somme mais si l'utilisateur n'a pas complètement respecté le format je veux tout de même pouvoir l'utiliser par exemple je veux accepter "12€" comme "12,00€" ou même "12". Je cherche donc à débarrasser la chaine des éléments de formatage afin de la reformatter à partir d'un double.
Merci beaucoup pour ton aide
A ceci près que je n'autorise la saisie du symbole monétaire qu'une fois en début ou en fin de chaine ::)
c'est vrai que ce serait bien, je m'attaque à cela demain
Exemple pour la Macédoine ( NSLocale(localeIdentifier: "mk_MK") ) ou pour la monnaie Tchèque ( NSLocale(localeIdentifier: "cs_CZ") ), etc... où leur currencySymbol est composé de 2 ou 3 caractères...
Grrr "ден"
Du coup je pense que je vais garder la méthode OldSchool
En plus des caractères des strings classiques : séparateur millier, décimal, symbol et je récupère aussi maximumFractionDigits (2 pour le $ ou € ou 0 pour le Yen certainement 3 dans certaines monnaies). Du coup par soucis de clarté je récupère tout de NSNumberFormatter
Merci à tous,
J'ai finalement abandonné la saisie du symbole monétaire par l'utilisateur. Mes délégués permettent la saisie d'un nombre numérique avec séparateur décimal et un nombre de décimaux en relation avec les préférences monétaires de l'utilisateur. Une fois saisie le délégué transforme le nombre sous un format correspondant à la monnaie locale de l'utilisateur.
Un français peut saisir :
Il obtiendra
Un anglais peut saisir :
Il obtiendra
Etc. Pour plus d'information j'ai regroupé les informations collectées ici dans un projet sous GitHub. Vos appréciations et commentaires sont les bienvenus.
Un grand merci à tous
http://ilandes.github.io/RSDCurrencyTextFieldSampleCode/
J'ai regardé mais je n'ai pas trouvé le nombre de décimal après la virgule dans une somme
Peut-être que je vois mal