NumberFormatter monnaie €
Bonjour tous le monde,
Je rencontre un petit problème pour le format monnaie que je veux utiliser :
ui_pric = (person["price"] as? String)!
print("fffff",ui_pric)
let number = NSDecimalNumber(decimal: 10000000)
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.maximumFractionDigits = 0
formatter.locale = Locale(identifier: "fr_FR")
let nombre = formatter.string(from: number)
print(nombre!)
Ce que je voudrai faire :
ui_pric = (person["price"] as? String)!
print("fffff",ui_pric)
let number = NSDecimalNumber(decimal: ui_pric )
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.maximumFractionDigits = 0
formatter.locale = Locale(identifier: "fr_FR")
let nombre = formatter.string(from: number)
print(nombre!)
Cela ne fait un erreur.
Merci de votre aide,
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quelle erreur ?
Mon avis ? Tu dis que ui_pric est un "String", dans le cas qui fonctionne, tu passes un nombre en paramètre, mais pas dans le cas qui ne fonctionne pas. Regarde si tu as une alternative, ou alors convertit String en Int (ou Float)
Beurk .. Tu lis un dictionnaire en convertissant le résultat en un String?, forcé immédiatement après en String. Si "price" n'existe pas dans le dictionnaire, c'est le plantage assuré.
Tu as encore des problèmes avec l'utilisation des optionals. L'opérateur ! c'est le MAL .. >:D
Une variante qui fonctionne :
a
" "
a
Ton problème venait du fait qu'une String n'est pas un Decimal. NSDecimalNumber a plusieurs variantes, selon la donnée à convertir. Toi tu as besoin de :
a
a
L'auto-complétion d'Xcode permet de connaà®tre les variantes d'une fonction, sans fouiller dans la documentation :
Merci beaucoup ça fonctionne
Tu continues à utiliser les !!!!!!!!!!!!!
Surtout avec les lignes comme :
Qu'est-ce qu'il arrive si le clé n'existe pas ?
Qu'est-ce qu'il arrive si la conversion vers String s'échouait ?
Il faut utiliser le guard comme :
Mais, je te demanderais, pourquoi stocker les valeurs numériques comme string ?
Et pourquoi récupérer un valeur en string pour le passer à un NumberFormatter pour le mettre en string ?
J'ai pensé la même chose, puis je me suis dit qu'il n'est peut-être pas responsable du format du dictionnaire. Que c'est probablement un flux de donnés venant d'un serveur.
OUi c'est cela je récupérer l'information d'un serveur.
Merci a vous,
J'ai un petit problème, j'essaye de faire une condition mais ça donne rien :
Merci a vous,
Tu as juste besoin de tester si "price" existe dans le dictionnaire
Mon cher easyd - pourquoi tu continues à ignorer nos conseils ? Pourquoi tu continues à répéter le même code avec ls même fautes ?
Et su connais, totalement sans doute, le format des données ? Il ne soit pas possible que quelqu'un puisse faire une erreur en les saisissant ?
En plus de ce que Draken a dit :
Pourquoi tu initialises ui_pric1 avant de le modifier ? Et, si tu ne prévois changer la valeur, tu devrais utiliser un let.
Il suffirait de faire :
Mais, comme nous avons déjà discuté, cette ligne est vraiment dangereux.
Il faut - sans question - sans argument - faire les tests à chaque étape.
Il y a, au moins, trois options probables pour la valeur que aurait pû être stocké dans le dictionnaire :
Avec le code test :
Su tu ne fais pas ces tests, ton appli va exploser sans explication pour l'utilisateur >:(
On peut, bien sûr, simplifier ce code mais je l'ai écrit comm ça pout te montrer clairement le minimum de tests qu'il fasse faire.
Bonjour tous le monde,
Merci pour ton aide.
Je vient de faire le changement avec le 2 choix, mais cela ne me donne rien pas de résultat.
quant il y a pas de prix c'est un zéro.
Voilà mon code :
Merci de votre aide,
Donc, tu as un problème - peut-être le même problème d'extraction des valeurs d'un dictionnaire ?
À part du fait que tu continues à utiliser les lignes comme :
... tu postes plus code :
1. qui est moche et plein d'erreurs.
2. n'a rien à voir avec ton problème.
3. contient les noms des var qui ne sont pas descriptifs
4. contient les vars qui ne sont jamais utilisés
5. contient les erreurs de logique
6. le code pour la requête est particulièrement mal écrit ; tu n'a pas utilisé le try .. catch correctement
Et il y a plusieurs autres fautes, trop nombreux pour les lister.
Si tu veux de l'aide avec tes problèmes, il faut demander plus précisément et prendre compte des conseils que nous t'avons déjà donné.
S'il te plaà®t arrêtes d'ignorer les conseils en présentant le code qui contient les problèmes dont tu as déjà reçu les corrections.
Si j'étais disposée de t'aider, il me mettrait beaucoup de temps de le faire ; tu veux que je t'envoie un devis avant ? :-*
Oh, et pour :
Tu comprends que NSNull n'est pas la même chose que nil ?
Pour tester si la valeur dans le dictionnaire est valide, il faut qqch. comme :
Mais ce code doit échouer parce que person est un dictionnaire de [String : AnyObject] et, même avec le point d'exclamation de mort, le transformation vers String n'est jamais possible, parce que String est une struct, pas une classe et, du coup, ne peut pas être comparé avec NSNull.
S'il est prévu de stocker les Strings dans un dictionnaire, il faut utiliser [String : Any].
Bonjour,
Je comprend ce que tu veux dire et te remercie pour ces suggestions.
Je vais faire plus d'efforts a ce niveau là .
Je comprend mais je suis confrontée a moi même, j'ai personne avec qui discuter des différente problématique que je rencontre.
Voilà pourquoi votre aide mais très importante, cela me permet d'avancer a petits pas.
Votre forum et le seul a aider ce qui bloque, beaucoup d'autre ne font pas d'effort comme vous.
Voilà ce que j'avais a dire ce matin et encore merci a vous tous se de vos aides.
OK. Mais tu dois nous dire pourquoi tu continues à utiliser les '!' partout.
Est-ce que c'est parce que le compilateur le propose comme solution ?
Si oui, tu dois comprendre que le compilateur essaie d'être obligeant mais, en fait, ces suggestions ne prennent pas compte des effets secondaires.
Je crois que la plupart de tes problèmes commencent parce que tu n'as pas lu et compris les docs sur les APIs.
Je commence avec l'acquisition des données JSON.
Les seules types que l'on trouve dans un objet JSON sont : NSString, NSNumber, NSArray, NSDictionary ou NSNull. Du coup, tu devrais, tout d'abord, tester pour ces types.
Mais avant tout ça, il faut acquérir l'objet correctement.
Si j'ai bien compris, l'intention de :
... est de vérifier si l'article existe déjà ou non ?
Si oui, tu as utilisé un API deprecated :
et, en plus, tu as ignorer l'avertissement dans les docs :
Du coup, le code que tu as écrit est bien mauvais, dangereux et puisse embêter l'utilisateur lorsque l'appli se bloque.
Du code plus correcte serait :
Beaucoup plus facile.
Merci encore,
Juste pour information sur mon code :
1/ Dans cette partie je vérifie que l'utilisateur est logué. S'il n'ai pas loger je le redirige vers un storyboard pour ce loger ou s'inscrire puis quant il ce logé cela revient sur le storyboard du produit et il s'enregistre dans les favori.
2/ S'il est il continue l'action et enregistre dans la favoris le produit qu'il regarde (avec les info email, ref. produit et type produit 2 ou 3).
Voilà les réponses du serveur :
1/ Enregistrement dans la BDD :
2/ Existe dans la BDD :
Voilà , merci de ton aide,
Après que tu as vérifié que les corrections que je t'ai donné marchent ou non, nous pouvons aller plus loin. Du coup, j'ignore ton dernier message jusqu'à là .
OK , Juste une question
handle and display error using response data ???
handle and display error ??
J'ai déjà
fait cela :
Voilà ,
Traduction - gérer et afficher l'erreur (en utilisant response)
Et l'erreur de "unrecognised selector ..." c'est parce que tu as copié/collé mon code sans le vérifiant. Regardes ton ancien code ; la méthode à un paramètre qui manque la mienne.
Bonjour,
Voilà ce que j'ai fait
Mais j'ai cette erreur :
j'espère avoir bien compris???
Aouch.
J'ai pas regarder le reste, mais ça me pose beaucoup de souci ça.
Pourtant, tu sembles déjà utiliser URLSession, notamment pour les images, donc tu sembles comprendre que cela fait déjà une requête ça. Alors pourquoi est-ce que dedans tu fais NSURLConnection.sendSynchronousRequest sur la même URLRequest?
Tu as déjà effectué la requête, tu as déjà data, response et error !
Regarde juste s'il y a error est non nil. Ensuite, regarde le status code potentiel de response. Ensuite, bah lis data.
je vient de faire la modification
Merci a toi,
Avez-vous un exemple.
Qui explique la fonction.
Je suis désoler mes je comprend que de cette façon.
je n'arrive pas a assimiler cette logique que demande Apple, sous php je rencontre pas trop de problème de dev et je vais plus vite mais là je suis perdu et je reste avec mes frustration.
Quelle fonction ? Quelle partie exactement ?
Voilà comment j'ai fait avec des commentaire :
j'espère que cela va.
Bah non !
Est-ce que tu as essayé de lire les docs sur URLSession, HTTPURLResponse et les autres types qui s'utilisent ici ?
Tu ne travaille pas en php. La programmation "native" est tout différente. Il faut étudier, pas seulement comment copier/coller le code des autres, mais comment programmer toi-même.
Encore une fois, je t'ai donné' du code. Encore une fois dans le code que tu as montré en réponse, tu as utilisé une ligne comme :
... qui utilise les "!", même après les interdictions innombrables
Oh, et si tu voulais faire quelque chose comme ça, tu pourrais le simplifier comme :
À la place de continuer de copier/coller le code des autres, sans comprehension, je te conseillerais d'abandonner ton projet jusqu'à tu as compris comment coder en Swift et comment lire les docs sur les APIs que tu veuilles utiliser.
Je te remerci de ta franchisse, quant j'ai appris le php je rencontré les même difficulté et maintenant je m'en sort au jourd'hui avec quelques projets qui tourne.
Ici j'ai du mal, même quant j'avais commancer à faire du C pur et dur dans mes étude de réseau.
Je vais et voudrai terminer ce projet, c'est pour moi un exploi et m'avous pas vaincu. Si non c'est un échec.
Je vous remerci de vos aides que vous m'avais apporter tous au long de ces mois et je serai reconnaissant de tous.
Je vous importunerai plus et vais continuer mon projet.
Merci à vous, et continuer comme cela kiss à aider les autre.
Malheureusement, Swift est, au même temps, similaire de C et tout différent de C.
En Swift, il y a une base de C mais, après ça, plusieurs qualités additionnelles.
Tu as eu pas mal de soucis avec les "!" ; peut-être je peux expliquer pourquoi avec quelque chose comme le fameux :
En -Swift, tu as le concept des valeurs optionnelles ; du coup, tu pourrais définir une var comme :
... et il ne faut pas l'initialiser parce que, implicitement, sa valeur est nil par défaut.
Si tu ne connaissais pas si priceString a été assigné une valeur ou non, tu pourrais l'accéder comme :
Oui, j'ai utilisé un "!" mais c'est seulement parce que j'ai auparavant vérifié que priceString n'est pas nil.
Mais, sans cette vérification, si j'avais écrit :
... ça pourrait échouer lors de l'exécution dans le cas que priceString soit nil.
Dans ton code :
... qu'est-ce qui se passe ?
person["price"] renvoie Any? ; c'est à dire que la valeur puisse être non-nil et de n'importe-quel type ou, qu'elle puisse être nil.
Donc, si j'ai bien deviné, tu as saisi quelque chose comme :
... et le compilateur t'a donné le message "Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?"
Puis tu as accepté la proposition d'un "Fix-it" d'introduire un "!" comme :
Ce qui t'aurais donné encore le même message mais avec un "Fix-it" de "Replace "person["price"]! as? String" with "(person["price"]! as? String)!"
Oui, tu as suivi les conseils du compilateur en acceptant le "Fix-it". Le code est compilé. Tout ira bien ??? Pas du tout !!!
En exécutant le code, ça pourrait arriver que person["price"] n'existe pas dans le dictionnaire ; du coup - Boummm ! L'appli s'échoue est disparaà®t devant l'utilisateur. Ce qui n'est pas cool ; ce qui est "very bad" !
C'est pour éviter ça que je t'ai conseillé plusieurs fois d'arrêter d'écrire cette façon de code.
Comme j'ai déjà dit, les "subscripts" comme person["price"] renvoie une valeur optionnelle - soit une valeur, soit nil ; ce que tu ne peux pas anticiper lorsque tu écris le code ; par conséquence tu dois, impérativement, le tester pour nil.
En plus, il faut réfléchir sur ce que tu fasses dans le cas échéant. Si il n'y a aucune valeur, qu'est-ce que présentes à l'utilisateur ?
Dans le cas de cet exemple, on a essayé d'assigner le résultat vers une var de type String (non-optionnelle) et c'est ça qui a provoqué la colère du compilateur.
Dans ce cas, il faut prendre les précautions. Tout d'abord, il faut vérifier que person["price"] existe dans le dictionnaire. Avec Swift, on peut faire la vérification et, si il y a bien une valeur dans le dictionnaire, l'assigner au même temps.
Maintenant, tu connais qu'il y a une valeur mais tu ne sais pas encore de quel type.
Si tu faisais quelque chose comme :
... ça pourrait passer par le "else" mais tu ne sauras pas la raison. C'était parce que il n'y avait aucune valeur ? Ou parce que il y avait une valuer mais elle n'était pas un String ?
Du coup, il faut faire les deux vérifications en deux étapes :
Oui, c'est beaucoup plus de code mais tu ne risque pas de déplaire tes utilisateurs quand ton appli se plante.
Or, nous avons parlé d'assigner une valeur qui provient d'un dictionnaire vers un String, avec tous les vérifications qui s'entrainent.
Mais, pour les occasions lorsque tu veux assigner la valeur dans le dictionnaire, en attendant qu'elle soit un String? (optionnelle), tu pourrais cout-circuiter un peu.
Si tu voulais assigner le valeur directement vers un UILabel, la propriété myLabel.text est de type String? (optionnelle) ; du coup, tu peux bien faire :
Dans ce cas :
1. si person["price"] renvoie nil, c'est bon parce que priceLabel.text accepte nil et la UILabel s'affiche comme vide.
2. s'il y a une valeur mais ell n'est pas un String?, c'est le même résultat.
Pour l'appli que tu essaies de faire, avec tous ces appels à un serveur, il te faut étudier plus sur les APIs comme URLSession, éviter d'utiliser les APIs deprecated, et prendre compte de la synchrone en faisant les appels asynchrones, en cas que l'utilisateur puisse perdre réseau à tout moment et ça puisse bloquer l'appli pour quelques minutes.
Continues à faire les petits pas et de nous dire comment ça passe. On est là pour t'aider mais il faut essayer d'être un meilleur apprenti 8--)
Bonjour et merci a toi pour tes conseilles très chaleureux.
Je vais faire de effort dans ce sens.
Voilà ,
Je vient de faire cela :
Et ça fonctionne très bien,
Merci,