开发者

PHP number_format is rounding?

开发者 https://www.devze.com 2023-03-07 19:34 出处:网络
I have a price \"0,10\" or \"00000,10\" Now when i try number_format($price, 2开发者_Go百科, \',\', \'\')

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

Now when i try

number_format($price, 2开发者_Go百科, ',', '')

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.


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


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


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"


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


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.


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

精彩评论

暂无评论...
验证码 换一张
取 消