dans mon application, je fais des calculs et le résultat peut être float ou int
je veux montrer le résultat final avec deux chiffres après la virgule décimale max ... si le résultat est un nombre flottant
il y a deux options pour le faire
number_format($final ,2);
et
sprintf ("%.2f", $final );
mais le problème est ... si mon résultat final est un int comme 25
je finis avec
25.00
ou si le résultat final est quelque chose comme 12.3
il me donne
12.30
et je ne veux pas que
est-il possible de formater un nombre pour qu'il affiche 2 chiffres après le point flottant UNIQUEMENT SI c'est un nombre flottant avec plus de 2 chiffres après la virgule décimale? ou dois-je vérifier avant de formater mon numéro?
<?php
$number = 25;
print round($number, 2);
print "\n";
$number = 25.3;
print round($number, 2);
print "\n";
$number = 25.33;
print round($number, 2);
impressions:
25
25.3
25.33
Je pense qu'il n'y a pas de contournement aussi court pour cela.
Vérifiez manuellement s'il y a 2 chiffres ou plus après le signe décimal.
Comment savoir s'il y a moins d'un ou zéro chiffre après le nombre décimal? Il suffit de multiplier par 10 et de vérifier s'il s'agit d'un entier. Si c'est le cas, imprimez le numéro tel quel. Si c'est maintenant, utilisez '% .2f' pour l'imprimer.
Vous devez ajouter une condition if si elle comporte plus de 0 chiffres après le point. Je ne vois pas d'autre solution.
Un moyen simple et rapide de le faire.
$final=3.40;
$decimalNbr= strlen(substr(strrchr($final, "."), 1));
$final = number_format($final,(is_float($final) ? (($decimalNbr>2) ? 2 : $decimalNbr) : 0));
echo $final;
N'oubliez pas non plus que j'ai ajouté un autre nombre de chiffres décimaux avant d'utiliser number_format.
Vous pouvez utiliser cet exemple
function num_format($number,$precision=0)
{
$precision = ($precision == 0 ? 1 : $precision);
$pow = pow(10, $precision);
$value = (int)((trim($number)*$pow))/$pow;
return number_format($value,$precision);
}
echo num_format(71730116.048758);
//Output
//71,730,116.04
Je n'aime pas ça.
<?php
function format($number) {
return preg_replace(
'~\.[0-9]0+$~',
null,
sprintf('%.2f', $number)
);
}
echo format(23), PHP_EOL; //23
echo format(23.3), PHP_EOL; //23
echo format(23.33), PHP_EOL; //23.33
Oui, vous devriez faire quelques vérifications. Par exemple, vérifiez si ceil($number) > floor($number);
Si vous avez spécifiquement besoin de deux chiffres, cela demandera plus d'effort.
J'ai trouvé une autre option. Utilisez la variable float
pour effacer les zéros de fin:
echo (float)sprintf("%.2f", $final);
// or
echo (float)number_format($final ,2);
Mais ces fonctions semblent arrondir le nombre exactement comme round
:
echo sprintf("%.2f", 12.556); // 12.56
echo number_format(12.556, 2); // 12.56
Donc, si vous ne voulez pas ce comportement, utilisez ceci:
$final = 12.556;
echo (int)(($final*100))/100; // 12.55
echo (int)((12*100))/100; // 12
echo (int)((12.3*100))/100; // 12.3
echo (int)((12.34567*100))/100; // 12.34