web-dev-qa-db-fra.com

affichez 2 chiffres maximum après la virgule flottante ... seulement s'il s'agit d'un nombre flottant avec plus de 2 chiffres flottants

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?

11
max
<?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
24
user4035

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.

1
rnbguy

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.

1
SmootQ

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
0
Santosh Kumar Singh

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
0
Anthony Sterling

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. 

0
Ivan0x32

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
0
bitWorking