Conversion en intergerValue supprime le 0

Jean75Jean75 Membre
décembre 2014 modifié dans API UIKit #1

Hello


 


Lors de ma conversion de 02 de String vers Int il me le passe en "2"


 


Quelqu'un pourrait m'aider pour qu'il m'affiche 02 et non 2 s'il vous plait ? c'est dans le cadre d'une date



NSString* currentDay = [dateRecup substringWithRange:NSMakeRange(0,2)];
NSLog(@Current Day %@", currentDay);
NSInteger jourCourant = [currentDay integerValue];
NSLog(@Jour Courant %@", jourCourant);


 


Current Day 02


Jour Courant 2



 


Réponses

  • Pourquoi tu gardes pas ton currentDay qui affiche bien le bon format ?


     


    Après logique que l'integer vire le 0, t'écrit pas un chiffre 02 en int.


  • Je vois pas trop l'intérêt si ça marche dans le premier cas de complexifier le système pour créer un cas d'erreur. Mais bon au lieu de faire un NSInteger tu pourrais faire un NSNumber qui offre des options de formatage.


    Sinon en travaillant directement sur le chiffre me semble qui c'est 



    NSLog(@Jour Courant %02d, (int)jourCourant];

    Si c'est pas exactement ça tu peux trouver la syntaxe exacte sur google facilement.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Il vaut mieux d'utiliser NSNumberFormatter pour montrer les chiffres selon les règles de localisation et de format de l'utilisateur.


  • Pourquoi vouloir complexifier ?


     


    Cela dans le but d'avoir un int et pas un string ;)


     


    En fait j'ai ma date au format français et je doit la passer au format américain


     


    En outre la passer de 08/12/2014 15:43 à  2014-12-08 15:43:46 +0000 (je présume que +0000 est la locale)


  • Pour changer le format de date utilise NSDateFormater sur ta date initiale plutôt que d'essayer de faire ton formatage perso !


  • CéroceCéroce Membre, Modérateur

    (je présume que +0000 est la locale)

    Non, c'est le décalage horaire.
  • Bah ma dateRecup est au format NSString, puisque j'ai déjà  fait un NSDateFormatter précédemment.


     


    Oui je sais c'est complexe, je récupére ma date au format US, je la transforme en FR sur Vue 1 grace au Date Formatter et sur Vue 2 j'ai besoin des 2 formats: FR pour afficher dans le label, et US pour l'ajouter au calendrier iOS


  • Tu la récupère au format US -> tu la stockes et tu l'utilises pour l'insert.




  • Je vois pas trop l'intérêt si ça marche dans le premier cas de complexifier le système pour créer un cas d'erreur. Mais bon au lieu de faire un NSInteger tu pourrais faire un NSNumber qui offre des options de formatage.


    Sinon en travaillant directement sur le chiffre me semble qui c'est 



    NSLog(@Jour Courant %02d, (int)jourCourant];

    Si c'est pas exactement ça tu peux trouver la syntaxe exacte sur google facilement.




     


    Bon ta solution a l'air de marcher, mais quand est il si le jour est le 10 et non le 1 ? J'aurais 010 ?

  • Comment on convertis un NSString en NSDate ?


     


    Passer ça "2014-12-09 07:45:00 +0000" au format Date




  • Bon ta solution a l'air de marcher, mais quand est il si le jour est le 10 et non le 1 ? J'aurais 010 ?




     


    Non. Tu auras 10. C'est la spécification du format %02d : écrit un nombre entier sur 2 chiffres en remplissant avec des '0' au lieu d'espaces si nécessaire.


     


    Et là  tu es effectivement en train de réécrire une partie de la classe NSDateFormatter qui sert justement à  présenter une date dans le format souhaité.


    Quelle est la fonctionnalité qui te manque dans NSDateFormatter qui justifie que tu la réécrives à  ta sauce ?

  • jpimbertjpimbert Membre
    décembre 2014 modifié #13

    Comment on convertis un NSString en NSDate ?

     

    Passer ça "2014-12-09 07:45:00 +0000" au format Date




    Comme ça :



    NSDate *maDate = [NSDate dateWithString:@2014-12-09 07:45:00 +0000];

  • samirsamir Membre
    décembre 2014 modifié #14


     


    Comme ça :



    NSDate *maDate = [NSDate dateWithString:@2014-12-09 07:45:00 +0000];



     


    Cette méthode n'existe pas sous iOS et elle est dépréciée dans la version OS X v10.10.


     


    @Jean75 Regarde de coté NSDateFormatter. 


  • AliGatorAliGator Membre, Modérateur
    décembre 2014 modifié #15

    Lors de ma conversion de 02 de String vers Int il me le passe en "2"

    Bah heu c'est normal c'est un nombre. Le nombre 2, 2.0, 002, 2e0, 0.2e1, 20e-1, 2.000, tout ça c'est pareil c'est le même nombre.
     

    Quelqu'un pourrait m'aider pour qu'il m'affiche 02 et non 2 s'il vous plait ?

    Tu veux afficher ton nombre sous forme de texte. Donc il faut le convertir en texte. C'est comme si tu avais 200 centimes et que tu disais "hé mais quand je regarde la valeur que j'ai dans mon porte-monnaie, j'ai pas 200 centimes mais j'ai 2 euros !" Bah c'est pareil, c'est le même nombre, c'est juste sa représentation textuelle qui est différente.
     

    C'est dans le cadre d'une date

    Alors il faut un NSDateFormatter. Mais surtout, surtout, surtout, il faut lire le "Date and Time Programming Guide" d'Apple, qui t'enseigne tout ce qu'il faut savoir sur les dates (et il y'a beaucoup de choses importantes à  savoir, parfois même des choses qu'on pense savoir ou des subtilités qu'on loupe facilement si on ne les connait pas, donc c'est une lecture OBLIGATOIRE avant de commencer à  travailler avec des dates.

    Et c'est là  qu'on voit que c'est pas pour rien qu'il existe des NSDateFormatter, parce que formatter une date ce n'est pas aussi simple qu'on pourrait le croire, quand on prend en compte tous les cas possibles (changement d'heure, fuseau horaire, locale de l'utilisateur, et j'en passe)
     

    NSString* currentDay = [dateRecup substringWithRange:NSMakeRange(0,2)];
    NSLog(@Current Day %@", currentDay);
    NSInteger jourCourant = [currentDay integerValue];
    NSLog(@Jour Courant %@", jourCourant);

    Ouch ! Le placeholder "%@" est fait pour afficher des objets !! Or ta variable jourCourant n'est PAS un objet, c'est un NSInteger, autrement dit un entier (un type primitif, non-objet).

    Tu as vraiment de la chance que ton code ne crash pas si tu écris cela. D'ailleurs Xcode doit certainement te mettre un warning si tu mets un "%@" dans ton format de NSLog mais que tu mets un NSInteger dans le paramètre d'après (et les warnings c'est pas pour rien, ils sont + qu'importants et à  ne pas négliger, surtout quand on débute, car ils expliquent justement ce qui ne va pas et les risques que tu peux avoir et ce que tu as fait de travers...)



    La lecture indispensable avant d'aller plus loin.
  • Joanna CarterJoanna Carter Membre, Modérateur

    Mais surtout, surtout, surtout, il faut lire le "Date and Time Programming Guide" d'Apple, qui t'enseigne tout ce qu'il faut savoir sur les dates (et il y'a beaucoup de choses importantes à  savoir, parfois même des choses qu'on pense savoir ou des subtilités qu'on loupe facilement si on ne les connait pas, donc c'est une lecture OBLIGATOIRE avant de commencer à  travailler avec des dates.Et c'est là  qu'on voit que c'est pas pour rien qu'il existe des NSDateFormatter, parce que formatter une date ce n'est pas aussi simple qu'on pourrait le croire, quand on prend en compte tous les cas possibles (changement d'heure, fuseau horaire, locale de l'utilisateur, et j'en passe)




    Je ne peux pas renforcer ça assez fortement. Il FAUT regarder la vidéo 219 du WWDC 2013 !!!
  • Jean75Jean75 Membre
    décembre 2014 modifié #17

    @jpimbert: J'avais effectivement essayé ça mais sans succès ;)


     


    @Samir: Ok je regarde de ce côté


     


    @AliGator: Pour ajouter mon heure dans le calendrier il me le faut sous 2 chiffres, d'où la nécessité d'afficher le 0 devant les chiffres entre 0 et 9


    Ok je regarde du côté du NSDateFormatter


    Concernant le %@, avec le int, c'est juste un truc que j'ai écris rapidement ici afin d'illustrer, mais que j'utilise pas vraiment, je sais très bien qu'il faut utiliser %d :)


     


    @Joanna: D'accord je la regarderais ce soir


     


    J'ai essayé également ça mais sans aucun succès:



    NSDate* dateD = [[NSDate alloc]init];
    dateD = [dateFormatter dateFromString:dateDebut];


    Sachant que mon dateDebut c'est ça:



     


    2014-12-01 08:00:00 +0000


  • Problème réglé, merci à  tous ;)


  • AliGatorAliGator Membre, Modérateur

    J'ai essayé également ça mais sans aucun succès:


    NSDate* dateD = [[NSDate alloc]init];
    dateD = [dateFormatter dateFromString:dateDebut];

    Ce code montre qu'il te manque encore quelques bases / réflexes...
    Ta première ligne ne sert strictement à  rien (à  part gaspiller de la mémoire).
  • AliGatorAliGator Membre, Modérateur

    Problème réglé, merci à  tous ;)

    Ca serait bien, pour les autres débutants qui traineraient par ici et tomberait sur ta question, de fournir la solution qui a solutionné ton problème. Un forum est participatif, pense à  apporter ta contribution de ton côté également.


  • Ca serait bien, pour les autres débutants qui traineraient par ici et tomberait sur ta question, de fournir la solution qui a solutionné ton problème. Un forum est participatif, pense à  apporter ta contribution de ton côté également.





    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@yyyy-MM-dd HH:mm:ss];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@N]];
    NSDate* dateD = [[NSDate alloc]init];
    dateD = [dateFormatter dateFromString:dateDebut];



    Ce code montre qu'il te manque encore quelques bases / réflexes...

    Ta première ligne ne sert strictement à  rien (à  part gaspiller de la mémoire).




     


    Tu me conseilles de faire quoi du coup s'il te plait ?

  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2014 modifié #22



    NSDate* dateD = [[NSDate alloc]init];
    dateD = [dateFormatter dateFromString:dateDebut];



     


    Tu initialises dateD avec la date actuelle, puis tu la re-initialises avec ta date préférée. Tu aurais pu écrire :



    NSDate* dateD = [dateFormatter dateFromString:dateDebut];

    Et cette ligne :



    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@N]];

    ... met le timeZone à  nil.

  • Ok merci pour les conseils Joanna ;)


  • AliGatorAliGator Membre, Modérateur
    Exactement : tu mets une valeur (initialisation d'une nouvelle instance) dans dateD pour l'écraser aussitôt.


    Tu me conseilles de faire quoi du coup s'il te plait ?

    De relire les tutoriels et bases sur les variables et le rôle des méthodes alloc/init pour bien comprendre leur rôle et comprendre pourquoi la première de ces 2 lignes n'a pas de sens. Si c'est une erreur d'inattention et que tu vois bien ce qui cloche, ça va, mais si (comme ça semble être le cas vu ta question) tu ne vois pas vraiment qu'est e qui pose problème dans ces lignes, il faut que tu comprennes pourquoi et ce qui ne va pas pour progresser et éviter de réécrire ce genre de choses plus tard.


    Sinon, aussi, quel dommage de forcer un dateFormat fixe et une TimeZone... qu'en est-il de ceux qui utilisent ton application dans une autre langue ou en ayant des réglages de format de date différents dans leurs préférences système ? Un américain par exemple préférera le mois avant le jour là  où un français preferera l'inverse.

    Quant à  la TimeZone, pourquoi l'imposer ? (Avec un nom de TimeZone qui n'existe même pas qui plus est !) Je fais comment moi quand je vais partir en Irlande à  Noël et que j'aurai un décalage horaire ? Ton appli ca décaler toutes les dates et heures dnune heure et les horaires vont plus vouloir rien dire !


    (A se demander si tu as lu le Date and Time Programming Guide que j'ai cité plus haut qui est sensé te sensibiliser à  tous cela)
Connectez-vous ou Inscrivez-vous pour répondre.