solo - Elimina los cero dígitos inútiles de los decimales en PHP
php round 2 decimals with zero (18)
Este Código eliminará el cero después del punto y devolverá solo dos dígitos decimales.
$ number = 1200.0000;
str_replace (''. 00'', '''', number_format ($ number, 2, ''.'', ''''));
La salida será: 1200
Estoy tratando de encontrar una forma rápida de eliminar zero decimals
de valores numéricos como este:
echo cleanNumber(''125.00'');
// 125
echo cleanNumber(''966.70'');
// 966.7
echo cleanNumber(844.011);
// 844.011
¿Existe alguna manera optimizada para hacer eso?
Debes lanzar tus números como flotadores, lo que hará esto por ti.
$string = "42.422005000000000000000000000000";
echo (float)$string;
La salida de esto será lo que estás buscando.
42.422005
Debido a esta pregunta es viejo. Primero, lo siento por esto.
La pregunta es sobre el número xxx.xx, pero en el caso de que sea x, xxx.xxxxx o separador decimal de diferencia, como xxxx, xxxx, puede ser más difícil encontrar y eliminar cero dígitos del valor decimal.
/**
* Remove zero digits from decimal value.
*
* @param string|int|float $number The number can be any format, any where use in the world such as 123, 1,234.56, 1234.56789, 12.345,67, -98,765.43
* @param string The decimal separator. You have to set this parameter to exactly what it is. For example: in Europe it is mostly use "," instead of ".".
* @return string Return removed zero digits from decimal value.
*/
function removeZeroDigitsFromDecimal($number, $decimal_sep = ''.'')
{
$explode_num = explode($decimal_sep, $number);
if (is_array($explode_num) && isset($explode_num[count($explode_num)-1]) && intval($explode_num[count($explode_num)-1]) === 0) {
unset($explode_num[count($explode_num)-1]);
$number = implode($decimal_sep, $explode_num);
}
unset($explode_num);
return (string) $number;
}
Y aquí está el código para la prueba.
$numbers = [
1234,// 1234
-1234,// -1234
''12,345.67890'',// 12,345.67890
''-12,345,678.901234'',// -12,345,678.901234
''12345.000000'',// 12345
''-12345.000000'',// -12345
''12,345.000000'',// 12,345
''-12,345.000000000'',// -12,345
];
foreach ($numbers as $number) {
var_dump(removeZeroDigitsFromDecimal($number));
}
echo ''<hr>''."/n/n/n";
$numbers = [
1234,// 12324
-1234,// -1234
''12.345,67890'',// 12.345,67890
''-12.345.678,901234'',// -12.345.678,901234
''12345,000000'',// 12345
''-12345,000000'',// -12345
''12.345,000000'',// 12.345
''-12.345,000000000'',// -12.345
''-12.345,000000,000'',// -12.345,000000 STRANGE!! but also work.
];
foreach ($numbers as $number) {
var_dump(removeZeroDigitsFromDecimal($number, '',''));
}
Esa es mi pequeña solución ... Se puede incluir en una clase y establecer vars
private $ dsepparator = ''.''; // decimales private $ tsepparator = '',''; // mil
Eso se puede establecer por el constructor y cambiar a lang de los usuarios.
class foo
{
private $dsepparator;
private $tsepparator;
function __construct(){
$langDatas = [''en'' => [''dsepparator'' => ''.'', ''tsepparator'' => '',''], ''de'' => [''dsepparator'' => '','', ''tsepparator'' => ''.'']];
$usersLang = ''de''; // set iso code of lang from user
$this->dsepparator = $langDatas[$usersLang][''dsepparator''];
$this->tsepparator = $langDatas[$usersLang][''tsepparator''];
}
public function numberOmat($amount, $decimals = 2, $hideByZero = false)
{
return ( $hideByZero === true AND ($amount-floor($amount)) <= 0 ) ? number_format($amount, 0, $this->dsepparator, $this->tsepparator) : number_format($amount, $decimals, $this->dsepparator, $this->tsepparator);
}
/*
* $bar = new foo();
* $bar->numberOmat(''5.1234'', 2, true); // returns: 5,12
* $bar->numberOmat(''5'', 2); // returns: 5,00
* $bar->numberOmat(''5.00'', 2, true); // returns: 5
*/
}
Esto es lo que uso:
function TrimTrailingZeroes($nbr) {
return strpos($nbr,''.'')!==false ? rtrim(rtrim($nbr,''0''),''.'') : $nbr;
}
NB Esto asume .
es el separador decimal Tiene la ventaja de que funcionará en números arbitrariamente grandes (o pequeños) ya que no existe un molde flotante. Tampoco convertirá los números en notación científica (p. Ej., 1.0E-17).
Extraño, cuando obtengo un número de la base de datos con un tipo "flotante" y si mi número es ex. 10000 cuando lovalto, se convierte en 1.
$number = $ad[''price_month'']; // 1000 from the database with a float type
echo floatval($number);
Result : 1
He probado todas las soluciones anteriores, pero no funcionó.
Manera complicada pero funciona:
$num = ''125.0100'';
$index = $num[strlen($num)-1];
$i = strlen($num)-1;
while($index == ''0'') {
if ($num[$i] == ''0'') {
$num[$i] = '''';
$i--;
}
$index = $num[$i];
}
//remove dot if no numbers exist after dot
$explode = explode(''.'', $num);
if (isset($explode[1]) && intval($explode[1]) <= 0) {
$num = intval($explode[0]);
}
echo $num; //125.01
las soluciones anteriores son la forma óptima, pero en caso de que quiera tener la suya, podría usarla. Lo que hace este algoritmo comienza al final de la cadena y comprueba si es 0 , si se establece en cadena vacía y luego va al siguiente carácter desde atrás hasta que el último carácter sea > 0
Para todos los que llegan a este sitio y tienen el mismo problema con los comas, pueden cambiar:
$num = number_format($value, 1, '','', '''');
a
$num = str_replace('',0'', '''', number_format($value, 1, '','', '''')); // e.g. 100,0 becomes 100
Esto me ayudó, y creo que no estoy solo.
Si hay dos ceros para eliminar:
a
$num = str_replace('',00'', '''', number_format($value, 2, '','', '''')); // e.g. 100,00 becomes 100
Más aquí: Número de PHP: punto decimal visible solo si es necesario
Puedes usar:
print (floatval)(number_format( $Value), 2 ) );
Si desea eliminar los dígitos cero justo antes para mostrar en la página o plantilla.
Puede usar la función sprintf()
sprintf(''%g'',''125.00'');
//125
sprintf(''%g'',''966.70'');
//966.7
sprintf(''%g'',844.011);
//844.011
Simplemente agregando +
a su variable de cadena provocará que el tipo de transmisión (flotante) y elimine ceros:
echo +''125.00''; // 125
echo +''966.70''; // 966.7
echo +844.011; // 844.011
var_dump(+''844.011asdf''); // double(844.011)
Tenga cuidado al agregar +0.
echo number_format(1500.00, 2,".",",")+0;
//1
El resultado de esto es 1.
echo floatval(''1,000.00'');
// 1
echo floatval(''1000.00'');
//1000
Typecast a un float
.
$int = 4.324000;
$int = (float) $int;
puedes usar la función floatval
echo floatval(''125.00'');
// 125
echo floatval(''966.70'');
// 966.7
echo floatval(''844.011'');
// 844.011
$num + 0
hace el truco.
echo 125.00 + 0; // 125
echo ''125.00'' + 0; // 125
echo 966.70 + 0; // 966.7
Internamente, esto es equivalente a fundir para flotar con (float)$num
o floatval($num)
pero lo encuentro más simple.
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
$value = preg_replace(''~/.0+$~'','''',$value);
$x = ''100.10'';
$x = preg_replace("//.?0*$/",'''',$x);
echo $x;
No hay nada que no se pueda arreglar con una simple expresión regular;)