PHP number_format является округлением? - PullRequest
10 голосов
/ 22 мая 2011

У меня есть цена "0,10" или "00000,10"

Теперь, когда я пытаюсь

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

, я получаю 0,00.Как я могу это исправить?Я хочу 0,10 $.Я не хочу округлять.

Или когда у меня 5 678, я получаю 5,68.Но я хочу 5,67.

Ответы [ 10 ]

7 голосов
/ 16 января 2012

Несколько человек упомянули округление до 3, а затем отбрасывание последнего символа. Это на самом деле не работает. Скажем, у вас есть 2,9999 и округлите до 3, это 3 тысячи.

Это все еще не точно, лучшее решение это:

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

То, что это делает, берет цену и умножает ее на 100 (10 ^ десятичных), что дает 567,8, затем мы используем пол, чтобы получить 567, и затем мы делим ее обратно на 100, чтобы получить 5,67

7 голосов
/ 22 мая 2011

Вы можете увеличить размер числа перед округлением с помощью floor :

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

Другое решение, которое может дать большую точность, поскольку позволяет избежать арифметики с плавающей точкой, состоит в том, чтобыотформатируйте его с тремя десятичными знаками и отбросьте последнюю цифру после форматирования:

$formatted = substr(number_format($price, 3, ',', ''), 0, -1);
4 голосов
/ 22 мая 2011

"00000,10" - это строка. Вы должны десятичную точку. Чтобы получить желаемое поведение, вы можете использовать:

echo substr(number_format(str_replace(',', '.', $price), 3, ',', ''), 0, -1);
4 голосов
/ 22 мая 2011

Вы должны преобразовать запятую обратно в нормальное десятичное число раньше с помощью str_replace. $ number = str_replace (",", ".", $ number); и тогда вы можете использовать number_format

2 голосов
/ 16 июля 2012

Моя проблема заключалась в том, что html validator error messege thar number_format() аргумент не является двойным.

Я решил это сообщение об ошибке, поместив floatval для этого аргумента, например number_format(floatval($var),2,'.',' '), и это работает хорошо.

2 голосов
/ 22 мая 2011

Непосредственно перед выполнением number_format строка "0,10" преобразуется php в число. так как php всегда использует английскую нотацию, он не будет смотреть после запятой.

echo "4 apples" + 2;  
output: 6

Часть "яблок" игнорируется точно так же, как ваша ", 10" игнорируется.

Преобразование "," в "." позволяет php видеть другие цифры.

$price = str_replace(',', '.', '0,10');
number_format($price, 2, ',', '');
1 голос
/ 30 октября 2014

Используйте это (необходимо активировать расширение intl PHP)

$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 голос
/ 22 мая 2011

Если вы буквально просто хотите очистить начальные нули и просто ограничить длину, а не округлять до определенного количества десятичных разрядов, более обобщенным решением может быть эта функция:

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

Пример:

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

$ ответ теперь равен "5,67"

0 голосов
/ 22 марта 2019

См. этот ответ для более подробной информации.

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 голосов
/ 19 декабря 2013
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" 
...