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

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

Marsh Posté le 06-05-2003 à 22:02:23    

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
Reply

Marsh Posté le 06-05-2003 à 22:02:23   

Reply

Marsh Posté le 07-05-2003 à 00:27:52    

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. }

Reply

Marsh Posté le 07-05-2003 à 11:30:49    

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+

Reply

Marsh Posté le 07-05-2003 à 11:37:12    

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.
 
 :)

Reply

Sujets relatifs:

Leave a Replay

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