Afficher un nombre à deux décimales


572

Quelle est la bonne façon d'arrondir une chaîne PHP à deux décimales?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

La sortie doit être 520.00;

Comment devrait être la round_to_2dp()définition de la fonction?


13
Ce n'est vraiment pas un «arrondi». L'arrondi réduit la précision. Il n'ajoutera pas de décimales à un nombre qui n'en a pas. Sur la base de nombreuses réponses et commentaires, il semble que les gens pensent que l'arrondi est quelque chose qu'il n'est pas. roundest une fonction mathématique, et ce n'est qu'un problème de formatage.
Don't Panic

Réponses:


1132

Vous pouvez utiliser number_format () :

return number_format((float)$number, 2, '.', '');

Exemple:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

Cette fonction renvoie une chaîne .


4
round () serait mieux pour sa lisibilité et sa simplicité aussi, mais pour tout ce qui est critique, sachez qu'il est connu pour être buggé
StringsOnFire

40
@ ÁlvaroG.Vicario roundne résout pas le problème du PO ici. round("520", 2)renvoie le flottant 520, et l'écho qui bien sûr ne le montrera pas à 2 décimales. Dans le but de l'OP - montrant un entier à 2 décimales en le remplissant avec des zéros de fin - vous avez besoin d'une fonction de formatage de nombre, pas d'une fonction d'arrondi.
Mark Amery

3
Toutes les autres réponses sont limitées aux valeurs décimales avec une notation par points. Lorsque vous devez obtenir 520,00au lieu de 520.00, cela fonctionne simplement.
SPRBRN

1
si vous voulez limiter uniquement float mais pas int alors bcdiv ($ number, 1,2)
Wasim A.

2
Je pense que vous devriez utiliser bcadd (0, $ yournumber, 2) cela vous donnera un résultat parfait.
jewelhuq

214

Utilisez round()(utilisez si vous attendez un nombre au format flottant uniquement, sinon utilisez number_format () comme réponse donnée par Codemwnci ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

Du manuel:

La description:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

Renvoie la valeur arrondie de valà spécifié precision(nombre de chiffres après la virgule décimale). precisionpeut également être négatif ou nul (par défaut).

...

Exemples # 1 d' round()exemples

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

Exemple # 2 exemples de mode

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>

5
@khuderm round($number, 2);ne fonctionne pas. Je veux 520,00 pas 520. Je ne peux pas croire que le tour ne le fasse pas par défaut.
Claudiu Creanga

2
Il ne répond même pas correctement à l'OP mais a plus de 100 votes!
Rob Sedgwick

200

Alternativement,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00

3
Et si tu veux 520,00? Je suppose que l'autre réponse fonctionne mieux dans ce cas.
SPRBRN

2
^ non l'autre réponse ne donnera pas deux décimales pour un int
pythonian29033

1
d'autres raisons que vous voudrez peut-être c'est que vous ne voulez pas arrondir ... ou à ma cause, les flotteurs SQL retournés ne sont pas traités de la même manière que les flottants normaux, ce qui est un bogue mathématique PHP
Amb3rL4nn

34

http://php.net/manual/en/function.round.php

par exemple

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round fera exactement la fonctionnalité que Rich veut, mais number_format () serait plus intéressant à rechercher pour toutes sortes de mise en forme numérique.
Shamim Hafiz

Cette méthode effectuera également l'arrondi en forçant simplement les chiffres ".00" à la fin.
SystemX17

10
J'avais essayé, mais cela ne fonctionne pas - cela n'ajoutera pas le 0,00 supplémentaire.
Rich Bradshaw

Essayez d'utiliser l'un des exemples que j'ai là-bas, seul dans un script PHP. Vous devriez obtenir le résultat commenté. Sinon, vous avez un problème avec votre configuration PHP quelque part.
SystemX17

1
round (520, 2) renvoie 520, pas 520,00 comme requis par @Rich
user761100

25

Essayer:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

La sortie sera:

1,234,545,454.00

2
Cela fonctionne, mais la sortie serait une chaîne et non un nombre.
Ethan

1
si vous voulez utiliser number_format au moins, faites-le number_format ($ number, 2, '.', '')
Mihai P.

14

Vous pouvez utiliser le PHP printfou les sprintffonctions:

Exemple avec sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

Vous pouvez également exécuter la même chose sans echo. Exemple:sprintf("%.3f", $num);

Production:

2.120

Alternativement, avec printf:

echo printf("%.2f", $num);

Production:

2.124

12

Une autre façon plus exotique de résoudre ce problème consiste à utiliser bcadd()une valeur fictive pour $ right_operand de 0.

$formatted_number = bcadd($number, 0, 2);

2
Notez que les bc*fonctions ne sont pas arrondies, elles sont toujours arrondies. Par exemple, bcadd("1.0999","0.0",1)donne "1,0", pas "1,1".
ColinM

1
Les fonctions BC Math arrêtent en fait le traitement à $scaledes chiffres fractionnaires. Cela équivaut à un arrondi vers zéro.
Ali



8
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Cela affichera exactement deux chiffres après le point décimal.

Avantage:

Si vous souhaitez afficher seulement deux chiffres après une valeur flottante et non pour int, utilisez ceci.


C'est la solution la plus universelle si vous avez bcdiv (c'est un paquet courant mais non par défaut sur centos6).
Shovas

