Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compte à rebours hexadécimal.

Les valeurs grandes deviennent inccorects.

Sujet résolu
    10 mars 2010 à 23:51:42

    Salut à tous, je me permet de me rendre sur le forum js pour demander un petit coup de main par rapport à un script que j'ai crée.
    Celui-ci permet d'afficher un compte à rebours en hexadécimal.

    Il est disponible sur ce lien mais je vais tout de même détaillé le code ici :
    http://www.ebrithil.com/script/hexadecimal/rebours.html
    // Script réalisé par Fabien, avec l'aide du SiteduZero. (z.fabien@orange.fr)
    // Disponible à l'adresse : http://www.ebrithil.com/script/hexadecimal
    // http://www.siteduzero.com/tutoriel-3-1 [...] s-en-php.html

    // Créer dans la nuit du 09 au 10 Mars 2010 en une vingtaine de minutes... ehm... oui j'arrivais pas à dormir...

    function Strip0(date)
    {
    var date;
    if (date < 10) return '0' +date;
    else return date;

    }

    function CompteARebours()
    {
    var date_actuelle = new Date(); // On déclare la date d'aujourd'hui
    var annee = date_actuelle.getFullYear(); // On déclare aussi l'année actuelle

    var date_echeance = new Date(2020, 0, 1, 0, 0, 0); // On déclare la date d'échéance.
    // Remplacer 2020 par 'annee' si la date ce répète chaque année. (Sans apostrophes)

    if (date_echeance.getTime() < date_actuelle.getTime())
    date_echeance = new Date(++annee, 0, 1, 0, 0, 0);
    // On la redéclare pour reporter à l'année suivante, si celle-ci est dépassé.

    // if (date_echeance.getTime() < date_actuelle.getTime())
    // date_echeance = new Date();
    // On passe le compteur à 0 si celle-ci est dépassé

    var tps_restant = date_echeance.getTime() - date_actuelle.getTime(); // Temps restant en millisecondes

    //============ CONVERSIONS des millisecondes pour chaque valeur à afficher. (de 0 à F) x 266.66...


    var restantes_m4 = tps_restant / (0.1 / 3.75);
    var restantes_m3 = tps_restant / (1 / 3.75);
    var restantes_m2 = tps_restant / (10 / 3.75);
    var restantes_m1 = tps_restant / (100 / 3.75);
    var restantes = tps_restant / (1000 / 3.75);
    var p1_restantes = tps_restant / (10000 / 3.75)
    var p2_restantes = tps_restant / (100000 / 3.75)
    var p3_restantes = tps_restant / (1000000 / 3.75)
    var p4_restantes = tps_restant / (10000000 / 3.75)
    var p5_restantes = tps_restant / (100000000 / 3.75)
    var p6_restantes = tps_restant / (1000000000 / 3.75)
    var p7_restantes = tps_restant / (10000000000 / 3.75)
    var p8_restantes = tps_restant / (100000000000 / 3.75)
    var p9_restantes = tps_restant / (100000000000 / 3.75 * 10)

    //A partir de 'p10' il semble y avoir une erreur, essayez d'afficher le compte à rebours pour une durée de plus de deux cents ans par exemple. Vous remarquerez que tout les chiffres à partir de 'p10' prennent la même valeur. Si quelqu'un trouve comment débuguer, ou peut expliquer le phénomène, je serai ravi d'être contacté à l'adresse spécifié tout en haut. (z.fabien@orange.fr)
    var p10_restantes = tps_restant / (100000000000 / 3.75 * 100)
    var p11_restantes = tps_restant / (100000000000 / 3.75 * 1000)
    var p12_restantes = tps_restant / (100000000000 / 3.75 * 10000)
    var p13_restantes = tps_restant / (100000000000 / 3.75 * 100000)
    var p14_restantes = tps_restant / (100000000000 / 3.75 * 1000000)
    var p15_restantes = tps_restant / (100000000000 / 3.75 * 10000000)


    //============ On définit le nombre de valeurs à affichés. (Hexadécimal = 15)

    restantes_m4 = Math.floor(restantes_m4 % 15);
    restantes_m3 = Math.floor(restantes_m3 % 15);
    restantes_m2 = Math.floor(restantes_m2 % 15);
    restantes_m1 = Math.floor(restantes_m1 % 15);
    restantes = Math.floor(restantes % 15);
    p1_restantes = Math.floor(p1_restantes % 15);
    p2_restantes = Math.floor(p2_restantes % 15);
    p3_restantes = Math.floor(p3_restantes % 15);
    p4_restantes = Math.floor(p4_restantes % 15);
    p5_restantes = Math.floor(p5_restantes % 15);
    p6_restantes = Math.floor(p6_restantes % 15);
    p7_restantes = Math.floor(p7_restantes % 15);
    p8_restantes = Math.floor(p8_restantes % 15);
    p9_restantes = Math.floor(p9_restantes % 15);
    p10_restantes = Math.floor(p10_restantes % 15);
    p11_restantes = Math.floor(p10_restantes % 15);
    p12_restantes = Math.floor(p10_restantes % 15);
    p13_restantes = Math.floor(p10_restantes % 15);
    p14_restantes = Math.floor(p10_restantes % 15);
    p15_restantes = Math.floor(p10_restantes % 15);



    //================== On attribue les lettres correspondantes au nombre. (Répétitif, à améliorer).


    if (restantes_m4 == 10) {restantes_m4 = "A"} ;
    if (restantes_m4 == 11) {restantes_m4 = "B"} ;
    if (restantes_m4 == 12) {restantes_m4 = "C"} ;
    if (restantes_m4 == 13) {restantes_m4 = "D"} ;
    if (restantes_m4 == 14) {restantes_m4 = "E"} ;
    if (restantes_m4 == 15) {restantes_m4 = "F"} ;

    if (restantes_m3 == 10) {restantes_m3 = "A"} ;
    if (restantes_m3 == 11) {restantes_m3 = "B"} ;
    if (restantes_m3 == 12) {restantes_m3 = "C"} ;
    if (restantes_m3 == 13) {restantes_m3 = "D"} ;
    if (restantes_m3 == 14) {restantes_m3 = "E"} ;
    if (restantes_m3 == 15) {restantes_m3 = "F"} ;

    if (restantes_m2 == 10) {restantes_m2 = "A"} ;
    if (restantes_m2 == 11) {restantes_m2 = "B"} ;
    if (restantes_m2 == 12) {restantes_m2 = "C"} ;
    if (restantes_m2 == 13) {restantes_m2 = "D"} ;
    if (restantes_m2 == 14) {restantes_m2 = "E"} ;
    if (restantes_m2 == 15) {restantes_m2 = "F"} ;

    if (restantes_m1 == 10) {restantes_m1 = "A"} ;
    if (restantes_m1 == 11) {restantes_m1 = "B"} ;
    if (restantes_m1 == 12) {restantes_m1 = "C"} ;
    if (restantes_m1 == 13) {restantes_m1 = "D"} ;
    if (restantes_m1 == 14) {restantes_m1 = "E"} ;
    if (restantes_m1 == 15) {restantes_m1 = "F"} ;

    if (restantes == 10) {restantes = "A"} ;
    if (restantes == 11) {restantes = "B"} ;
    if (restantes == 12) {restantes = "C"} ;
    if (restantes == 13) {restantes = "D"} ;
    if (restantes == 14) {restantes = "E"} ;
    if (restantes == 15) {restantes = "F"} ;

    if (p1_restantes == 10) {p1_restantes = "A"} ;
    if (p1_restantes == 11) {p1_restantes = "B"} ;
    if (p1_restantes == 12) {p1_restantes = "C"} ;
    if (p1_restantes == 13) {p1_restantes = "D"} ;
    if (p1_restantes == 14) {p1_restantes = "E"} ;
    if (p1_restantes == 15) {p1_restantes = "F"} ;

    if (p2_restantes == 10) {p2_restantes = "A"} ;
    if (p2_restantes == 11) {p2_restantes = "B"} ;
    if (p2_restantes == 12) {p2_restantes = "C"} ;
    if (p2_restantes == 13) {p2_restantes = "D"} ;
    if (p2_restantes == 14) {p2_restantes = "E"} ;
    if (p2_restantes == 15) {p2_restantes = "F"} ;

    if (p3_restantes == 10) {p3_restantes = "A"} ;
    if (p3_restantes == 11) {p3_restantes = "B"} ;
    if (p3_restantes == 12) {p3_restantes = "C"} ;
    if (p3_restantes == 13) {p3_restantes = "D"} ;
    if (p3_restantes == 14) {p3_restantes = "E"} ;
    if (p3_restantes == 15) {p3_restantes = "F"} ;

    if (p4_restantes == 10) {p4_restantes = "A"} ;
    if (p4_restantes == 11) {p4_restantes = "B"} ;
    if (p4_restantes == 12) {p4_restantes = "C"} ;
    if (p4_restantes == 13) {p4_restantes = "D"} ;
    if (p4_restantes == 14) {p4_restantes = "E"} ;
    if (p4_restantes == 15) {p4_restantes = "F"} ;

    if (p5_restantes == 10) {p5_restantes = "A"} ;
    if (p5_restantes == 11) {p5_restantes = "B"} ;
    if (p5_restantes == 12) {p5_restantes = "C"} ;
    if (p5_restantes == 13) {p5_restantes = "D"} ;
    if (p5_restantes == 14) {p5_restantes = "E"} ;
    if (p5_restantes == 15) {p5_restantes = "F"} ;

    if (p6_restantes == 10) {p6_restantes = "A"} ;
    if (p6_restantes == 11) {p6_restantes = "B"} ;
    if (p6_restantes == 12) {p6_restantes = "C"} ;
    if (p6_restantes == 13) {p6_restantes = "D"} ;
    if (p6_restantes == 14) {p6_restantes = "E"} ;
    if (p6_restantes == 15) {p6_restantes = "F"} ;

    if (p7_restantes == 10) {p7_restantes = "A"} ;
    if (p7_restantes == 11) {p7_restantes = "B"} ;
    if (p7_restantes == 12) {p7_restantes = "C"} ;
    if (p7_restantes == 13) {p7_restantes = "D"} ;
    if (p7_restantes == 14) {p7_restantes = "E"} ;
    if (p7_restantes == 15) {p7_restantes = "F"} ;

    if (p8_restantes == 10) {p8_restantes = "A"} ;
    if (p8_restantes == 11) {p8_restantes = "B"} ;
    if (p8_restantes == 12) {p8_restantes = "C"} ;
    if (p8_restantes == 13) {p8_restantes = "D"} ;
    if (p8_restantes == 14) {p8_restantes = "E"} ;
    if (p8_restantes == 15) {p8_restantes = "F"} ;

    if (p9_restantes == 10) {p9_restantes = "A"} ;
    if (p9_restantes == 11) {p9_restantes = "B"} ;
    if (p9_restantes == 12) {p9_restantes = "C"} ;
    if (p9_restantes == 13) {p9_restantes = "D"} ;
    if (p9_restantes == 14) {p9_restantes = "E"} ;
    if (p9_restantes == 15) {p9_restantes = "F"} ;

    if (p10_restantes == 10) {p10_restantes = "A"} ;
    if (p10_restantes == 11) {p10_restantes = "B"} ;
    if (p10_restantes == 12) {p10_restantes = "C"} ;
    if (p10_restantes == 13) {p10_restantes = "D"} ;
    if (p10_restantes == 14) {p10_restantes = "E"} ;
    if (p10_restantes == 15) {p10_restantes = "F"} ;

    if (p11_restantes == 10) {p11_restantes = "A"} ;
    if (p11_restantes == 11) {p11_restantes = "B"} ;
    if (p11_restantes == 12) {p11_restantes = "C"} ;
    if (p11_restantes == 13) {p11_restantes = "D"} ;
    if (p11_restantes == 14) {p11_restantes = "E"} ;
    if (p11_restantes == 15) {p11_restantes = "F"} ;

    if (p12_restantes == 10) {p12_restantes = "A"} ;
    if (p12_restantes == 11) {p12_restantes = "B"} ;
    if (p12_restantes == 12) {p12_restantes = "C"} ;
    if (p12_restantes == 13) {p12_restantes = "D"} ;
    if (p12_restantes == 14) {p12_restantes = "E"} ;
    if (p12_restantes == 15) {p12_restantes = "F"} ;

    if (p13_restantes == 10) {p13_restantes = "A"} ;
    if (p13_restantes == 11) {p13_restantes = "B"} ;
    if (p13_restantes == 12) {p13_restantes = "C"} ;
    if (p13_restantes == 13) {p13_restantes = "D"} ;
    if (p13_restantes == 14) {p13_restantes = "E"} ;
    if (p13_restantes == 15) {p13_restantes = "F"} ;

    if (p14_restantes == 10) {p14_restantes = "A"} ;
    if (p14_restantes == 11) {p14_restantes = "B"} ;
    if (p14_restantes == 12) {p14_restantes = "C"} ;
    if (p14_restantes == 13) {p14_restantes = "D"} ;
    if (p14_restantes == 14) {p14_restantes = "E"} ;
    if (p14_restantes == 15) {p14_restantes = "F"} ;

    if (p15_restantes == 10) {p15_restantes = "A"} ;
    if (p15_restantes == 11) {p15_restantes = "B"} ;
    if (p15_restantes == 12) {p15_restantes = "C"} ;
    if (p15_restantes == 13) {p15_restantes = "D"} ;
    if (p15_restantes == 14) {p15_restantes = "E"} ;
    if (p15_restantes == 15) {p15_restantes = "F"} ;



    var texte = ""+p15_restantes+""+p14_restantes+""+p13_restantes+""+p12_restantes+""+p11_restantes+""+p10_restantes+""+p9_restantes+""+p8_restantes+""+p7_restantes+""+p6_restantes+""+p5_restantes+""+p4_restantes+""+p3_restantes+""+p2_restantes+""+p1_restantes+""+restantes+""+restantes_m1+""+restantes_m2+"";


    document.getElementById("affichage").innerHTML = texte;
    //Modifiez la valeur dans la parenthèse pour changer la 'class' à attribuer pour l'affichage du compte à rebours.
    }
    setInterval(CompteARebours, 1); //Actualisation de l'heure + du compte à rebours


    Néanmoins je débute totalement en Javascript et j'ai remarqué une petite erreur que j'ai noté en commentaire dans le code à partir de la valeur 'p10' et supérieur. En effet, si celle-ci est différente de 0 on remarque,que toutes celles qui la suivent, prennent exactement la même valeur qu'elle. Pour vérifier, essayez de mettre la fin du compte à rebours dans 200 ou 300 ans.
    (Ou visitez cette page, ou cette page).

    Par ailleurs, mon code est plutôt répétitif, comme dans l'assignation des lettres aux valeurs numérique. Je présume une fois de plus qu'il y a moyen de l'optimiser.

    Merci à tous. =)

    -
    Edité par Komira 22 août 2013 à 0:02:49

    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2010 à 0:15:29

      N'est-ce pas beaucoup plus simple comme ça ?

      function decToHex(dec,nbDigits) {
        
        var h = { 10 : 'A', 11 : 'B', 12 : 'C', 13 : 'D', 14 : 'E', 15 : 'F' };
        function hexa(nb) {
          return nb>=10 ? h[nb] : nb+'';
        }
        
        var hex = '';
        if(dec==0) { hex = '0'; };
        
        while(dec>0) {
          hex = hexa(dec%16)+hex;
          dec = Math.floor(dec/16);
        }
        
        if(nbDigits&&hex.length<nbDigits) {
          while(nbDigits-hex.length) { hex = '0'+hex; }
        }
        
        return hex;
      }
      
      function CompteARebours()
      {
      var date_actuelle = new Date(); // On déclare la date d'aujourd'hui
      var annee = date_actuelle.getFullYear(); // On déclare aussi l'année actuelle
      
      var date_echeance = new Date(2020, 0, 1, 0, 0, 0); // On déclare la date d'échéance.
      // Remplacer 2020 par 'annee' si la date ce répète chaque année. (Sans apostrophes)
      
      if (date_echeance < date_actuelle)
      date_echeance = new Date(++annee, 0, 1, 0, 0, 0);
      // On la redéclare pour reporter à l'année suivante, si celle-ci est dépassé.
      
      var tps_restant = date_echeance - date_actuelle;
      
      document.getElementById('affichage').innerHTML = decToHex(tps_restant,19);
      }
      
      window.onload=function() {
        setInterval(CompteARebours, 1); //Actualisation de l'heure + du compte à rebours
      };
      


      EDIT : Ajout d'un paramètre optionnel pour forcer un certain nombre de digits minimum...
      • Partager sur Facebook
      • Partager sur Twitter
        11 mars 2010 à 17:04:59

        En effet ça à l'air bien plus performant que le bidouillage que j'ai réalisé. Je vais le tester quand même, merci beaucoup. =)

        Sans ça, je ne sais toujours pas pourquoi il y avait cette erreur dans mon script, bien que ce ne soit pas vraiment important.
        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2010 à 18:49:38

          Je t'avoue que je ne sais pas non plus d'où venait l'erreur... Mais sincèrement en voyant le code, ça donne pas trop envie de fouiller en profondeur :-°
          • Partager sur Facebook
          • Partager sur Twitter

          Compte à rebours hexadécimal.

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown