Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Округлить число до сотых в меньшую сторону
 
 автор: gumplen   (04.02.2011 в 14:01)   письмо автору
 
 

Здравствуйте. Нужно просто обрубить число до сотых. То есть 1.99999 => 1.99
Стандартной функции не нашел, подскажите, пожалуйста...

  Ответить  
 
 автор: cheops   (04.02.2011 в 14:13)   письмо автору
 
   для: gumplen   (04.02.2011 в 14:01)
 

Можно воспользоваться регулярными выражениями
<?php 
  $number 
1.99999;
  
$pattern "|(\d+)\.(\d+)|e";
  
$replace "'\$1.'.substr('\$2', 0, 2)";
  
$number preg_replace($pattern$replace$number);
  echo 
$number;
?>

  Ответить  
 
 автор: gumplen   (04.02.2011 в 14:17)   письмо автору
 
   для: cheops   (04.02.2011 в 14:13)
 

Спасибо, так и поступлю

  Ответить  
 
 автор: SHAman   (04.02.2011 в 14:19)   письмо автору
 
   для: cheops   (04.02.2011 в 14:13)
 

А sprintf не проще?

  Ответить  
 
 автор: cheops   (04.02.2011 в 14:20)   письмо автору
 
   для: SHAman   (04.02.2011 в 14:19)
 

А sprintf(), как и number_format() до 2.00 округляют (у меня покрайней мере - сам подивился).
<?php 
  $number 
1.99999;
  echo 
sprintf("%01.2f"$number); // 2.00
?>

  Ответить  
 
 автор: Gubichev   (04.02.2011 в 16:30)   письмо автору
 
   для: cheops   (04.02.2011 в 14:13)
 

round($number,2);



- Оу, извиняюсь, не заметил, что регулярка.

  Ответить  
 
 автор: cheops   (04.02.2011 в 16:43)   письмо автору
 
   для: Gubichev   (04.02.2011 в 16:30)
 

Собственно хорошо бы решение без регулярного выражения - чем меньше хитрого и запутанного кода, тем лучше... но round() не подходит - он округлит, а нужно отсечь цифры без округления.

  Ответить  
 
 автор: Igorek   (04.02.2011 в 16:51)   письмо автору
 
   для: cheops   (04.02.2011 в 16:43)
 

>Собственно хорошо бы решение без регулярного выражения - чем меньше хитрого и запутанного кода, тем лучше... но round() не подходит - он округлит, а нужно отсечь цифры без округления.

  
$number = 1231.3299; 
  echo substr($number, 0, strpos($number,".")+3);

=]

  Ответить  
 
 автор: cheops   (04.02.2011 в 17:27)   письмо автору
 
   для: Igorek   (04.02.2011 в 16:51)
 

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

  Ответить  
 
 автор: Trianon   (05.02.2011 в 13:25)   письмо автору
 
   для: cheops   (04.02.2011 в 16:43)
 


$num = 1.9999;
echo trim(substr(sprintf("%12.4f", $num), 0, 10));


Пока что это единственное решение из приводившихся в треде, которое не требует явного наличия десятичной точки (и дробной части) в аргументе.

  Ответить  
 
 автор: Deed   (05.02.2011 в 13:49)   письмо автору
 
   для: Trianon   (05.02.2011 в 13:25)
 


<?
$num 
1.9999
preg_replace("/(\d+\.{0,1}(\d{0,2}))\d*/","$1",$num);

?>

Тоже без разницы, целое число или дробное.

  Ответить  
 
 автор: cheops   (05.02.2011 в 16:17)   письмо автору
 
   для: Deed   (05.02.2011 в 13:49)
 

Решение хорошее, спору нет. Просто в этой ветке речь зашла о том, как бы компактно решить задачу в рамках строковых функций PHP. Регулярные выражения - это специализированный язык, и не все PHP-разработчики им владеют, а строковыми функциями владеют все и в командной разрботке они более предпочтительны (ну если, конечно, это не нагромождение из десятков строк, вместо одного регулярного выражения).

  Ответить  
 
 автор: Deed   (05.02.2011 в 17:28)   письмо автору
 
   для: cheops   (05.02.2011 в 16:17)
 

Что ж то за "разработчики" такие???
Ведь гораздо легче запомнить базовый синтаксис регулярок, чем гору строковых функций!
Лично я, после прочтения такого вот:

sprintf("%12.4f", $num)

полез за справочником...

  Ответить  
 
 автор: Deed   (05.02.2011 в 12:56)   письмо автору
 
   для: gumplen   (04.02.2011 в 14:01)
 



<?
$dig
=2.8956747;
$dig2=preg_replace("/(\d+\.(\d{2}))\d*/","$1",$dig);

echo 
"Original digit is $dig<br />Offcut is $dig2"
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования