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?
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.
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
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)
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).
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
$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 ;)
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
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
Catalogués à un float
.
$int = 4.324000;
$int = (float) $int;
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
é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é.
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, ','));
}
vous pouvez utiliser:
print (floatval)(number_format( $Value), 2 ) );
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
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
*/
}
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
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, '.', ',');
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