У меня есть цена «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"