Вывожу данные из mysql формат ячейки decimal. Выводятся в таком формате - 290.30 и 290.00 Нужно убирать ненужные нули после запятой и саму запятую, если нужно. 290.3 и 290
Возвращает 290. Должно 290.3 number_format нули не убирает PHP: <? function formatNumber( $number, $decimals=2, $dec_point=".", $thousands_sep=",") { $nachkomma = abs($in - floor($in)); $strnachkomma = number_format($nachkomma , $decimals, ".", ""); for ($i = 1; $i <= $decimals; $i++) { if (substr($strnachkomma, ($i * -1), 1) != "0") { break; } } return number_format($in, ($decimals - $i +1), $dec_point, $thousands_sep); } ?> Example: formatNumber( 100.00 ); --> 100 formatNumber( 100.50 ); --> 100.5 formatNumber( 100.1234 ); --> 100.12 formatNumber( 100.12, 4 ); --> 100.12 formatNumber( 100.12345, 4 ); --> 100.1234 Это похоже на правду , но тоже не работает.
Я, конечно, может чего-то не понимаю, программирую всего полгода. Но что вы тут понаписали... Php хранит данные типа float без нулей, значит это строка. Переведем строку в число: PHP: <? $num += 0 ?> Всё. Так же удаляются все лидирующие нули, если они есть. PHP: <? $num = sprintf("%06.2",$a) ?> Добавляет нули перед (6) и после запятой (2) для float PHP: <? $num = sprintf("%04d",$a) ?> То же самое для целочисленных
спасибо, magiisto во втором примере, видимо, имелось ввиду PHP: <?php $num = sprintf ("%06.2[b][u]f[/u][/b]", $a); ?> ?
Просто на заметку: данные из MySQL выдаются в виде строки, а не в числовом виде. проверить это просто: Код (PHP): $row = mysql_fetch_assoc($result); var_export($row); //увидишь, что все значения в апострофах Это может иметь значение. Будь готов и не удивляйся. Для MySQL: Для чисел с плавающей точкой в качестве разделителя десятичных знаков используется символ '.'. Для PHP: может быть либо точка либо запятая, в зависимости от текущей локали. То есть представление в виде строки может не совпадать! Пока число у нас представлено в настоящем числовом типе, нас не волнует никакая локаль. Но когда мы преобразуем из строки или в строку, могут быть баги. Итак буквально убрать лишние нули справа: rtrim($var, '0') Если после этого самым правым символом осталась десятичная точка — уберем и её: rtrim(rtrim($var, '0'), '.') Вариант "правильного" форматирования числа как числа: Код (PHP): printf('%.2F', (float)$var); Здесь - сначала строку приводим к истинному вещественному типу, - в формате заглавная "F" означает вывод десятичной точки вне зависимости от настроек локали, - ".2" значит при выводе округлять до двух знаков после запятой (денежный формат). Вместо printf() можно number_format(), если в нем явно указать точку. P.S. Если мы вдруг обнаруживаем, что в вычислениях с дробными числами вдруг пропали знаки после запятой — это говорит о том, что мы работали со строками вместо чисел и эти строки не соответствуют настройкам локали (точка вместо запятой или наоборот), поэтому неявное приведение типа приводит к отбрасыванию дробной части.
Код (PHP): // в русской локали разделитель зпт, исправим это (только для чисел) setlocale(LC_NUMERIC, "C"); // радуемся $number = (float)$number; Итого: 250.00 → 250 250,50 → 250.5 250.55 → 250.55
PHP: $s=0.00012530; echo $s."\n"; $s="0.00012530"; echo $s."\n"; echo ($s*1)."\n"; 0.0001253 0.00012530 0.0001253 просто умножите на 1
чувак, ты зарегался только чтобы поднять мёртвую тему? ))) ответ неверный. хотите вывести с конкретной точностью — используйте функции форматирования чисел. "умножить на один" означает неявное приведение типа от строки к числу. для того тоже есть специальные встроенные функции. не надо этого вот шаманства. — К.О.
А если немного усложнить задачу. Мне нужно выводить копейки (два знака после запятой) в любом случае, даже если они по нулям. А все что дальше, тысячные и далее - только если отличны от нуля. 290.00000 - > 290.00 290.123400 - > 290.1234 290.10000 -> 290.10 Сижу голову ломаю )
https://www.php.net/manual/ru/class.numberformatter.php Но есть нюансы. Если не осилите, то PHP: <?php $str = '290.12340000'; $fl = (float)$str; //echo $str; //echo $fl; list(, $r) = explode('.', $fl); if(strlen($r) > 2) { echo $fl; } else { echo number_format($fl, 2, '.', ''); } ?>