Supprimer les Zéro chiffres inutiles des décimales en 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é pour faire cela?

118
demandé sur vitto 2013-01-26 03:00:41

19 réponses

$num + 0 est le tour est joué.

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

à L'intérieur, c'est l'équivalent d'un moulage pour flotter avec (float)$num ou floatval($num) mais je trouve ça plus simple.

273
répondu lafor 2013-01-26 09:35:59

vous pouvez simplement utiliser la fonction floatval 151930920"

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011
82
répondu DiverseAndRemote.com 2013-01-25 23:05:52

il suffit D'ajouter + à votre variable string pour que typecast devienne (float) et supprime 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
répondu Alexander Yancharuk 2014-02-07 14:05:12

C'est ce que j'utilise:

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

N.B. ceci suppose que . est le séparateur décimal. Il a l'avantage de fonctionner sur des nombres arbitrairement grands (ou petits) puisqu'il n'y a pas de coulée flottante. Il ne transformera pas non plus les nombres en notation scientifique (par exemple 1.0 E-17).

13
répondu mpen 2014-11-17 19:06:10

vous devriez lancer vos nombres comme flotteurs, qui feront ceci pour vous.

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

sortie de ce sera ce que vous recherchez.

42.422005

8
répondu Sajan Parikh 2013-01-25 23:07:49
$x = '100.10'; 
$x = preg_replace("/\.?0*$/",'',$x); 
echo $x;

Il n'y a rien qui ne peut être résolu par une simple regex ;)

http://xkcd.com/208 /

8
répondu Dakkaron 2015-02-12 10:52:30

pour tout le monde venant sur ce site ayant le même problème avec commata à la place, 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: numéro PHP: point décimal visible seulement si nécessaire

7
répondu Kai Noack 2017-05-23 12:26:07

si vous souhaitez supprimer les Zéro chiffres juste avant d'afficher sur la page ou le modèle.

vous pouvez utiliser la sprintf () fonction

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

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

‌‌‌‌sprintf('%g',844.011);
//844.011
5
répondu Hemerson Varela 2018-04-11 20:58:04

Catalogués à un float .

$int = 4.324000;
$int = (float) $int;
3
répondu Joseph A. 2016-08-03 13:25:41

Compliqué mais qui 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 manière optimale mais dans le cas où vous voulez avoir votre propre vous pourriez utiliser ceci. Qu'est-ce que cet algorithme fait il commence à la fin de la chaîne et vérifie si son 0 , s'il est il définit à la chaîne vide et puis va au caractère suivant de l'arrière jusqu'à ce que le dernier caractère est > 0

1
répondu GGio 2013-01-25 23:26:39

étrange, quand je sors un numéro de la base de données avec un type "float" et si 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 ça n'a pas marché.

1
répondu lio 2014-05-24 07:01:26

en Raison de cette question est ancienne. D'abord, je suis désolé à ce sujet.

la question porte sur le numéro xxx.xx mais au cas où c'est X, xxx.xxxxx ou différence séparateur décimal tel que xxxx, xxxx il peut être plus difficile de trouver et de supprimer les Zéro chiffres 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, ','));
}
1
répondu vee 2017-12-18 08:22:59

vous pouvez utiliser:

print (floatval)(number_format( $Value), 2 ) );    
0
répondu MUNEERPASHA GADAD 2017-10-20 08:07:10
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
0
répondu MSTRmt 2017-11-23 15:00:50

C'est ma petite solution... Peut inclure à une classe et définir vars

private $dsepparator=".'; // décimal privé $tsepparator=','; / / thousand 151920920"

qui peut être défini par le constructeur et changer pour les 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
répondu Paykoman 2017-12-31 08:03:10

attention en ajoutant +0.

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

résultat: 1.

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

echo floatval('1000.00');
//1000
0
répondu OnionStand 2018-01-19 15:18:10

C'est ma solution. Je veux garder la capacité d'ajouter des milliers de séparateur

    $precision = 5;    
    $number = round($number, $precision);
    $decimals = strlen(substr(strrchr($number, '.'), 1));
    return number_format($number, $precision, '.', ',');
0
répondu despotbg 2018-09-11 16:16:16

ce Code supprimera zéro après le point et ne retournera que deux chiffres décimaux.

$nombre=1200.0000;

str_replace('.00', ",number_format($nombre, 2, '.', "));

Sortie: 1200

-1
répondu Ashish pathak 2017-04-03 08:58:38
$value = preg_replace('~\.0+$~','',$value);
-1
répondu Nikhil Gyan 2017-09-25 06:30:52