По работе потребовалось проверить получаемое из формы значение на предмет плавающей точки. В частности, в форме вводится площадь и цена в деньгах. Проект разрабатывается на 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);
}
IMHO:
ОтветитьУдалитьvar_dump(floatval('23.5213') == '23.5213');
лучше.
Fix:
ОтветитьУдалить$string = '23.5213';
var_dump(is_numeric($string) && (string)floatval($string) === $string);
Запятые не ест, но остальное должно ок.