2011-03-11 45 views
3

我正在開發一個處理貨幣值的CakePHP應用程序。客戶希望數字具有像1.275,34這樣的自定義格式,即整數部分的分隔符爲點,而小數部分的分隔符爲逗號。驗證和轉換CakePHP中的十進制值

我想知道什麼是管理這個最好的方法,因爲我需要做兩個基本點:

  1. 根據該自定義格式,寫入形式驗證值。
  2. 根據MySQL列數據類型(在這種情況下爲decimal(18,2),在上例中爲1275.34)預期的格式轉換這些值。

我想我有這些選擇,但我不完全滿意,因爲任何的幾種模式與自定義格式工作,這意味着複製一些代碼:

  • 驗證並在控制器變換值在致電$this->Model->save()之前,可能使用組件。
  • 使用模型(var $validate數組)中的自定義規則驗證數據並轉換它們,也許使用行爲。

你有什麼建議?有沒有其他方法來處理這個問題?

謝謝!

回答

1

的 「1.234,56」 格式是歐洲貨幣格式,所以你可能會更好使整個應用程序使用這種格式。您需要做的是使用setlocale(LC_MONETARY,$locale)設置您的應用的貨幣區域設置。因此,舉例來說:

setlocale(LC_MONETARY, 'it_IT'); 

然後,使用money_format適當地格式化貨幣字符串,並使用Model::beforeValidate()回調驗證之前按摩任何貨幣輸入,這樣你就可以驗證對標準的十進制格式。 This related question may be useful.

+0

我喜歡這種方法,因爲它避免了我自己編寫轉換代碼。但同樣的問題出現了:如何在驗證時使用貨幣區域設置?哪裏?我想通知用戶,只要它以一種形式寫入錯誤的值 – elitalon 2011-03-11 15:28:59

+0

在這種情況下,我會在'beforeValidate'回調中而不是'beforeSave'中處理輸入數據。我已經更新了我的答案。 – 2011-03-11 15:39:38

+0

如果我想根據數據庫的數據類型驗證數據,那就沒問題了。但我想根據自定義格式進行驗證。我最終使用'beforeSave'方法來處理自定義數據,並使用'afterFind'方法來相應地顯示它。下一步是使用行爲重構,但您的答案指向了正確的路徑。 – elitalon 2011-03-12 15:04:40

2

您可以使用PHP的number_format()它,你喜歡的任何方式格式化:http://php.net/manual/en/function.number-format.php

至於在鉤住它,你可以使用beforeSave()afterFind()回調做改造,如果你想要做的模型。

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

我建議你記住這是在對模型模型使用回調查找操作後,一個額外的領域上面,使得它一直提供給你,不亂了,如果你不小心嘗試保存它。

ALSO 你可以使用virtualFields(可從CakePHP的1.3),創建由DB人口每找到一個領域。你可以使用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 
); 
+0

我試圖不使用virtualFields,因爲據我所知它取決於數據庫 – elitalon 2011-03-12 15:06:10