Ad Astra (a_d_astra) wrote in ru_pohape,
Ad Astra
a_d_astra
ru_pohape

Category:

ещё один пост о говне в ЯП

Вообще, наверное, нехорошо поливать грязью то, что несколько лет подряд кормило и до сих пор временами подкармливает. Но сил моих больше нет, честное слово!

В общем, как неприятно после хорошего снова переседать на говно, а! Как, покодив на C++/Qt (и это даже несмотря на общую кривоватость плюсегов), противно помогать соученикам с курсовыми на Дельфях, так и сейчас, после неплохой практики с Ruby/рельсами, кодить что-либо на php жутко влом. У меня тут висят несколько похапешных задач, которые я уже затянула просто до неприличия (жопа я!) - а заставить себя всё же крайне трудно. Но надо, да.

Господа, похапе таки говно - и, думаю, мало кто возьмётся с этим спорить. Меня ЗАДОЛБАЛИ эти никак не структурированные и имеющие кучу совершенно неочевидных глюков нюансов бесчисленные функции.

Вот хотя бы из недавнего. Задача такая: выдрать из некого объёма информации все дробные числа и округлить их до 2 знаков после запятой. Вообще, там это надо сделать в уже обработанном XSLT-процессором XMLe, но поскольку php-шная реализация XSLT не поддерживает replace(), то приходится делать дополнительный парсинг силами самого php. Закладка на хелп по preg_replace в php.net у меня давно уже стоит, но не всё так просто. В общем, пишу:

$result = preg_replace("/(\d+,\d+)/e", "round($1, 2)", $result);

Думаете, заработало? А хрен там! Ругается на неправильное количество параметров для round(). Я долго пыталась понять, в чём же дело. Перечитывала хелп по округлениям и пыталась понять, "то ли лыжи не едут, то ли я е#%нутый". И только где-то через час до меня дошло - а десятичный разделитель в оригинальном XML же - запятая! И эту запятую функция воспринимает как лишний разделитель между агрументами. Ну ладно, думаю, фигня война. Пишу так:

$result = preg_replace("/(\d+,\d+)/e", "round('$1', 2)", $result);

По всем прикидкам, это должно было бы работать правильно. А, опять же, хрен там! Даже несмотря на кавычки. Округляет почему-то не до сотых, а до целого. И, знаете, почему? А потому что при таком неявном преобразовании строки в число запятая НЕ рассматривается как разделитель целой и дробной частей! Только точка! Соответственно, выделяется только целая часть числа. Ну, блин. Мне так тоже не подходит. Начинаем извращаться!

$result = preg_replace("/(\d+,\d+)/e", "number_format(str_replace('$1', ',', '.'), 2, ',', '')", $result);

Собственно, number_format - это чтобы запятую потом на место вернуть, да. Но даже это всё равно не заработало, и вы никогда не догадаетесь, почему, и на что заругалось. А на самом деле, результат вычисления функции не может быть первым аргументом в number_format. Там может быть или строковая константа, или имя переменной! Ну ни хрена себе, а? Рациональной причины для подобных ограничений я не вижу - разве что могу предположить, что разработчики php люто ненавидят всё, что хоть немного похоже на функциональное программирование (впрочем, они и объектно-ориентированное-то не так давно полюбили). В итоге, конечным, рабочим вариантом стало вот такое:

$result = preg_replace("/(\d+),(\d+)/", "$1.$2", $result);
$result = preg_replace("/(\d+.\d+)/e", "number_format($1, 2, ',', '')", $result);

Вот так вот. Двойные накладные расходы и просто ну очень некрасиво. Вы тоже любите php, как люблю его я?

Subscribe
  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 31 comments