[JavaScript]Besoin d'aide sur ce script

Besoin d'aide sur ce script [JavaScript] - HTML/CSS - Programmation

Marsh Posté le 18-07-2012 à 18:32:33    

Bonjour à tous  :bounce:  
 
Voilà, je suis en train de faire un site php qui fait quelques calculs. J'ai besoin, pour des questions de lisibilité, d'ajouter des séparateurs de milliers.
J'ai donc trouvé un script sur le net (eh oui, un bon programmeur est un flemmard !) qui fait ça.
 
Tout bon, vraiment bien ce script ! Sauf que j'y comprends rien, javascipt n'étant absolument pas mon domaine et n'ayant pas vraiment le temps de m'y mettre pour approfondir les choses.
Mais à la limite, c'est pas grave, j'ai pas besoin de le comprendre vu qu'il marche !
 
Oui mais : Ce script ne gère pas les effacements (backspace et suppr). c'est à dire que si je veux modifier mon texte, faut que je ressaisisse l'URL.
 
voilà, donc si un As du JS aurait le temps de me trouver la solution, ça serait tout à son honneur.
 
Voici le code :
 

Citation :

<HTML>
 <head>
 
  <SCRIPT LANGUAGE="JavaScript">
 
   function currencyFormat(fld, milSep, decSep, e) {
 
    var sep = 0;
    var key = '';
    var i = j = 0;
    var len = len2 = 0;
    var strCheck = '0123456789';
    var aux = aux2 = '';
    var whichCode = (window.Event) ? e.which : e.keyCode;
 
    if (whichCode == 13) return true;  // Enter
 
    key = String.fromCharCode(whichCode);  // Get key value from key code
 
    if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
 
    len = fld.value.length;
 
    for(i = 0; i < len; i++)
 
    if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
 
    aux = '';
 
    for(; i < len; i++)
 
    if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
 
    aux += key;
 
    len = aux.length;
 
    if (len == 0) fld.value = '';
 
    if (len == 1) fld.value = '0'+ decSep + '0' + aux;
 
    if (len == 2) fld.value = '0'+ decSep + aux;
 
    if (len > 2) {
 
     aux2 = '';
 
     for (j = 0, i = len - 3; i >= 0; i--) {
 
      if (j == 3) {
       aux2 += milSep;
       j = 0;
      }
 
      aux2 += aux.charAt(i);
      j++;
 
     }
 
     fld.value = '';
 
     len2 = aux2.length;
 
     for (i = len2 - 1; i >= 0; i--)
 
     fld.value += aux2.charAt(i);
 
     fld.value += decSep + aux.substr(len - 2, len);
 
    }
 
   return false;
 
   }
 
   //  End -->
 
   </script>
 </head>
 <BODY>
 
  <form>
 
 Enter Value:  
 
 <input type=text name=test length=15 onKeyPress="return(currencyFormat(this,' ','.',event))">
 
 </form>
 
 </BODY>
</HTML>


 
Bon, bien entendu mon objectif est plus compliqué que ça, mais c'est pour simplifier.
 
Merci à tous. ;)

Reply

Marsh Posté le 18-07-2012 à 18:32:33   

Reply

Marsh Posté le 18-07-2012 à 20:24:41    

P.S. Si vous avez un autre script, je prends aussi ^^

Reply

Marsh Posté le 19-07-2012 à 22:01:58    

Reply

Marsh Posté le 20-07-2012 à 21:31:34    

par ce que il faut que l'utilisateur voit ses milliers séparés pendant la saisie.
Je suis en train d'essayer de faire un autre script.
Je vous le passe. Le problème c'est de récupérer la position de son curseur après une insertion de chiffre n'importe où dans la chaîne. Je n'arrive pas non plus à gérer les backspace et suppr.
 
Le voilà, si quelqu'un a la bonté de m'aider.
 

Code :
  1. function millier()
  2.   {
  3.    var gauche;
  4.    var droite;
  5.    var pos;
  6.    var longueur;
  7.    var longueur2;
  8.    var valeur;
  9.    var start;
  10.    //récup de la position actuelle du curseur
  11.    start = document.getElementById('test').selectionStart;
  12.    var testpos=start;
  13.    //récup de la valeur du champ
  14.    valeur=document.getElementById("test" ).value;
  15.    //récupération de la longueur de la chaine
  16.    longueur=valeur.length;
  17.    //récupération de l'emplacement de la virgule
  18.    pos=valeur.indexOf(".", 0);
  19.    if(pos == -1)
  20.    {pos=longueur;}
  21.    //récupération de la partie entière
  22.    gauche = valeur.substring(0, pos);
  23.    gauche=supprEspace(gauche);
  24.    //nouvelle longueur de la chaine
  25.    longueur2=gauche.length;
  26.    //récupération de la décimale et la virgule
  27.    droite = valeur.substring(pos, longueur+1);
  28.    var gauche2=gauche;
  29.    for (var i=1;i<4;i++) {
  30.     if (parseInt(gauche2)>=Math.pow(10,(3*i))) {
  31.     gauche=gauche.substring(0,longueur2-(3*i))+" "+gauche.substring(longueur2-(3*i));
  32.     }
  33.    }
  34.    document.getElementById("test" ).value = gauche+""+droite;
  35.    //on remet le curseur où il doit être.
  36.    //on récup la nouvelle longueur de la chaine
  37.    new_longueur=gauche.length;
  38.    //si on a supprimé des chiffres (backspace)
  39.    if(new_longueur < longueur2 && longueur2 != 3)
  40.    {
  41.     start--;
  42.    }
  43.    //si on a ajouté des espaces avec les séparateurs de milliers
  44.    if(new_longueur > longueur2 && longueur2 != 3)
  45.    {
  46.     start++;
  47.     longueur2++;
  48.    }
  49.    if(new_longueur > longueur2 && longueur2 != 3)
  50.    {
  51.     start++;
  52.    }
  53.    document.getElementById('test').selectionStart = start;
  54.    document.getElementById('test').selectionEnd = start;
  55.    //si on a fait que se déplacer avec les flèches
  56.    if(new_longueur == longueur2)
  57.    {start += 1;}
  58.    document.getElementById("testspan" ).innerHTML = longueur2 +" - "+new_longueur+" - "+testpos+" - "+start;
  59.   }
  60.   function supprEspace(f)    {
  61.   var txtResultat="";
  62.   for (var i=0; i<=f.length-1; i++)    {
  63.    if (f.charAt(i)!=" " )    {
  64.     txtResultat+=f.charAt(i);
  65.    }
  66.   }
  67.   return txtResultat;
  68.  }

