среда, 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);
}

2 комментария:

  1. IMHO:
    var_dump(floatval('23.5213') == '23.5213');
    лучше.

    ОтветитьУдалить
  2. Fix:
    $string = '23.5213';
    var_dump(is_numeric($string) && (string)floatval($string) === $string);

    Запятые не ест, но остальное должно ок.

    ОтветитьУдалить