我正在用CakePHP开发一个处理货币价值的应用程序。客户端希望数字具有像1.275,34这样的自定义格式,即在整数部分中以点作为分隔符,以逗号作为十进制部分的分隔符。
我想知道处理这个问题的最佳方法是什么,因为我需要做两件基本的事情:
decimal(18,2),在上面示例中为1275.34 )。我认为我有这些选项,但我对任何选项都不完全满意,因为有几个模型使用这种自定义格式,这意味着复制一些代码:
在调用Component.
$this->Model->save()之前验证和转换控制器中的值,也可以使用模型中的自定义规则(var $validate数组)对数据进行验证和转换,或者使用行为进行转换。你有什么建议吗?还有其他办法来处理这件事吗?
谢谢!
发布于 2011-03-11 15:19:03
"1.234,56“格式是欧洲货币格式,所以你最好让整个应用程序使用这种格式。您需要做的是使用setlocale(LC_MONETARY,$locale)设置应用程序的货币区域设置。因此,例如:
setlocale(LC_MONETARY, 'it_IT');然后,使用money_format对货币字符串进行适当的格式化,并使用Model::beforeValidate()回调在验证之前对任何货币输入进行按摩,这样就可以根据标准的十进制格式进行验证。This related question may be useful.
发布于 2011-03-11 07:59:20
您可以使用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中获得)来创建一个字段,该字段在每次查找时都由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
);https://stackoverflow.com/questions/5270284
复制相似问题