Reply

Marsh Posté le 20-07-2012 à 23:07:28    

Il y a plus simple comme code pour formatter un nombre :)
SUr jsfiddle, j'ai un exemple un peu plus complet, http://jsfiddle.net/FpFHG/7/
Mais voici juste le code qui permet de formatter 1234567 en 1 234 567

Code :
  1. var number = "2324443";
  2. var formattedNumber = number.replace(/(\d)(?=(\d{3})+(?:[.,]\d{2})*$)/g, '$1 ');
  3. console.log(formattedNumber);


---------------
Blablaté par Harko
Reply

Marsh Posté le 21-07-2012 à 00:11:42    

salut
merci pour ton code.
Et ça met le curseur où il faut ?
 
++

Reply

Marsh Posté le 21-07-2012 à 08:22:43    

non si tu regarde bien, je n'ai quasiment aucune notion du curseur via ce code.
 
Il faut juste rajouter un algo qui gère le changement de longeur de la chaine entre la nouvelle chaine et la précédente chaine et qu'on regarde si on rajoute ou enleve un espace.
L'autre problème et de connaitre à quel endroit le rajout s'est opéré.
Mon code ici te formate le nombre d'une manière plus simple que les 40 lignes de codes que tu avais avant.


---------------
Blablaté par Harko
Reply

Marsh Posté le 21-07-2012 à 13:16:00    

OK.
je te remercie Gatsu35

Reply

Marsh Posté le 21-07-2012 à 14:59:05    

C'est bon, j'ai réussi à faire ce que je voulais.
J'y ai pas encore intégré ton script Gatsu, mais ça marche.
 
Le voilà pour ceux qui veulent
Notez que j'ai aussi une fonction qui remplace les virgules par des points avant traîtement du script.
 

Code :
  1. function millier()
  2.   {
  3.    var gauche;
  4.    var droite;
  5.    var pos;
  6.    var longueur;
  7.    var longueur2;
  8.    var valeur;
  9.    var start;
  10.    //récup de la position actuelle du curseur
  11.    start = document.getElementById('test').selectionStart;
  12.    //récup de la valeur du champ
  13.    valeur=document.getElementById("test" ).value;
  14.    //récupération de la longueur de la chaine
  15.    longueur=valeur.length;
  16.    //récupération de l'emplacement de la virgule
  17.    pos=valeur.indexOf(".", 0);
  18.    //s'il n'y a pas de virgule
  19.    if(pos == -1)
  20.    {pos=longueur;}
  21.    //récupération de la partie entière
  22.    gauche = valeur.substring(0, pos);
  23.    //on garde une variable qui contient la partie gauche AVEC les espaces
  24.    var gauche_esp=gauche;
  25.    //on supprime les espaces de gauche
  26.    gauche=supprEspace(gauche);
  27.    //nouvelle longueur de la chaine gauche (sans les espaces)
  28.    longueur2=gauche.length;
  29.    //récupération de la décimale et la virgule
  30.    droite = valeur.substring(pos, longueur+1);
  31.    //on rajoute les espaces    
  32.    var gauche2=gauche;
  33.    for (var i=1;i<4;i++) {
  34.     if (parseInt(gauche2)>=Math.pow(10,(3*i))) {
  35.     gauche=gauche.substring(0,longueur2-(3*i))+" "+gauche.substring(longueur2-(3*i));
  36.     }
  37.    }
  38.    //insertion de la valeur dans le champ
  39.    document.getElementById("test" ).value = gauche+""+droite;
  40.    //on remet le curseur où il doit être.
  41.    //nouvelle longueur de la chaine
  42.    longueur2=gauche_esp.length;
  43.    //on récup la nouvelle longueur de la chaine avec espaces
  44.    var new_longueur_esp=gauche.length;
  45.    // si on a ajouté des espaces avec les séparateurs de milliers, on incrémente la position du curseur
  46.    if(new_longueur_esp > longueur2 && longueur2 != 3)
  47.    {
  48.     start++;
  49.    }
  50.    // si on a supprimé des espaces en supprimant des chiffres, on décrémente la position du curseur
  51.    if(new_longueur_esp < longueur2 && longueur2 != 3)
  52.    {
  53.     start--;
  54.    }
  55.    //et on replace le curseur où il doit être    
  56.    document.getElementById('test').selectionStart = start;
  57.    document.getElementById('test').selectionEnd = start;
  58.   }
  59.   function supprEspace(f)    {
  60.   var txtResultat="";
  61.   for (var i=0; i<=f.length-1; i++)    {
  62.    if (f.charAt(i)!=" " )    {
  63.     txtResultat+=f.charAt(i);
  64.    }
  65.   }
  66.   return txtResultat;
  67.  }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed