在CakePHP中验证和转换十进制值

时间:2011-03-11 07:46:17

标签: php validation cakephp decimal

我正在开发一个处理货币价值的CakePHP应用程序。客户希望数字具有自定义格式,如1.275,34,即点作为整数部分的分隔符,逗号作为小数部分的分隔符。

我想知道管理这个的最佳方法是什么,因为我需要做两件基本的事情:

  1. 根据自定义格式验证表单中写入的值。
  2. 根据MySQL的列数据类型(在本例中为decimal(18,2),上例中的1275.34)所期望的格式转换这些值。
  3. 我认为我有这些选项,但我并不完全满意,因为有几个模型使用该自定义格式,这意味着复制一些代码:

    • 在调用$this->Model->save()之前验证并转换控制器中的值,可能使用Component。
    • 使用模型(var $validate数组)中的自定义规则验证数据并对其进行转换,可能使用行为。

    你推荐什么?还有其他方法可以解决这个问题吗?

    谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用PHP 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获得)来创建在每个查找中由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
);

答案 1 :(得分:1)

“1.234,56”格式是欧洲货币格式,因此您可能最好使整个应用程序使用此格式。您需要做的是使用setlocale(LC_MONETARY,$locale)设置应用的货币区域设置。所以,例如:

setlocale(LC_MONETARY, 'it_IT');

然后,您使用money_format来适当地格式化您的货币字符串,并使用Model::beforeValidate()回调来在验证之前按下任何货币输入,这样您就可以针对标准十进制格式进行验证。 This related question may be useful.