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?

Rich Bradshaw
la source
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 .

Codemwnci
la source
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
?>
Somnath Muluk
la source
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
Marc B
la source
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
SystemX17
la source
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
Biju
la source
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
Aditya P Bhatt
la source
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);
powtac
la source
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
11

Utilisez PHP number_format () .

Par exemple,

$num = 7234545423;
echo number_format($num, 2);

La sortie sera:

7,234,545,423.00
Sani Kamal
la source
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.

Wasim A.
la source
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);

ajreal
la source
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.

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

Il renverra 5,98 sans arrondir le nombre.

mrphpguru
la source
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    
Viney
la source
6

Je fais le mien.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
la source
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
Mr. HK
la source
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Cela vous donnera 2 chiffres après la virgule.

S'copion Sam
la source
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

jewelhuq
la source
2

Numéro sans rond

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Abhishek Sharma
la source
1

Voici une autre solution avec strtok et str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Bryan
la source
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, ".", "");
Ivan Ivković
la source
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
Kareem
la source
-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
Sadikhasan
la source
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