7

round_to_2dp est une fonction définie par l'utilisateur, et rien ne peut être fait à moins que vous n'ayez publié la déclaration de cette fonction.

Cependant, je suppose que cela fait: number_format($number, 2);


14
D'après votre premier paragraphe, je pense que vous avez mal compris la question. round_to_2dp($number);était censé être un pseudocode; le PO demandait que quelqu'un lui dise quoi remplacer cette expression.
Mark Amery

6
$twoDecNum = sprintf('%0.2f', round($number, 2));

L'arrondi arrondit correctement le nombre et le sprintf le force à 2 décimales s'il se trouve qu'il n'y a qu'une décimale après l'arrondi.


6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Il renverra 5,98 sans arrondir le nombre.


Seulement, cela peut également faire le travail floor($retailPrice * 100) / 100;sans avoir besoin d'un format numérique.
somsgod

6

Pour l'arrondissement conditionnel, c.-à-d. afficher le nombre décimal là où il est vraiment nécessaire, sinon le nombre entier

123,56 => 12,56

123,00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    

6

Je fais le mien.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);

1
C'est agréable de voir certains des calculs nécessaires pour faire cela. Bien que l'utilisation d'une fonction intégrée soit préférée pour moi. Inutile de réinventer la roue.
Lightbulb1

1
Désolé, mais round (), comme il est dit, round de nombre, et parfois, je ne veux pas arrondir.
joanlgr

5

Ici, j'obtiens deux décimales après le .(point) en utilisant une fonction ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

Résultats de la fonction ci-dessus:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

Nouvelle réponse correcte

Utilisez la fonction native PHP bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567

4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Cela vous donnera 2 chiffres après la virgule.


4
Non, ce ne sera pas le cas. Je ne sais pas quand ce post a été écrit mais si vous l'essayez avec votre propre exemple, au moins sur ma machine :-), il affichera 520.90. Cela signifie que l'arrondissement aura lieu. Faites attention!
Boaz Rymland

4

Si vous souhaitez utiliser deux chiffres décimaux dans l'ensemble de votre projet, vous pouvez définir:

bcscale(2);

Ensuite, la fonction suivante produira le résultat souhaité:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

Mais si vous n'utilisez pas la fonction bcscale, vous devez écrire le code comme suit pour obtenir le résultat souhaité.

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

En savoir plus


2

Numéro sans rond

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);

1

Voici une autre solution avec strtok et str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')

0

Ajout à d'autres réponses, puisque number_format () ajoutera, par défaut, un séparateur de milliers.

Pour supprimer cela, procédez comme suit:

$number = number_format($number, 2, ".", "");

0
  • Choisissez le nombre de décimales
  • Mettre en forme des virgules (,)
  • Une option pour couper les zéros de fin

Une fois pour toutes!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

Exemples

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235

-6

Vous pouvez utiliser la fonction PHP round () .

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06

3
-1; cette réponse n'ajoute rien de nouveau que la réponse de Somnath Muluk ne contenait pas déjà 2 ans plus tôt.
Mark Amery

1
C'est également faux, comme indiqué dans mon commentaire sur la réponse de Somnath.
Mark Amery
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.