简体   繁体   中英

PHP number_format is rounding?

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.

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);

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

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

"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);

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.

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, ',', '');

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)

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"

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" 

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM