Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
666 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] conversion de données (manipulations de string inside)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] conversion de données (manipulations de string inside)

n°385199
sacha
Posté le 06-05-2003 à 22:02:23  profilanswer
 

Voila mon script PHP de conversion de valeurs monétaires.
C'est à dire qu'il permet, avec une donnée chiffrée formatée spécifiquement, d'avoir en sortie la meme donnée chiffrée mais sans formatage.
 
Exemple concret:
 
ca enleve les espaces:
"134 465.25" --> 134465.25
ou ca les rajoutes:
"123456789.11" --> "123 456 879.25"
en prenant compte du fait qu'il y ait ou non des centimes, donc un caractère "." et deux caractères de chiffres a la fin.
 
La première conversion ( avec --> sans) marche bien.
 
Mon problème se situe sur la deuxième :
par exemple "123546789.25" me renvoie "123 546789 789 .25" et non la valeur escomptée ("123 546 789.25" )
 
j'ai beau cherché dans ma fonction (function add_spaces($nb))je vois pas trop où est le problème... mais bon, vous connaissez le debuggage, on cherche, on cherche pendant 1h, et le collègue d'à côté qui vient regarder le problème trouve la solution en 30 secondes... les joies du débugging quoi :)
 
Donc si vous pouvez jeter un oeil 30 secondes (voire plus :p) sur ce code et trouver une solution ca m'arrangerait bien la vie...  
 
 
 
Le script exécutable est accessible ici
http://sacha.planet-d.net/space.php
 
 
Au fait pour ceux qui ne connaissent pas debuglib.php, que j'utilise dans cette page, c'est un script php super pratique qui liste toutes les variables globales de votre page, quelque soit le type de données, ainsi que les var de sessions, les vars _SERVER, cookies,etc. et qui est on ne peut + simple à installer : downloader debuglib.php (un coup de google et c réglé), insérer include "debuglib.php"; au début du fichier, et après un coup de show_vars(); dans le corps html et le tour est joué !
 
 
le code source :  

Code :
  1. <? 
  2. include "debuglib.php";
  3. $dbg_valeur = 0;
  4. function add_spaces($nb)
  5. {
  6. $nb = trim($nb);  // on enleve les espaces avant et apres
  7. $pos = strrpos($nb, "." );  // si il y a un point : renvoie sa position
  8. if (!$pos) // si non : renvoie 0 ...
  9. {
  10.  $nb_entier = $nb; //... et la partie entière est tout le nombre ...
  11.     $cents = ""; $point = ""; // et ya pas de centime.
  12. }
  13. else  // oui > $pos = la position du point dans la valeur
  14. {
  15.  $longueur  = strlen($nb);
  16.  $ch = explode(".",$nb);
  17.    $nb_entier = $ch[0];
  18.  $cents     = $ch[1];
  19.  $point = ".";
  20. }
  21. $str_final = "";
  22. $i=0;
  23. $longueur  = strlen($nb_entier); // si nb_entier=123456 : longueur = 6
  24. $div = $longueur/3; // renvoie 2 dans ce cas, ou si longueur = 7 : 2.33333 avec un reste
  25. $nb_de_boucles = floor($div); // si $div = 2.333 : nb boucles = 2 (on arrondit en dessous)
  26. $fin = $longueur;
  27. while($nb_de_boucles)
  28. {
  29.  $str_tmp = substr($nb_entier,$longueur-3-(3*$i),$longueur-(3*$i));
  30.         $valeur[$nb_de_boucles] = substr($nb_entier,$fin-3,$fin);   // for debug only
  31.  $str_final = $str_tmp . " ". $str_final;
  32.  $fin -= 3;
  33.  $i++;
  34.  $nb_de_boucles--;
  35. }
  36. $dbg_valeur = print_r($valeur);
  37.     for($i=1;$i<=floor($div);$i++)
  38.     {
  39.     $str_final.= " ".$valeur['$i'];
  40.     }
  41. $nb_entier = trim($str_final);
  42. /*
  43. if(fmod($longueur,3)) // si il y a un reste a $longueur/3
  44. {
  45.  $fin = $longueur-(3*$i);
  46.  $chiffres = substr($nb_entier,0,$fin);
  47.  $str_final =  $chiffres " " . $str_final;
  48. }
  49. */
  50. $resultat = $str_final . $point . $cents; // "45778" "." "25" ou "45778" "" ""
  51. return $resultat;
  52. }
  53. // c fait & ca march
  54. function remove_spaces($nb)
  55. {
  56. $nb = trim($nb);        // on enleve les espaces avant et apres
  57. $pos = strrpos($nb, "." );     // si il y a un point : renvoie sa position
  58. if (!$pos)        // si non : renvoie 0
  59. {
  60.  $nb_entier = $nb;
  61.     $cents = ""; $point = "";        // pas de centime
  62. }
  63. else
  64. {
  65.  $longueur  = strlen($nb);
  66.  $ch = explode(".",$nb);
  67.    $nb_entier = $ch[0];
  68.  $cents     = $ch[1];
  69.  $point = ".";
  70.    }
  71. $tmp = eregi_replace('[^0-9]',"",$nb_entier); // supression sauf chiffres
  72. $tmp = $tmp . $point . $cents;
  73.     return $tmp; // "45778" "." "25" ou "45778" "" ""
  74. }
  75. if($remove == 1)
  76. $result_sans_espace = remove_spaces($value);
  77. if($add == 1)
  78. $result_avec_espace = add_spaces($value);
  79. ?>
  80. <html>
  81. <head>
  82. <title>add_spaces & remove_spaces TEST</title>
  83. <style type="text/css">
  84. <!--
  85. .tablo {
  86. border: thin dotted #CCCCCC;
  87. }
  88. -->
  89. </style>
  90. </head>
  91. <body>
  92. <div align="center"><a href="space.php"><font size="2" face="Arial, Helvetica, sans-serif">CLEAR</font></a></div>
  93. <table width="75%" border="0" align="center">
  94.   <tr>
  95.     <td class="tablo">
  96.       <FORM name="remove"><div align="center">
  97.       <input type="hidden" name="remove" value="1">
  98.       avec espaces :
  99.       <input type="text" name="value" value="">
  100.       <br>
  101.       <?
  102.   if($remove)
  103.    echo " sans espace : ". $result_sans_espace;
  104.   ?>
  105.       <br>
  106.       <input type="submit" name="submit" value="CONVERTIR">
  107.     </div></FORM>
  108. </td>
  109.   </tr>
  110.   <tr>
  111.     <td class="tablo">
  112.       <FORM name="add">
  113.   <div align="center"> sans espace :
  114.    <input type="hidden" name="add" value="1">
  115.     <input name="value" type="text" id="value" value=""><br>
  116.   <?
  117.   if($add)
  118.    echo " avec espaces : ". $result_avec_espace;
  119.   ?>
  120.     <br>
  121. <input type="submit" name="submit" value="CONVERTIR"></div></FORM>
  122.     </td>
  123.   </tr>
  124. </table>
  125. <? show_vars(); ?>
  126. </body></html>


 
