Точка, точка, запятая

В русской локали разделитель десятичных разрядов – запятая. И это доставляет определенные неудобства при обновлении полей БД – 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. А также при инициализации не будет проиходить перебор всех полей модели с целью определения их типа. Т.е. по идее можно написать и имя текстового поля. ;-)

Октябрь 26, 2008 • Tags:  • Posted in: CakePHP

Leave a Reply