[PHP] Conversion string to float... mais ca marche pas !

Conversion string to float... mais ca marche pas ! [PHP] - PHP - Programmation

Marsh Posté le 14-11-2008 à 13:56:50    

hello,
 
Je récupère un fichier sur le site Euronext pour charger dans une base les valeurs du CAC40... Jusque la, tout fonctionne...  
La valeur du cours est de la forme : 3 340,54
Ma base ne contient que des champs en VARCHAR pour charger toutes ses données...
 
Voilà mon code sur cette partie :

Code :
  1. $f = file("http://www.euronext.com/tools/datacentre/dataCentreDownloadExcell.jcsv?cha=3047&lan=FR&fileFormat=xls&separator=,&dateFormat=dd/MM/yy&isinCode=FR0003500008&selectedMep=1&typeDownload=3" );
  2.     $f = array_slice($f, 3); // Supprime l'en-tete  
  3.     foreach($f as $key => $val)
  4. {
  5.      $arr = explode("\t", $val);
  6.  $query = "INSERT INTO `cac40` ( `indice` , `isin` , `code` , `marche` , `mnemo` , `cours` , `j_j-1` , `date` , `ouverture` , `max` , `heure_max` , `min` , `heure_min` , `var_annee` , `annee_haut` , `date_haut` , `annee_bas` , `date_bas` , `var_52s` , `52s_haut` , `date52s_haut` , `52s_bas` , `date52s_bas` , `hausses` , `baisses` , `neutre` )
  7. VALUES (";
  8.     for ($i = 0; $i < count($arr); $i++)
  9.     {
  10.    
  11.      $query .= "'$arr[$i]'";
  12.      if ($i < (count($arr) - 1)) $query .= ", ";
  13.     }
  14.     $query .= " )";
  15.    
  16.     //$sub = substr($query,542);
  17.     //echo $query;
  18.     //echo "<br>";
  19.    
  20.     $result = mysql_query($query);
  21.      }


 
Ensuite, je voudrais faire plein de calculs sur ces données, mais c'est la le soucis...
 
Quand je convertis un des VARCHAR en float via FLOATVAL, ca déconne et PHP ne me garde que le chiffre avant l'espace des milliers...
 
Avez vous des idées ?
 
Merci,
 
m.

Reply

Marsh Posté le 14-11-2008 à 13:56:50   

Reply

Marsh Posté le 14-11-2008 à 13:58:58    

Pourquoi stocker ça en VARCHAR ? [:pingouino]

Reply

Marsh Posté le 14-11-2008 à 13:59:36    

Sinon à tous les coups c'est un problème de séparateur décimal. Si la locale est pas bonne, c'est le point, et pas la virgule

Reply

Marsh Posté le 14-11-2008 à 14:04:30    

Quand je mets FLOAT dans ma BDD, il ne me charge que le "3" de "3 440,50"...
 

Reply

Marsh Posté le 14-11-2008 à 14:07:54    

Séparateur décimal, petit :o Y'a que nous cons de français qui ont mis la virgule, c'est pour ça que ça pète. Remplace partout par un point, et le problème est réglé


Message édité par FlorentG le 14-11-2008 à 14:08:14
Reply

Marsh Posté le 14-11-2008 à 14:11:41    

j'utilise EXPLODE ?

Reply

Marsh Posté le 14-11-2008 à 14:15:00    

Nan, str_replace pour remplacer les ',' en '.'

Reply

Marsh Posté le 16-11-2008 à 16:26:06    

Le str_replace sur la "," en "." a super bien marché... mais ca déconne avc le " "...
 
Il reste un espace que j'arrive pas a virer dans "3 444.45"...
 
Et donc php ne prend que le "3" en float... pfff !

Reply

Marsh Posté le 16-11-2008 à 16:35:19    

Code :
  1. $string = str_replace(' ', '', $string);
  2. $string = str_replace(',', '.', $string);
  3. $float = (float) $string;


 
Tu vires les espaces,
tu remplaces la virgule par le point,  
puis tu laisses PHP faire la conversion string2float
 
car :
 

Code :
  1. $float = (float) $string;


 
fait pareil que
 

Code :
  1. $float = floatval($string);


 
je préfère (float) qui est plus rapide (à écrire, mais aussi en temps d'exécution) et plus lisible amha. Enfin bon, à toi de voir ce que tu préfères.


Message édité par Profil supprimé le 16-11-2008 à 19:57:00
Reply

Marsh Posté le 16-11-2008 à 16:48:37    

eh bien c'est ce que je faisais... mais bizarrement, ca ne marche pas...
 
l'espace est tjrs la, et quand je passe en float, il ne me garde que "3"... :(

Reply

Marsh Posté le 16-11-2008 à 16:48:37   

Reply

Marsh Posté le 16-11-2008 à 16:49:28    

Ci-joint mon code complet !  
 
 

Code :
  1. <?php
  2. require("sql.php" );
  3. $mydate=date("d/m/y" );
  4. $sqldate=date("Y-m-d" );
  5. echo $sqldate;
  6. echo "<br>";
  7. $m=0;
  8. // on nettoie la table à chaque alimentation
  9. $query_vidage = "TRUNCATE TABLE `master_data`;";
  10. $result_vidage = mysql_query($query_vidage);
  11. $f = file("http://www.euronext.com/search/download/pricesearchdownloadpopup.jcsv?pricesearchresults=actif&equitiesChoice=1&structuredProductType=8&requestComesFromSearchBoxParameter=true&lan=EN&resultsTitle=Warrants&cha=1812&underlying=FR0003500008*XPAR*ISIN&instrumentType=3&underlyingType=2&riskLevel=L&format=xls&formatDecimal=.&formatDate=dd/MM/yy" );
  12.     $f = array_slice($f, 5); // Supprime l'en-tete  
  13.     foreach($f as $key => $val)
  14. {
  15.      $arr = explode("\t", $val);
  16.  $query = "INSERT INTO `master_data` ( `Instrument` , `ISIN` , `Euronext_code` , `Market` , `Symbol` , `Underlying` , `Type` , `Strike` , `Maturity` , `Currency` , `Last1` , `Last2` , `D_D-1` , `Date` , `Turnover` , `Parity` , `Trading_mode` , `Day_First` , `Day_High` , `Day_High_Date` , `Day_Low` , `Day_Low_Date` , `Change_3112` , `High_3112` , `HighDate_3112` , `Low_3112` , `LowDate_3112` , `Change_52w` , `High_52w` , `HighDate_52w` , `Low_52w` , `LowDate_52w` , `Issuer` , `Suspended` , `Suspended_Date` , `Reserved` , `Reserved_Date` ) VALUES (";
  17.     for ($i = 0; $i < count($arr); $i++)
  18.     {
  19.      $query .= "'$arr[$i]'";
  20.      if ($i < (count($arr) - 1)) $query .= ", ";
  21.     }
  22.     $query .= " )";
  23.    
  24.     //$sub = substr($query,542);
  25.     //echo $query;
  26.     //echo "<br>";
  27.    
  28.     $result = mysql_query($query);
  29.      }
  30.  echo "BDD alimentée par Euronext avec succés ! <br>";
  31. //on vide data retraitee
  32. $query_vidage = "TRUNCATE TABLE `data_retraitee`;";
  33. $result_vidage = mysql_query($query_vidage);
  34. $query="SELECT `Instrument`,`date`,`turnover`,`d_d-1` FROM `master_data`";
  35. $result=mysql_query($query);
  36. $num_results=mysql_num_rows($result);
  37. for($k=0;$k<$num_results+1;$k++)
  38.  {
  39.  $row=mysql_fetch_array($result);
  40.  htmlspecialchars(stripslashes($code=$row["Instrument"]));
  41.  htmlspecialchars(stripslashes($date=$row["date"]));
  42.  htmlspecialchars(stripslashes($turnover=$row["turnover"]));
  43.  htmlspecialchars(stripslashes($volume=$row["d_d-1"]));
  44.  if ($date <> '-') {
  45.  $date_insert = substr($date,0,8);
  46.  //echo $date_insert;
  47.  //echo "<br>";
  48.  $turbo_call=0;
  49.  $turbo_put=0;
  50.  $turbo_procall=0;
  51.  $turbo_proput=0;
  52.  $CAP=0;
  53.  $FLO=0;
  54.  $CPP=0;
  55.  $FLP=0;
  56.  $BO=0;
  57.  $warr_call=0;
  58.  $warr_put=0;
  59.   if ($date_insert == $mydate) {
  60.    $pos = strpos( $code, 'TL' );
  61.    if (is_int($pos)==TRUE) $turbo_call=$volume;
  62.    $pos = strpos( $code, 'TS' );
  63.    if (is_int($pos)==TRUE ) $turbo_put=$volume;
  64.    $pos = strpos( $code, 'TPL' );
  65.    if (is_int($pos)==TRUE ) $turbo_procall=$volume;
  66.    $pos = strpos( $code, 'TPS' );
  67.    if (is_int($pos)==TRUE ) $turbo_proput=$volume;
  68.    $pos = strpos( $code, 'CAP' );
  69.    if (is_int($pos)==TRUE ) $CAP=1;
  70.    $pos = strpos( $code, 'FLO' );
  71.    if (is_int($pos)==TRUE ) $FLO=1;
  72.    $pos = strpos( $code, 'CPP' );
  73.    if (is_int($pos)==TRUE ) $CPP=1;
  74.    $pos = strpos( $code, 'FLP' );
  75.    if (is_int($pos)==TRUE ) $FLP=1;
  76.    $pos = strpos( $code, 'BO' );
  77.    if (is_int($pos)==TRUE ) $BO=1;
  78.    $pos = strpos( $code, '0C' );
  79.    if (is_int($pos)==TRUE ) {if($CAP+$FLO+$CPP+$FLP+$BO=0) $warr_call=$turnover;}
  80.    $pos = strpos( $code, '0P' );
  81.    if (is_int($pos)==TRUE ) {if($CAP+$FLO+$CPP+$FLP+$BO=0) $warr_put=$turnover;}
  82.    echo $code;echo">>>>>> ";echo $turbo_call;echo " / ";echo $turbo_put;echo " / ";echo $turbo_procall;echo " / ";echo $turbo_proput;echo " / ";echo $CAP;echo " / ";echo $FLO;echo " / ";echo $CPP;echo " / ";echo $FLP;echo " / ";echo $warr_call;echo " / ";echo $warr_put;echo " <br>";
  83.    $requete_ajo="INSERT INTO `data_retraitee` VALUES
  84.  ('$date_insert','$code','$turnover','$volume','$turbo_call','$turbo_put','$turbo_procall','$turbo_proput','$warr_call','$warr_put','$CAP','$FLO','$BO','$CPP','$FLP','0');";
  85.    //echo $requete_ajo."<br>";
  86.    mysql_query($requete_ajo);
  87.   }
  88.  }
  89.  }
  90.  //on vide cac40
  91. $query_vidage = "TRUNCATE TABLE `cac40`;";
  92. $result_vidage = mysql_query($query_vidage);
  93.  $f = file("http://www.euronext.com/tools/datacentre/dataCentreDownloadExcell.jcsv?cha=3047&lan=FR&fileFormat=xls&separator=,&dateFormat=dd/MM/yy&isinCode=FR0003500008&selectedMep=1&typeDownload=3" );
  94.     $f = array_slice($f, 3); // Supprime l'en-tete  
  95.     foreach($f as $key => $val)
  96. {
  97.      $arr = explode("\t", $val);
  98.  $query = "INSERT INTO `cac40` ( `indice` , `isin` , `code` , `marche` , `mnemo` , `cours` , `j_j-1` , `date` , `ouverture` , `max` , `heure_max` , `min` , `heure_min` , `var_annee` , `annee_haut` , `date_haut` , `annee_bas` , `date_bas` , `var_52s` , `52s_haut` , `date52s_haut` , `52s_bas` , `date52s_bas` , `hausses` , `baisses` , `neutre` )
  99. VALUES (";
  100.     for ($i = 0; $i < count($arr); $i++)
  101.     {
  102.    
  103.      $query .= "'$arr[$i]'";
  104.      if ($i < (count($arr) - 1)) $query .= ", ";
  105.     }
  106.     $query .= " )";
  107.    
  108.     //$sub = substr($query,542);
  109.     //echo $query;
  110.     //echo "<br>";
  111.    
  112.     $result = mysql_query($query);
  113.      }
  114. $query = "SELECT * FROM `irma14` WHERE `irma14`.`date` = '$sqldate'";
  115. $result=mysql_query($query);
  116. $num_results=mysql_num_rows($result);
  117. if ($num_results==0)
  118. {
  119. //echo "pas ma date<br>";
  120. $query = "SELECT `cours`,`ouverture`,`max`,`min`,`j_j-1` FROM `cac40`";
  121. $result=mysql_query($query);
  122. $num_results=mysql_num_rows($result);
  123.  $row=mysql_fetch_array($result);
  124.  htmlspecialchars(stripslashes($cours=$row["cours"]));
  125.  htmlspecialchars(stripslashes($ouverture=$row["ouverture"]));
  126.  htmlspecialchars(stripslashes($max=$row["max"]));
  127.  htmlspecialchars(stripslashes($min=$row["min"]));
  128.  htmlspecialchars(stripslashes($diff_veille=$row["j_j-1"]));
  129.  $diff_veille=str_replace(",",".",$diff_veille);
  130.  $test=round((1+($diff_veille/100)),4);
  131.  $cours=str_replace(' ', '',$cours);
  132.  $cours=str_replace(',', '.',$cours);
  133.  //print_r($cours);
  134.  //$cours=floatval($cours);  
  135.  //$cours=number_format($cours,4,'.',' ');
  136.  $fermeture = $cours/$test;
  137.  echo $cours.">".$ouverture.">".$min.">".$max.">".$fermeture.">".$test;
  138.  }
  139. else {echo "vas-y fonce bonhomme<br>";}
  140. ?>

Reply

Marsh Posté le 16-11-2008 à 19:58:47    

chez moi çà marche parfaitement avec str_replace et (float)
et pourquoi tu mets floatval en commentaire aussi ??

Reply

Marsh Posté le 16-11-2008 à 23:48:32    

essaye str_replace(" ","",$mavariable)


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 17-11-2008 à 12:37:39    

c'est bizarre que ca m'ache chez vous...
 
moi, quand je mets le floatval, il ne me garde que le 3...
 
et le str_replace ne fonctionne pas avec l'espace !!!

Reply

Marsh Posté le 17-11-2008 à 13:22:51    

Ils ont peut-être mis une espace insécable [:pingouino]
 
Vire tout ce qui n'est pas chiffre et virgule sinon, ce sera plus simple

Reply

Marsh Posté le 17-11-2008 à 15:55:41    

j'ai demandé le caractere ASCII de cet espac via la fonction ord()...
 
Il s'agit du 160...
 
Vous connaissez l'nverse de cette fonction, pour que je mette le code ASCII dans mon str_replace ?

Reply

Marsh Posté le 17-11-2008 à 16:22:38    

160 c'est bien une espace insécable :) Ils font ça bien on dirait, c'est exactement ce qu'il faut. L'inverse c'est chr(). Ou tape Alt+0160 :D

Reply

Marsh Posté le 17-11-2008 à 16:56:29    

youhou !!! on s'en sort...  
 
enfin, on est bon !!!! :)
 
merci à tous pour votre aide !!!
 

Reply

Sujets relatifs:

Leave a Replay

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