web-dev-qa-db-fra.com

Supprimer les zéro chiffres inutiles des décimales dans PHP

J'essaie de trouver un moyen rapide de supprimer zero decimals des valeurs numériques comme ceci:

echo cleanNumber('125.00');
// 125

echo cleanNumber('966.70');
// 966.7

echo cleanNumber(844.011);
// 844.011

Existe-t-il un moyen optimisé de le faire?

126
vitto

$num + 0 fait le tour.

echo 125.00 + 0; // 125
echo '125.00' + 0; // 125
echo 966.70 + 0; // 966.7

En interne, cela équivaut à lancer en flottant avec (float)$num ou floatval($num) mais je le trouve plus simple.

291
lafor

vous pouvez simplement utiliser la fonction floatval

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011
86

C'est ce que j'utilise:

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

N.B. Cela suppose que . est le séparateur décimal. Il a l’avantage de fonctionner sur des nombres arbitrairement grands (ou petits) car il n’ya pas de conversion en float. Cela ne transformera pas non plus les nombres en notation scientifique (par exemple 1.0E-17).

15
mpen

Ajouter simplement + à votre variable chaîne entraînera un transtypage de (float) et supprimera les zéros:

echo +'125.00';  // 125
echo +'966.70';  // 966.7
echo +844.011;   // 844.011

var_dump(+'844.011asdf');  // double(844.011)
13
Alexander Yancharuk

Vous devriez lancer vos chiffres sous forme de chiffres, ce qui le fera pour vous.

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

La sortie de ce sera ce que vous recherchez.

42.422005

8
Sajan Parikh
$x = '100.10'; 
$x = preg_replace("/\.?0*$/",'',$x); 
echo $x;

Il n'y a rien qui ne puisse être corrigé avec une simple expression rationnelle;)

http://xkcd.com/208/

8
Dakkaron

Pour tous ceux qui visitent ce site et qui ont le même problème avec les virgules, vous pouvez changer: 

$num = number_format($value, 1, ',', '');

à

$num = str_replace(',0', '', number_format($value, 1, ',', '')); // e.g. 100,0 becomes 100

Cela m'a aidé et je suppose que je ne suis pas seul.

S'il y a deux zéros à supprimer: 

à

$num = str_replace(',00', '', number_format($value, 2, ',', '')); // e.g. 100,00 becomes 100

Plus ici: PHP nombre: point décimal visible seulement si nécessaire

7
Kai Noack

Si vous souhaitez supprimer les chiffres zéro juste avant de les afficher sur la page ou le modèle.

Vous pouvez utiliser la fonction sprintf ()

sprintf('%g','125.00');
//125

‌‌sprintf('%g','966.70');
//966.7

‌‌‌‌sprintf('%g',844.011);
//844.011
5
Hemerson Varela

Typecast à une float.

$int = 4.324000;
$int = (float) $int;
3
Joseph A.

En raison de cette question est vieux. Tout d'abord, je suis désolé pour ça.

La question concerne le nombre xxx.xx, mais dans le cas où il s'agit de x, xxx.xxxxx ou d'un séparateur décimal de différence tel que xxxx, xxxx, cela peut être plus difficile à trouver et à supprimer les chiffres zéro de la valeur décimale.

/**
 * 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;
}

Et voici le code pour le test.

$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, ','));
}
2
vee

Étrange, quand je récupère un numéro de base de données avec un type "float" et que mon numéro est ex 10000 quand je le flotte, il devient 1.

$number = $ad['price_month']; // 1000 from the database with a float type
echo floatval($number);
Result : 1

J'ai testé toutes les solutions ci-dessus mais cela n'a pas fonctionné.

1
lio

Soyez prudent avec l'ajout de +0.

echo number_format(1500.00, 2,".",",")+0;
//1

Le résultat est 1.

echo floatval('1,000.00');
// 1

echo floatval('1000.00');
//1000
1
OnionStand

Manière compliquée mais fonctionne:

$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

les solutions ci-dessus sont la solution optimale, mais si vous souhaitez avoir la vôtre, vous pouvez l'utiliser. Ce que fait cet algorithme commence à la fin de la chaîne et vérifie si son 0 , si c'est le cas, définit une chaîne vide, puis passe au caractère suivant à partir du retour jusqu'au dernier caractère est> 0

0
GGio

Vous pouvez utiliser: 

print (floatval)(number_format( $Value), 2 ) );    
0
MUNEERPASHA GADAD

Thats ma petite solution ... Peut être inclus dans une classe et définir des vars

private $ dsepparator = '.'; // décimales private $ tsepparator = ','; // mille

Cela peut être défini par le constructeur et changer en utilisateurs lang.

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
     */

}
0
Paykoman
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
0
MSTRmt

Simple et précis!

function cleanNumber($num){
    $explode = explode('.', $num);
    $count   = strlen(rtrim($explode[1],'0'));
    return bcmul("$num",'1', $count);
}
0
J. Doe

Ceci est ma solution. Je veux garder la possibilité d'ajouter des milliers de séparateurs 

    $precision = 5;    
    $number = round($number, $precision);
    $decimals = strlen(substr(strrchr($number, '.'), 1));
    return number_format($number, $precision, '.', ',');
0
despotbg

Il s’agit d’une simple fonction sur une ligne utilisant rtrim, save separator et decimal:

function myFormat($num,$dec)
 {
 return rtrim(rtrim(number_format($num,$dec),'0'),'.');
 }
0
APH

J'ai trouvé cette solution est la meilleure:

public function priceFormat(float $price): string
{
    //https://stackoverflow.com/a/14531760/5884988
    $price = $price + 0;
    $split = explode('.', $price);
    return number_format($price, isset($split[1]) ? strlen($split[1]) : 2, ',', '.');
}
0
Rawburner