2011-03-11 44 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