Проверка и преобразование десятичных значений в CakePHP - PullRequest
3 голосов
/ 11 марта 2011

Я разрабатываю приложение с CakePHP, которое обрабатывает денежные значения. Клиент хочет, чтобы числа имели пользовательский формат, например 1.275,34, то есть точку в качестве разделителя в целочисленной части и запятую в качестве разделителя десятичной части.

Мне интересно, каков наилучший подход для управления этим, поскольку мне нужно сделать две основные вещи:

  1. Проверка значений, записанных в формах, в соответствии с этим пользовательским форматом.
  2. Преобразуйте эти значения в соответствии с форматом, ожидаемым типом данных столбца MySQL (decimal(18,2) в этом случае 1275.34 в приведенном выше примере).

Я думаю, что у меня есть эти опции, но я не совсем доволен ими, потому что несколько моделей работают с этим нестандартным форматом, а это означает репликацию некоторого кода:

  • Проверьте и преобразуйте значение в контроллере перед вызовом $this->Model->save(), возможно, с использованием компонента.
  • Проверка данных с использованием пользовательских правил в модели (массив var $validate) и их преобразование, возможно, с использованием Поведения.

Что вы рекомендуете? Есть ли другой способ справиться с этим?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Вы можете использовать PHPs number_format() для форматирования любым удобным вам способом: http://php.net/manual/en/function.number-format.php

Что касается подключения, вы можете использовать обратные вызовы beforeSave() и afterFind() для преобразования,если вы хотите сделать это в модели.

http://book.cakephp.org/view/1048/Callback-Methods

Я бы посоветовал вам сохранить дополнительное поле, которое заполняется в модели модели после операции поиска с использованием описанных выше обратных вызовов, чтобы оно всегда было доступно для вас и не мешалоесли вы случайно попытаетесь сохранить его.

ТАКЖЕ Вы можете использовать virtualFields (доступно из cakePHP 1.3) для создания поля, которое заполняется БД при каждом поиске.Для этого можно использовать форматирование строк MySQL.

Виртуальное поле: http://book.cakephp.org/view/1608/Virtual-fields

Строка MySQL: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_format

Примером может быть

var $virtualFields = array(
    'formatted' => 'FORMAT(12332.1,2)' // would output 12,332.10
);
1 голос
/ 11 марта 2011

Формат "1.234,56" - это европейский денежный формат, поэтому вам, вероятно, лучше использовать все приложения в этом формате.Что вам нужно сделать, это установить денежный языковой стандарт вашего приложения, используя setlocale(LC_MONETARY,$locale).Так, например:

setlocale(LC_MONETARY, 'it_IT');

Затем вы используете money_format для правильного форматирования строк вашей валюты и обратного вызова Model::beforeValidate() для массирования любой введенной валюты перед проверкой, поэтомуВы можете проверить по стандартному десятичному формату. Этот вопрос может быть полезен.

...