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

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1812032
jay-jay69
Posté le 14-11-2008 à 13:56:50  profilanswer
 

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.

mood
Publicité
Posté le 14-11-2008 à 13:56:50  profilanswer
 

n°1812033
FlorentG
Unité de Masse
Posté le 14-11-2008 à 13:58:58  profilanswer
 

Pourquoi stocker ça en VARCHAR ? [:pingouino]

n°1812034
FlorentG
Unité de Masse
Posté le 14-11-2008 à 13:59:36  profilanswer
 

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

n°1812036
jay-jay69
Posté le 14-11-2008 à 14:04:30  profilanswer
 

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

n°1812039
FlorentG
Unité de Masse
Posté le 14-11-2008 à 14:07:54  profilanswer
 

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
n°1812041
jay-jay69
Posté le 14-11-2008 à 14:11:41  profilanswer
 

j'utilise EXPLODE ?

n°1812045
FlorentG
Unité de Masse
Posté le 14-11-2008 à 14:15:00  profilanswer
 

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

n°1812738
jay-jay69
Posté le 16-11-2008 à 16:26:06  profilanswer
 

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 !

n°1812739
Profil sup​primé
Posté le 16-11-2008 à 16:35:19  answer
 

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
n°1812746
jay-jay69
Posté le 16-11-2008 à 16:48:37  profilanswer
 

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"... :(

mood
Publicité
Posté le 16-11-2008 à 16:48:37  profilanswer
 

n°1812747
jay-jay69
Posté le 16-11-2008 à 16:49:28  profilanswer
 

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

n°1812793
Profil sup​primé
Posté le 16-11-2008 à 19:58:47  answer
 

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

n°1812839
ionik
Posté le 16-11-2008 à 23:48:32  profilanswer
 

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


---------------
Recette cookeo Recette de cuisine
n°1812975
jay-jay69
Posté le 17-11-2008 à 12:37:39  profilanswer
 

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 !!!

n°1812988
FlorentG
Unité de Masse
Posté le 17-11-2008 à 13:22:51  profilanswer
 

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

n°1813038
jay-jay69
Posté le 17-11-2008 à 15:55:41  profilanswer
 

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 ?

n°1813050
FlorentG
Unité de Masse
Posté le 17-11-2008 à 16:22:38  profilanswer
 

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

n°1813072
jay-jay69
Posté le 17-11-2008 à 16:56:29  profilanswer
 

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


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

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

 

Sujets relatifs
[résolu]Récupération d'un tableau dans une stringMarche pas :'(
[PHP] timeout 0 dans le php.ini, quelques questions[PHP Class] - Création d'un objet et attribution de valeurs (tableau)
PHP fonctions FTPGros pb plus rien ne marche
variables d'environnement du shell à PHPCharger un fichier XML en PHP
[PHP] Librairie graphique php - Valeur du point en survolSupprimer les balises HTML d'une string en javascript
Plus de sujets relatifs à : [PHP] Conversion string to float... mais ca marche pas !


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