web-dev-qa-db-fra.com

PHP nombre: point décimal visible seulement si nécessaire

J'aimerais savoir s'il existe une fonction permettant de formater automatiquement un nombre par sa décimale, donc si j'ai:

<?php
    // $sql_result["col_number"] == 1,455.75
    number_format ($sql_result["col_number"], 2, ".", "");
    // will return 1455.75

    // $sql_result["col_number"] == 1,455.00
    number_format ($sql_result["col_number"], 2, ".", "");
    // could I get 1455 instead of 1455.00?
?>

ma réponse est donc la suivante: existe-t-il un moyen de supprimer les décimales si la base de données DECIMAL est dans ma base de données uniquement lorsqu'elle est ronde?

Ou devrais-je faire quelque chose comme ça?

<?php
    // $sql_result["col_number"] == 1,455.00
    str_replace(".00", "", (string)number_format ($sql_result["col_number"], 2, ".", ""));
    // will return 1455
?>
52
vitto

Je pense en fait que votre solution de contournement est aussi bonne que toute autre. C'est simple et clair, et il est inutile de parler de performance ici, alors foncez.

12
Emil H

floatval ou simplement couler pour flotter

php > echo floatval(7.00);
7
php > echo floatval(2.30);
2.3
php > echo floatval(1.25);
1.25
php > echo floatval(1.125);
1.125

php > echo (float) 7.00;
7
php > echo (float) 2.30;
2.3
php > echo (float) 1.25;
1.25
php > echo (float) 1.125;
1.125
23
xDiff

Comme Emil dit que les tiens sont bons. Mais si vous souhaitez supprimer 0, par exemple, 7.50 aussi, j'ai une suggestion, rtrim():

<?php
    // if $sql_result["col_number"] == 1,455.50
    rtrim(rtrim(number_format($sql_result["col_number"], 2, ".", ""), '0'), '.');
    // will return 1455.5
?>
8
Halil Özgür

J'ajoute l'article Supprimez les chiffres zéro inutiles des décimales dans PHP comme un moyen plus agréable de nettoyer la valeur sans décimale si nécessaire.

7
vitto

Vous pouvez également utiliser rtrim () pour supprimer les 0 en trop, dans le cas où vous voudriez conserver une décimale, mais pas les zéros en excès. (Par exemple, 4.50 devient 4.5.) Vous permet également de changer le nombre de décimales de 2 à tout autre nombre.

rtrim(rtrim((string)number_format($value, 2, ".", ""),"0"),".");

// 4.00 -> 4
// 4.50 -> 4.5
// 4.54000000 -> 4.54 (if you're doing more decimal places)
4
Dan Leveille

En fait, je pense que la façon la plus propre de faire cela pour quelqu'un qui vient de faire une recherche à la recherche de ce genre de chose est de faire ceci:

( number_format ($sql_result["col_number"], 2) * 100 ) / 100;
1
Tomas

Si vous ciblez la devise américaine, j'aime utiliser cette méthode:

function moneyform($number, $symbol = true) {
    return str_replace(".00", "", money_format(($symbol? '%.2n' : "%!n"), $number));
}

moneyform(1300999);
-->$1,300,999

moneyform(2500.99);
-->$2,500.99

moneyform(2500.99, false);
-->2,500.99
1
Kevin J

J'ai été accusé de faire quelque chose comme ça:

 floatval($foo) == intval($foo) ? number_format($foo) : number_format($foo,2);
0
Danial

La réponse de Warren.S m'a aidé. Je n'avais pas besoin de la fonction number_format, alors je viens de le faire

$value=$value-0;

Mais dans le cas du PO, il a besoin de number_format pour supprimer les virgules. Donc, cela fonctionnerait pour lui

$value=number_format ($sql_result["col_number"], 2, ".", "")-0;
0
Sakushee

N'ayant pu trouver de solution flexible, j'ai écrit une fonction simple pour obtenir le meilleur résultat:

function getValueFormattedWithMinimalDecimals($value, $max_decimals = 2, $dec_point = ',', $thousands_sep = '') {
    $bestNumberOfDecimals = -1;
    $decimal = 0;
    while ($decimal <= $max_decimals) {
        $bestNumberOfDecimals = $decimal;
        $valueDecimals = number_format($value, $decimal);
        if (floatval($value) == $valueDecimals) {
            break;
        }
        $decimal++;
    }
    if($bestNumberOfDecimals > 0 && number_format($value, $bestNumberOfDecimals) == number_format($value, 0)) {
        $bestNumberOfDecimals = 0;
    }

    return number_format($value, $bestNumberOfDecimals, $dec_point, $thousands_sep);
}
0
ThomasK