Merci les coderz !


Message édité par sacha le 06-05-2003 à 23:07:01
mood
Publicité
Posté le 06-05-2003 à 22:02:23  profilanswer
 

n°385329
VisualC++
J'va y penser ...
Posté le 07-05-2003 à 00:27:52  profilanswer
 

Salut pour ta fonction qui pose pb y a pe plus simple
 

Code :
  1. function add_spaces($nb) {
  2. $nb_new = "";
  3. trim($nb);
  4. $pos = strrpos($nb, "." );
  5.       if ($pos != 0) {
  6.         $ch = explode(".",$nb);
  7.          $entier = $ch[0];
  8.          $virgule = $ch[1];
  9. }
  10. else {
  11.         $entier = $nb;
  12.          $virgule = "";
  13. }
  14. $i = strlen($entier) - 1;
  15. $currentnb = 0;
  16. while($i >= 0) {
  17.  if ($currentnb < 3) {
  18.   $nb_new = $nb_new . $entier[$i];
  19.   $currentnb += 1;
  20.  }
  21.  else {
  22.   $currentnb = 1;
  23.   $nb_new = $nb_new .  " ";
  24.   $nb_new = $nb_new . $entier[$i];
  25.  }
  26.  $i--;
  27. }
  28. $nb_new = strrev($nb_new);
  29. if (strlen($virgule) != 0) $nb_new = $nb_new . "." . $virgule;
  30. return $nb_new;
  31. }

n°385621
sacha
Posté le 07-05-2003 à 11:30:49  profilanswer
 

j'ai testé par un copier coller tout bete et ca marche, merci bcp :)
 
j'étudierais en détail ce que t'as fait + tard mais c cool tu me retire une grande épine du pied
 
a+

n°385647
VisualC++
J'va y penser ...
Posté le 07-05-2003 à 11:37:12  profilanswer
 

De rien, juste qu'en lisant la chaine a l'envers tu as pas a gerer 1 million de possibilites, des que 3 chiffres lus tu rajoute espace et tu continus c tout.
 
 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] conversion de données (manipulations de string inside)

 

Sujets relatifs
J'ai decouvert un GROS bug en PHPconversion d'une chaine de caractere en nombre
[PHP](debutant) image et base de donnée[PHP] Distinguer un réperoire d'un fichier sans extension
[PHP] Si vous avez le choix préférez vous PDFlib ou FPDF ??[PHP] Fonctions FTP depuis un client?
probleme Apache/PHP[PHP] Rechercher dans un fichier .doc
PHP : compter en milliseconde le temps de génération d'une page ?[PHP] nombre de requetes dans mysql_query
Plus de sujets relatifs à : [PHP] conversion de données (manipulations de string inside)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR