11
votes

PHP Number_Format est arrondi?

J'ai un prix "0,10" ou "00000,10"

maintenant lorsque j'essaie xxx

i get 0,00. Comment puis-je réparer cela? Je veux 0,10 $. Je ne veux pas d'arrondir.

ou quand j'ai 5 678, je reçois 5,68. Mais je veux 5,67.


0 commentaires

10 Réponses :


7
votes

Vous pouvez augmenter la taille du nombre avant de terminer avec étage : xxx pré>

Une autre solution, qui peut donner une meilleure précision car elle évite l'arithmétique à virgule flottante, est de le formater avec trois décimales et de jeter le dernier chiffre après le formatage: p>

$formatted = substr(number_format($price, 3, ',', ''), 0, -1);


1 commentaires

Remarque: la solution à base de cordes ne fonctionne pas pour les nombres tels que 1.9999 . Number_Format () Travaillera toujours et sortie 2,00 au lieu de 1,99 .



4
votes

Vous devez convertir un numéro rempli de virgule vers une décimale normale avant avec Str_replace. $ Numéro = str_replace (",", ".", $ numéro); et puis vous pouvez utiliser Number_Format


1 commentaires

Ouais! 0,10 est une chaîne, pas un flotteur ( 0.10 ).



2
votes

Si vous voulez littéralement simplement vouloir effacer les zéros de premier plan et simplement limiter la longueur, plutôt que sur une certaine quantité de décimales, une solution plus généralisée pourrait être cette fonction:

    $number = "005,678";
    $answer = cutafter($number,",",2);


0 commentaires

4
votes

"00000,10" code> est une chaîne. Vous devriez un point décimal. Pour obtenir le comportement souhaité, vous pouvez utiliser:

echo substr(number_format(str_replace(',', '.', $price), 3, ',', ''), 0, -1);


0 commentaires

2
votes

juste avant number_format code> est exécuté la chaîne "0,10" est convertie par PHP en un numéro. Parce que PHP utilise toujours la notation d'Engish, il ne s'occupera pas de la virgule.

$price = str_replace(',', '.', '0,10');
number_format($price, 2, ',', '');


0 commentaires

10
votes

Plusieurs personnes ont mentionné l'arrondir à 3 puis laissant tomber le dernier caractère. Cela ne fonctionne réellement pas. Disons que vous avez 2,9999 et l'arrondir à 3 c'est 3 000.

Ceci n'est toujours pas précis, la meilleure solution est la suivante: xxx

Qu'est-ce que cela fait prend le prix et Multiplie de 100 (10 ^ décimale) qui donne 567,8, puis nous utilisons le sol pour l'obtenir à 567, puis nous le divisons de 100 pour obtenir 5,67


0 commentaires

2
votes

Mon problème était que l'erreur de validateur HTML Messege Thar Number_Format () L'argument n'est pas double.

J'ai résolu ce message d'erreur en plaçant Floatval pour cet argument comme Number_Format (Floatval ($ var), 2, ". '",' ') Bien.


0 commentaires

0
votes
function format_numeric($value) {

    if (is_numeric($value)) { // is number

        if (strstr($value, ".")) { // is decimal

            $tmp = explode(".", $value);
            $int = empty($tmp[0]) ? '0' : $tmp[0];
            $dec = $tmp[1];
            $value = number_format($int, 0) . "." . $dec;
            return $value;
        }

        $value =  number_format($value);
        return $value;
    }

    return $value; // is string
}

Unit Testing:

Passed / 1100000 => 1,100,000
Passed / ".9987" => .9987
Passed / 1100.22 => 1,100.22
Passed / 0.9987 => 0.9987
Passed / .9987 => 0.9987
Passed / 11 => 11
Passed / 11.1 => 11.1
Passed / 11.1111 => 11.1111
Passed / "abc" => "abc" 

0 commentaires

2
votes

Utilisez ceci (Extension de PHP IntL activée)

$numberFmtCurrency = new NumberFormatter('de_AT', NumberFormatter::CURRENCY);
$numberFmtCurrency->setAttribute(NumberFormatter::ROUNDING_INCREMENT, 0);
$numberFmtCurrency->formatCurrency(328.13, 'EUR'); // prints € 328.13 (and not 328.15)


1 commentaires

Sir pouvez-vous fournir à la bibliothèque que vous utilisez?