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?
$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.
vous pouvez simplement utiliser la fonction floatval
echo floatval('125.00');
// 125
echo floatval('966.70');
// 966.7
echo floatval('844.011');
// 844.011
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).
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)
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
$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;)
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
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
Typecast à une float
.
$int = 4.324000;
$int = (float) $int;
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, ','));
}
É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é.
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
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
Vous pouvez utiliser:
print (floatval)(number_format( $Value), 2 ) );
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
*/
}
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
Simple et précis!
function cleanNumber($num){
$explode = explode('.', $num);
$count = strlen(rtrim($explode[1],'0'));
return bcmul("$num",'1', $count);
}
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, '.', ',');
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'),'.');
}
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, ',', '.');
}