11

I have a price "0,10" or "00000,10"

Now when i try

number_format($price, 2, ',', '')

I get 0,00. How can i fix this? I want 0,10 $. I don't want rounding.

Or when i have 5,678, i get 5,68. But i want 5,67.

PhpNhh7
  • 111
  • 1
  • 1
  • 3

10 Answers10

10

Several people have mentioned rounding it to 3 and then dropping the last character. This actually does not work. Say you have 2.9999 and round it to 3 it's 3.000.

This is still not accurate, the best solution is this:

$price = '5.678';
$dec = 2;
$price = number_format(floor($price*pow(10,$dec))/pow(10,$dec),$dec);

What this does is takes the price and multiplies it by 100 (10^decimal) which gives 567.8, then we use floor to get it to 567, and then we divide it back by 100 to get 5.67

Andrew Rosolino
  • 639
  • 6
  • 3
8

You can increase the size of the number before rounding down with floor:

$price = floor($price * 100) / 100;
$formatted = number_format($price, 2, ',', '');

Another solution, which may give better precision since it avoids floating-point arithmetic, is to format it with three decimals and throw away the last digit after formatting:

$formatted = substr(number_format($price, 3, ',', ''), 0, -1);
Emil Vikström
  • 90,431
  • 16
  • 141
  • 175
  • 1
    note: the string-based solution doesn't work for numbers like `1.9999`. `number_format()` will still round and output `2,00` instead of `1,99`. – low_rents Apr 04 '16 at 13:04
4

Use this (needs activated intl PHP extension)

$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)
ThaDafinser
  • 499
  • 3
  • 13
4

you should convert comma-filled number back to normal decimal before with str_replace. $number = str_replace(",", ".", $number); and then you can use number_format

Fivell
  • 11,829
  • 3
  • 61
  • 99
4

"00000,10" is a string. You should a decimal point. To get the desired behaviour, you could use:

echo substr(number_format(str_replace(',', '.', $price), 3, ',', ''), 0, -1);
AndersTornkvist
  • 2,610
  • 20
  • 38
2

My problem was that html validator error messege thar number_format() argument is not double.

I solved this error message by placing floatval for that argument like number_format(floatval($var),2,'.',' ') and that is working good.

Taryn
  • 242,637
  • 56
  • 362
  • 405
Asim Sajjad
  • 106
  • 1
  • 4
2

If you are literally just wanting to clear leading zeroes and just limit the length, rather than round to a certain amount of decimal places, a more generalised solution could be this function:

    function cutafter($string,$cutpoint,$length)
    {
        $temp = explode($cutpoint,$string);
        $int = $temp[0];
        $sub = $temp[1];
        return number_format($int,0).','.substr($sub,0,$length);
    }

Example:

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

$answer now equals "5,67"

MDEV
  • 10,730
  • 2
  • 33
  • 49
2

Just before number_format is executed the string "0,10" is converted by php to an number. because php always uses the engish notation the it won't look after the comma.

echo "4 apples" + 2;  
output: 6

The " apples" part is ignored just as your ",10" is ignored.

Converting the "," to a "." allows php to see the other digits.

$price = str_replace(',', '.', '0,10');
number_format($price, 2, ',', '');
Bob Fanger
  • 28,949
  • 7
  • 62
  • 78
0
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" 
catalinp
  • 131
  • 2
  • 5
-1

See this answer for more details.

function numberFormat($number, $decimals = 0, $decPoint = '.' , $thousandsSep = ',')
{
    $negation = ($number < 0) ? (-1) : 1;
    $coefficient = pow(10, $decimals);
    $number = $negation * floor((string)(abs($number) * $coefficient)) / $coefficient;
    return number_format($number, $decimals, $decPoint, $thousandsSep);
}
Dima
  • 311
  • 2
  • 5