IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

optimisation de "leading" zeros et notation scientifique


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut optimisation de "leading" zeros et notation scientifique
    suite à un post récent sur le forum, je me pencahis sur l'optimisation d'un code pour ajouter des zeros devant un nombre pour en formatter l'affichage

    les scripts classiques porposent une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function NumFormat(nombre, zeros) {
        var temp = new String(nombre);
        while ((temp.length < zeros) && (temp = 0 + temp)) {}
           return temp;
    }
    Je me suis donc attaché a faire disparaitre cette boucle au profit de la generation immediate du bon nombre de zeros ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function NumFormat1(nombre, zeros) {
       return new String(1*Math.pow(10,(zeros-nombre.toString().length))).replace(/^.{1}/,'')+new String(nombre);}
    alert(NumFormat1(12,22))
    ça fonctionne du tonnerre sauf au dela de 22 caractères à cause de la notation scientifique 10 puissance 23 retourne
    Voyez vous une solution ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  2. #2
    Membre expérimenté Avatar de marts
    Inscrit en
    Février 2008
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 233
    Par défaut
    J'ai une autre méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    lzs='00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
    function NumFormat2(nombre, zeros)
    {
    	return lzs.substring(0,zeros-nombre.toString().length)+new String(nombre);
    }
    alert(NumFormat2(12,23));

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    oui je l'avais déja vue cette methode là, mais elle ne m'avait pas convaincu du fait de la limite des zero de la string ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Membre expérimenté Avatar de marts
    Inscrit en
    Février 2008
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 233
    Par défaut
    Oui mais cette limite n'est que théorique.
    En pratique personne n'utilise jamais de nombres avec autant de chiffres.

    Sinon pour reprendre ta fonction il suffirait d'ajouter les 0 par groupes de 20 (à partir de 10^21 on obtient la notation scientifique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function NumFormat1(nombre, zeros) {
       var s=new String(nombre);
       while (s.length<zeros) 
          s=new String(1*Math.pow(10,Math.min(zeros-s.length,20))).replace(/^.{1}/,'')+s;
       return s;}
    alert(NumFormat1(12,56));
    Mais on ne fait que diminuer le nombre de boucles ...

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Entièrement d'accord Marts c'est du pur théorique !
    Travailler avec des integers aussi grands est tout de même très rare je te l'accorde.

    Il est tout de même dommage que js ne soit pas épourvu d'une fonction de generation de string d'une certaine longueur.

    je propose donc un prototype de génération de chaine en bidouillant sur un array ce qui sera plus rapide qu'une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String.prototype.string=function(car){
     return ((car>0) && (tab=new Array(car+1), tab.join(this)));
    }
    alert ('A'.string(200))
    Ce qui pour le coup permet de modifier le script des leading 0 comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function NumFormat1(nombre, zeros) {
       return '0'.string(zeros-nombre.toString().length)+new String(nombre);}
    alert(NumFormat1(12,50))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    le prototype peut être modifié comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String.prototype.string=function(car){
     return ((car>0) && (tab=new Array(car+1).join(this)))?tab:'';
    }
    dukej
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo