numero - Cómo quitar los ceros finales en PHP
quitar decimales php (15)
Hola, ¿podría alguien darme una explicación (y tal vez un ejemplo) sobre cómo voy a quitar los ceros finales de un número usando PHP?
Por ejemplo:
"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"
Sería entregado a:
"Lat":"37.422005","Lon":"-122.84095"
Estoy tratando de quitar los ceros para hacerlo más legible. Intenté usar str_replace()
pero esto también reemplazó los ceros dentro del número (doh).
Gracias = D
Debería usar la función de ronda que es más capaz de manipular números que un replace
.
En mi caso, hice lo siguiente, extendiendo otras respuestas aquí:
rtrim((strpos($number,".") !== false ? rtrim($number, "0") : $number),".");
Porque también tuve que eliminar el decimal si se mostraba un número entero
Como ejemplo, esto mostrará los siguientes números
2.00, 1.00, 28.50, 16.25
Como
2, 1, 28.5, 16.25
Más bien que
2., 1., 28.5, 16.25
Lo cual, para mí, no es mostrarlos correctamente.
La última edición también evita que números como "100" pasen a 1, al recortar solo los 0 más a la derecha si se encuentra un decimal.
La mayoría de estas soluciones recortarán dígitos significativos en números como "100" (sin decimal posterior). Aquí hay una solución simple que no tiene este problema:
function TrimTrailingZeroes($nbr) {
if(strpos($nbr,''.'')!==false) $nbr = rtrim($nbr,''0'');
return rtrim($nbr,''.'') ?: ''0'';
}
Creo que cubre todos los diferentes escenarios.
>>> 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"
Olvídese de todos los rtrims, y las expresiones regulares, las coordenadas son flotantes y deben tratarse como flotantes, simplemente anteponga la variable con (float)
para convertirla de una cadena a un float:
$string = "37.422005000000000000000000000000";
echo (float)$string;
salida:
37.422005
El resultado real que tiene son flotantes pero pasados a usted como cadenas debido al protocolo HTTP, es bueno volverlos a su forma natural para hacer cálculos, etc.
Caso de prueba: http://codepad.org/TVb2Xyy3
Nota : En cuanto al comentario sobre la precisión de punto flotante en PHP, consulte esto: https://.com/a/3726761/353790
Para mí, necesito una solución adicional para convertir valores exponenciales y números simples como 10000 en el último dígito significativo distinto de cero
/* 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
Prueba con rtrim :
$number = rtrim($number, "0");
Si tiene un número decimal que termina en 0 (por ejemplo, 123.000), es posible que también desee eliminar el separador decimal , que puede ser diferente según la configuración regional utilizada . Para eliminarlo de manera confiable, puede hacer lo siguiente:
$number = rtrim($number, "0");
$locale_info = localeconv();
$number = rtrim($number, $locale_info[''decimal_point'']);
Esto, por supuesto, no es una solución a prueba de balas, y puede que no sea la mejor. Si tiene un número como 12300.00, no eliminará los 0 finales de la parte entera, pero puede adaptarlo a sus necesidades específicas.
Puede usar rtrim () ( rtrim ):
rtrim( "37.422005000000000000000000000000" , "0" )
Solo asegúrate de que haya un punto decimal.
Recorta los ceros finales, pero solo después de la posición decimal; no queremos convertir 100 -> 1, por ejemplo. También quitará el período si solo lo siguen los ceros.
function trim_zeros($str) {
if(!is_string($str)) return $str;
return preg_replace(array(''`/.0+$`'',''`(/./d+?)0+$`''),array('''',''$1''),$str);
}
Sé que esta pregunta se hizo en 2012, pero acabo de encontrar esta simple solución ...
$result = $num + 0;
Entonces para esta pregunta sería:
$lat = 37.422005000000000000000000000000 + 0; //37.422005
$lon = -122.84095000000000000000000000000 + 0; //-122.84095
Si desea quitar el exceso de ceros del final, pero solo hasta un cierto lugar decimal, esta es una expresión útil para hacer justamente eso (por ejemplo, 0.30000 mostrará 0.30 y 0.0003000 mostrará 0.0003).
preg_replace("/(?<=//.[0-9]{2})[0]+/$/","",$number);
Por supuesto, {2} controla el límite de lugar decimal.
Similar a la respuesta de Okonomiyaki3000 en lugar de agregar también se puede multiplicar por 1, como
$string = "37.422005000000000000000000000000";
echo $string*1;die; // outputs - 37.422005
También puedes usar floatval(val);
.
<?php
echo floatval( "37.422005000000000000000000000000" );
?>
resultados en
37.422005
Te encontrarás con muchos problemas si intentas recortar u otras manipulaciones de cuerdas. Intenta de esta manera.
$string = "37.422005000000000000000000000000";
echo $string + 0;
Productos:
37.422005
mmm interesante. Yo he usado esto:
// 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;
Esto elimina los 0 finales del número DESPUÉS del primer punto decimal. De lo contrario, un número como 100 se convierte en 1.
Como estaba haciendo una comparación, usar la técnica de flotación causó problemas. ¿Espero que esto ayude?
preg_replace
hará el truco:
$lat=preg_replace(''/0+$/'','''',$lat);