Точка, точка, запятая
В русской локали разделитель десятичных разрядов – запятая. И это доставляет определенные неудобства при обновлении полей БД – MySQL не взирая на лица локаль для полей типа DOUBLE и FLOAT хочет видеть в качестве десятичного разделителя точку. И точка.
При установленной руской локали достаточно неосторожного движения пальца и вы в жопе, например:
$a = 7.62; $a = $a+0;
как значение переменной будет ‘7,62′. И у MySQL команда
UPDATE weapon SET weapon.caliber=7,62 WHERE weapon.slug = 'AK47';
вызовет изжогу. А вот заключение значения в кавычки, как ни странно, никаких последствий играть не будет:
UPDATE weapon SET weapon.caliber='7.62' WHERE weapon.slug = 'AK47';
при том, что тип у weapon.caliber – FLOAT, срабатывает отлично.
А еще MS Excel вместе с OpenOffice очень любят экспортировать данные с запятой в качестве десятичного разделителя.
А еще пользователь при вводе данных вполне может опечататься – на дополнительной цифровой клавиатуре при русской раскладке точка становится запятой.
Обычно я при подготовке данных для записи в таблицу на вякий случай делаю что-то типа
$this->data['Price']['price'] = str_replace(',', '.', $this->data['Price']['price']);
Это однообразное действие меня слегка достало и я написал крошечный Behavior для CakePHP, который перед записью заменяет запятые на точки у полей с типом FLOAT и DOUBLE.
Заодно поклонники процедурного программирования могут поприкалываться на тему того, как одна строчка вызова функции превращается в метод класа и сколько получается дополнительного кода. :-)
Behavior подключается как обычно:
var $actsAs = array('FloatDotFixable');
в этом случае будут обрабатываться данные всех полей указанных типов. Можно указать самому, данные для каких полей обрабатывать:
var $actsAs = array('FloatDotFixable'=>array('fields'=>'price'));
В этом случае будет обрабатываться только поле price. А также при инициализации не будет проиходить перебор всех полей модели с целью определения их типа. Т.е. по идее можно написать и имя текстового поля. ;-)



Leave a Reply