[résolu] Truc de dingue : float écrits avec un . ou une ,

Truc de dingue : float écrits avec un . ou une , [résolu] - PHP - Programmation

Marsh Posté le 02-04-2019 à 13:58:15    

Bonjour à tous,
Je viens de tomber sur un truc de dingue sur une appli web en PHP/Mysql/HTML/CSS/Javascript que je suis en train de modifier. A un moment dans mon code, je mets dans une variable PHP de type tableau associatif 2 nombres float (ex : 47.526 et 1.74). J'utilise ensuite cet array pour initialiser 2 variables javascript, le code javascript étant généré par PHP. Ca donne un truc du genre :

Code :
  1. $Point = array('lat' => 47.526, 'lng' => 1.74);
  2. echo <<<EOT
  3. <script type="text/javascript">
  4.     var centerLat = {$Point['lat']};
  5.     var centerLng = {$Point['lng']};
  6. </script>
  7. EOT;


Bien entendu, la partie Javascript contient bien plus de lignes mais c'est sans rapport avec mon pb.
 
Mon problème est le suivant : de temps en temps, j'ai un msg d'erreur sur mon Javascript au niveau de ma variable centerLat. Quand j'affiche le code source de la page HTML générée dans ce cas, j'ai :
var centerLat = 47,526;
var centerLng = 1,74;
 
Au lieu de :  
var centerLat = 47.526;
var centerLng = 1.74;
La plupart du temps, j'ai mes floats avec le . et non la virgule. Il suffit que je fasse un F5 de ma page pour retrouver mes float écrits avec un .! :pt1cable: Une idée de ce qui peut provoquer un tel comportement ? Parce que j'avais déjà vu ce type de différence entre 2 serveurs, mais ça venait de la configuration de la représentation des décimales sur le serveur qui différait de l'un à l'autre. Mais là, c'est sur un wampserver. Donc, la conf reste identique. C'est vraiment très bizarre ce bagottement :/


Message édité par rufo le 02-04-2019 à 16:48:20

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-04-2019 à 13:58:15   

Reply

Marsh Posté le 02-04-2019 à 14:22:39    

Bon, sur la page de setlocale() ( https://www.php.net/manual/fr/function.setlocale.php ) j'ai vu un avertissement. Mais c'est bizarre, j'ai pas d'autre script qui tourne sur mon wampserveur qui pourrait faire un setlocale() :/
Du coup, c'est quoi la méthode "propre" pour garantir que j'ai mes floats écrits avec un . et non une , ? Je passe par un str_replace ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-04-2019 à 15:21:11    

Au niveau du bug, je me dirigerai vers le fait que quand tu rafraichies tu utilises un cookie et donc des appels de méthodes du genre datetime ou vice versa. Bref entre le cas avec et sans cookie tu dois avoir un appel explicite ou implicite d'un paramétrage de setlocale.

 

D'après une recherche, sans approfondir, la solution, la plus adaptée serait d'utiliser number_format().


Message édité par MaybeEijOrNot le 02-04-2019 à 15:21:20

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 02-04-2019 à 15:41:24    

J'ai effectivement utilisé number_format(). Mais bizarre : impossible de trouver où setlocale() est appelée. Or, j'ai qu'une appli. L'avertissement semble indiquer sur Windows, ça peut venir d'autres choses et pas uniquement de PHP...
J'ai fait un test : en début de script, je fais un setlocale() avec un '.' et quand j'affiche les paramètres locaux via localeconv() j'ai bien mon '.'. Plus loin dans le script, je refais un localeconv() et là, j'ai un ',' :(


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-04-2019 à 16:09:27    

Je te dis, je pense que certaines méthodes font des appels implicites de setlocale. Je dis ça d'instinct, faudrait vérifier, mais ça ne m'étonnerait pas que des méthodes qui font optionnellement du formatage ou de la conversion de type fassent un appel implicite de setlocale ou trifouille la mémoire à ce niveau.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 02-04-2019 à 16:11:32    

Ok, tu parles de fonctions natives de php et non de fonctions appelées dans des scripts php. Effectivement, dans ce cas, je ne pourrai pas le voir (autrement qu'en explorant le code source des fonctions natives de PHP, chose que je ne ferai pas).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-04-2019 à 16:16:17    

Oui je parles des fonctions natives de PHP, sans fouiller comment sont codées ces fonctions, il reste la possibilité de regarder le comportement avec et sans en les isolant dans un autre script.
Mais comme toi, j'ai la flemme, surtout que moi je ne connais pas les fonctions que tu utilises et qu'on pourrait incriminer. Puis faut lancer un serveur. :o


Message édité par MaybeEijOrNot le 02-04-2019 à 16:16:46

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 02-04-2019 à 16:48:08    

Au final, avec number_format(), j'ai résolu mon pb, mais c'est la première fois que je tombe sur un tel pb depuis que je code en PHP (2002!) :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-04-2019 à 16:59:50    

L'autre jour je me suis fait piégé par un &$val dans un foreach que je n'avais pas unset en sortie de boucle, je me suis bien arraché les cheveux. :fou:


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 03-04-2019 à 10:03:58    

J'ai utilisé la syntaxe echo <<<EOT parce que j'ai un gros morceau de Javascript à insérer dans ma page qui comporte à quelques endroits l'insertion de variables PHP. Du coup, faire pleins de echo, c'est relou. D'habitude, j'utilise très peu la syntaxe echo <<<EOT.
 
Mais quand je peux, je ferai le test.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-04-2019 à 10:03:58   

Reply

Marsh Posté le 03-04-2019 à 10:15:10    

Pour moi, l'intérêt de cette syntaxe ce n'est pas le fait d'utiliser plus ou moins de echo (pour moi tu en utilises le même nombre) mais le fait de ne pas se compliquer avec l'échappement de certains caractères (entre autre les guillemets) et d'éviter éventuellement des concaténations.


Message édité par MaybeEijOrNot le 03-04-2019 à 10:16:21

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

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