PHP number_format округляется?

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

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

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

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

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

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

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

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

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

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

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

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

Несколько человек отметили округление до 3, а затем падение последнего персонажа. Это на самом деле не работает. Скажем, у вас есть 2.9999, а вокруг 3 – 3.000.

Это все еще неточно, лучшим решением является следующее:

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

То, что это делает, берет цену и умножает ее на 100 (десятичный десятичный), что дает 567,8, тогда мы используем пол, чтобы получить его до 567, а затем мы делим его на 100, чтобы получить 5.67

Перед выполнением функции number_format строка «0,10» преобразуется php в число. потому что php всегда использует обозначение engish, он не будет следить за запятой.

 echo "4 apples" + 2; output: 6 

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

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

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

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

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

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

  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"

Используйте это (требуется активированное внутреннее расширение 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) 
 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"