79 votes

Comment supprimer les zéros de fin de ligne en PHP ?

Quelqu'un pourrait-il me donner une explication (et peut-être un exemple) sur la façon de supprimer les zéros de fin d'un nombre en utilisant PHP ?

Par exemple :

"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"

serait transformé en :

"Lat":"37.422005","Lon":"-122.84095"

J'essaie de supprimer les zéros pour rendre le texte plus lisible. J'ai essayé d'utiliser str_replace() mais cela a remplacé les zéros à l'intérieur du nombre aussi.

0 votes

Mec, ajoute-le à 0, $a += 0 ; regarde le détail ici : nabtron.com/kiss-code

1 votes

@NabeelKhan Je recommanderais d'assigner $a + 0 à une nouvelle variable au lieu d'utiliser += qui changera le type de $a .

141voto

RobertPitt Points 28140

Oubliez tous les rtrims, et les expressions régulières, les coordonnées sont des flottants et doivent être traitées comme des flottants, il suffit de faire précéder la variable par (float) pour le faire passer d'une chaîne de caractères à un flottant :

$string = "37.422005000000000000000000000000";
echo (float)$string;

sortie :

37.422005

Les résultats réels que vous obtenez sont des flottants, mais ils vous sont transmis sous forme de chaînes de caractères en raison du protocole HTTP. Il est bon de les ramener à leur forme naturelle pour effectuer des calculs, etc.

Cas de test : http://codepad.org/TVb2Xyy3

Note : Concernant le commentaire sur la précision en virgule flottante en PHP, voir ceci : https://stackoverflow.com/a/3726761/353790

0 votes

Un bon point, cela faciliterait l'utilisation des données du téléphone pour le traçage des points.

29 votes

Mauvaise solution. Les flottants ont une précision finie ; cela peut tronquer les chiffres significatifs.

4 votes

Je ne pense pas que ce soit une mauvaise solution, je pense que c'est l'une des meilleures solutions pour ce langage, si le PO a besoin de précision, alors il devrait envisager d'utiliser C, C#, Python etc. qui supportent la précision finie.

46voto

jweyrich Points 10002

Essayez avec rtrim :

$number = rtrim($number, "0");

Si vous avez un nombre décimal se terminant par des 0 (par exemple 123.000), vous mai souhaitent également supprimer le séparateur décimal qui peut être différent selon la locale utilisée . Pour le supprimer de manière fiable, vous pouvez procéder comme suit :

$number = rtrim($number, "0");
$locale_info = localeconv();
$number = rtrim($number, $locale_info['decimal_point']);

Bien entendu, il ne s'agit pas d'une solution infaillible, et ce n'est peut-être pas la meilleure. Si vous avez un nombre comme 12300.00, il ne supprimera pas les 0 de fin de la partie entière, mais vous pouvez l'adapter à vos besoins spécifiques.

23 votes

Dans mon cas, j'ai fait ce qui suit : rtrim(rtrim($number, "0"), ".") Parce que je devais aussi enlever la décimale si un nombre entier était affiché (par exemple, cela affichera les nombres 2.00, 1.00, 28.50, 16.25 que je voulais afficher comme 2, 1, 28.5, 16.25, plutôt que 2., 1., 28.5, 16.25)

3 votes

J'aime cette solution parce que vous pouvez préserver les virgules insérées avec le format de nombre : rtrim(rtrim(format de nombre($nombre, 2), '0'), '.') Dans mon cas, je n'ai pas besoin de me préoccuper des nombres entiers comme 100, car je tire une valeur décimale de la base de données.

0 votes

@Staysee n'est-il pas possible que vous tiriez une valeur décimale de la base de données qui ressemble à : "123.0000000" ? Maintenant, qu'est-ce que vous avez ?

38voto

Okonomiyaki3000 Points 1657

Vous aurez beaucoup de problèmes si vous essayez de couper ou de manipuler les cordes. Essayez de cette façon.

$string = "37.422005000000000000000000000000";

echo $string + 0;

Sorties :

37.422005

3 votes

Excellente solution. Savez-vous comment cela fonctionne ? Parce que ça marche

3 votes

C'est très simple. Vous commencez avec une chaîne qui a beaucoup de zéros à la fin. PHP ne peut pas ajouter l'entier 0 à une chaîne de caractères, il convertit d'abord la chaîne en un type numérique puis ajoute 0 à celui-ci. Vous obtenez alors un nombre, et non une chaîne de caractères. Les types numériques n'ont pas besoin de zéros de fin. Il faut faire attention à la conversion automatique des types, mais dans un cas comme celui-ci, elle est tout à fait prévisible et sûre.

0 votes

Wow ! Je pense que c'est la définition de "trop beau pour être vrai" ! Comme quelqu'un l'a déjà fait remarquer, cela mériterait une petite explication.

8voto

Farray Points 3748

Vous pouvez également utiliser floatval(val); .

 <?php
 echo floatval( "37.422005000000000000000000000000" );
 ?>

résulte en

37.422005

2 votes

Je ne pense pas que ce soit le meilleur choix en premier lieu, mais si vous voulez convertir en flotteur, n'utilisez pas de floatval() . Il suffit de le lancer comme un flotteur avec (float) . Dans la mesure du possible, évitez toujours d'appeler des fonctions supplémentaires. Le cas d'utilisation de floatval() c'est lorsque vous voulez convertir un tableau entier de valeurs en flottant, alors vous pouvez appeler array_map('floatval', $someArray);

1 votes

Les deux sites floatval y (float) transformer mon nombre en notation scientifique .0E-7

5voto

scott klarr Points 51

Si vous souhaitez supprimer les zéros superflus à la fin mais seulement jusqu'à une certaine décimale, c'est une expression utile pour le faire (par exemple 0,30000 indiquera 0,30 et 0,0003000 indiquera 0,0003).

preg_replace("/(?<=\\.[0-9]{2})[0]+\$/","",$number);

Bien sûr, le {2} contrôle la limite de la décimale.

9 votes

+1 pour avoir utilisé la méthode la plus complexe pour résoudre un problème simple :-)

0 votes

"0.0003000" sera no convertir en "0.0003" . Vous n'avez autorisé que deux chiffres non nuls après la virgule. Cette regex ne correspondra même pas. Vous feriez mieux d'utiliser number_format($x,2,'.','') si c'est le résultat que vous voulez.

0 votes

N'utilisez pas d'expressions régulières pour quelque chose comme ça. Surtout n'utilisez pas une expression régulière aussi complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X