среда, 5 октября 2011 г.

Проверка float-значения в PHP

По работе потребовалось проверить получаемое из формы значение на предмет плавающей точки. В частности, в форме вводится площадь и цена в деньгах. Проект разрабатывается на Zend Framework, поэтому совершенно логично в голову придет решение навскидку - использовать родной валидатор Zend_Validade_Float. Однако практика показала, что он ведет себя очень странно, и это не фича, а баг, тянущийся уже долгое время.

Ок, можно сделать собственный валидатор и подключить его к форме. Но тогда мы возвращаемся к исходной теме - проверки введенного значения. Первая же мысль - is_float. Увы и ах, эта функция лишь проверяет ТИП переменной, а любое значение из формы возвращается типом string. Так что мимо кассы.

Перерыв половину интернетов, я нашел оптимальное решение - проверка регулярными выражениями. Они медленные, да. Но и момент не очень тонкий, хайлоадности в нем нет, так что можно смело использовать. А проверка вот:

function isfloat($val) {
return (bool)preg_match("/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/", $mval);
}