[Музей программирования ]
Главная » 2015 » Сентябрь » 10 » ещё один пост о говне в ЯП
07:43
ещё один пост о говне в ЯП
Вообще, наверное, нехорошо поливать грязью то, что несколько лет подряд кормило и до сих пор временами подкармливает. Но сил моих больше нет, честное слово!В общем, как неприятно после хорошего снова переседать на говно, а! Как, покодив на 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, как люблю его я?
Просмотров: 788 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar