web-dev-qa-db-fra.com

Comment effacer les zéros de fin dans PHP

Bonjour, est-ce que quelqu'un pourrait me donner une explication (et peut-être un exemple) sur la manière de supprimer les zéros de fin d'un nombre en utilisant PHP.

Par exemple: 

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

Serait remis à:

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

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

Merci = D

60
nhunston

Oubliez toutes 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 préfixer la variable avec (float) pour la convertir d'une chaîne en un flottant:

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

sortie:

37.422005

Le résultat réel que vous avez est des flottants mais qui vous sont transmis sous forme de chaînes en raison du protocole HTTP, il est bon de les reconvertir dans leur forme naturelle pour effectuer des calculs, etc.

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

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

111
RobertPitt

Essayez avec rtrim :

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

Si vous avez un nombre décimal se terminant par 0 (par exemple 123 000), vous pouvez également vouloir supprimer le séparateur décimal, qui peut être différent en fonction de la localisation 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 sûr, ce n’est pas une solution à l’épreuve des balles et peut ne pas être la meilleure. Si vous avez un nombre comme 12300.00, les 0 finaux de la partie entière ne seront pas supprimés, mais vous pourrez l'adapter à vos besoins spécifiques.

25
jweyrich

Vous aurez beaucoup de problèmes si vous essayez de couper ou d’autres manipulations de corde. Essayez de cette façon.

$string = "37.422005000000000000000000000000";

echo $string + 0;

Les sorties:

37.422005
20
Okonomiyaki3000

Vous pouvez également utiliser floatval(val);.

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

résulte en 

37.422005

7
Farray

Dans mon cas, j’ai fait ce qui suit en apportant d’autres réponses ici:

rtrim((strpos($number,".") !== false ? rtrim($number, "0") : $number),".");

Parce que je devais aussi enlever la décimale si un nombre entier était affiché 

Par exemple, cela montrera les nombres suivants 

2.00, 1.00, 28.50, 16.25 

Comme

2, 1, 28.5, 16.25

Plutôt que 

2., 1., 28.5, 16.25

Ce qui, pour moi, ne les montre pas correctement.

La dernière édition empêche également les nombres tels que "100" d'être ramenés à 1, en coupant uniquement les 0 les plus à droite si un nombre décimal est rencontré.

4
Warren Sergent

Si vous souhaitez éliminer les zéros en excès de la fin, mais uniquement jusqu'à une certaine décimale, il est utile de le faire (par exemple, 0.30000 affichera 0.30 et 0.0003000 affichera 0.0003).

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

Bien entendu, le {2} contrôle la limite de décimale.

4
scott klarr

La plupart de ces solutions suppriment les chiffres significatifs en nombres tels que "100" (sans décimale). Voici une solution simple qui n'a pas ce problème:

function TrimTrailingZeroes($nbr) {
    if(strpos($nbr,'.')!==false) $nbr = rtrim($nbr,'0');
    return rtrim($nbr,'.') ?: '0';
}

Je pense que cela couvre tous les scénarios.

>>> TrimTrailingZeroes('0')
=> "0"
>>> TrimTrailingZeroes('01')
=> "01"
>>> TrimTrailingZeroes('01.0')
=> "01"
>>> TrimTrailingZeroes('01.01')
=> "01.01"
>>> TrimTrailingZeroes('01.010')
=> "01.01"
>>> TrimTrailingZeroes('.0')
=> "0"
>>> TrimTrailingZeroes('.1')
=> ".1"
>>> TrimTrailingZeroes('.10')
=> ".1"
>>> TrimTrailingZeroes('3141592653589793.238462643383279502880000000000000000000000000000')
=> "3141592653589793.23846264338327950288"
4
mpen

Réduit les zéros à la fin, mais seulement après la décimale - nous ne voudrions pas convertir 100 -> 1, par exemple. Il supprimera également la période si seuls des zéros le suivent.

function trim_zeros($str) {
    if(!is_string($str)) return $str;
    return preg_replace(array('`\.0+$`','`(\.\d+?)0+$`'),array('','$1'),$str);
}
3
mpen

Pour moi, il me faut une autre solution pour convertir les valeurs exponentielles et les nombres simples comme 10 000 en dernier chiffre significatif non nul 

/* Convert any value to the least significant value */
function toDecimal($val) {

  // Convert any exponential sign to proper decimals
  $val = sprintf("%lf", $val);

  if (strpos($val, '.') !== false) {
      $val = rtrim(rtrim($val, '0'), '.');
  }

  return $val;
}

// Test cases
echo toDecimal(1000.000) . "\n";
echo toDecimal(1E-5) . "\n";
echo toDecimal(1E+5) . "\n";
echo toDecimal(1234.56) . "\n";
echo toDecimal(1234.5700) . "\n";
echo toDecimal(1234000) . "\n";
echo toDecimal(-1e10) . "\n";

// Results
1000
0.00001
100000
1234.56
1234.57
1234000
-10000000000
1
Joe Kuan

Vous devriez utiliser la fonction round qui est plus capable de manipuler des nombres qu'un replace.

1
William Durand

Si vous souhaitez une solution qui accepte un nombre minimal et maximal de décimales, cela devrait fonctionner:

/**
 * Displays up to 4 decimal places, with a minimum of 2 decimal places, trimming unnecessary zeroes
 *
 * @param mixed $number
 * @param int $minimumDecimals
 * @param int $maximumDecimals
 * @return string
 */
function rate_format($number, int $minimumDecimals = 2, int $maximumDecimals = 4): string
{
    $formatted = number_format($number, $maximumDecimals, '.', ',');
    $minimumLength = strpos($formatted, '.') + $minimumDecimals + 1;
    $extra = rtrim(substr($formatted, $minimumLength), "0");
    return substr($formatted, 0, $minimumLength) . $extra;
}


// rate_format("1.2500") returns "1.25"
// rate_format("1.2525") returns "1.2525"
// rate_format("1.25256") returns "1.2526"
// rate_format("1") returns "1.00"

C’est codé pour utiliser les paramètres régionaux américains, mais doit être facilement ajusté pour d’autres paramètres régionaux.

0
Devon

hum ... intéressant. J'ai utilisé ceci: 

// remove leading zeros
$output = ltrim ($output, "0");

// remove trailing 0s.
$temp=explode(".",$output);
$temp[1]=rtrim($temp[1],"0");
$output = $temp[0];
if (!empty($temp[1])) $output.='.'.$temp[1];

return $output;

Cela supprime les 0 finaux du nombre APRÈS le premier point décimal. Sinon, un nombre comme 100 devient 1.

Depuis que je faisais une comparaison, l’utilisation de la technique du float posait problème. J'espère que cela t'aides?

0
Dan

Vous pouvez utiliser rtrim () ( http://www.php.net/manual/en/function.rtrim.php ):

rtrim( "37.422005000000000000000000000000" , "0" )

Assurez-vous simplement qu'il y aura un point décimal.

0
linepogl