0

所以我在 Yii 的模型中有这些规则:

array('svalue','numerical'),

由于这些是数字(稍后它们将用于计算),我想将其保存为数字。

客户虽然要求使用逗号“,”分隔千位(1,200 = 千两百)来格式化数字。我在项目上使用的前任

$.fn.digits = function(){
    return this.each(function(){
        $(this).keyup(function(){
            $(this).val( $(this).val().replace(/,/g,"").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") );
        });
    })
}

我添加了 keydown 功能,这样您就不能输入除数字之外的任何其他字符。

不幸的是,现在 jquery.digits() 函数正确地将任何数字格式化为数千 - 但 yii 显然会生成一些代码,然后在表单验证时它说“svalue must be a number”。

我怎样才能同时拥有这两个功能,获得客户想要的格式化字符串,并在 Yii 后端进行数字检查?

4

2 回答 2

0

在验证模型之前,只需将其转换为数字。所以你应该在你的创建和更新操作中有这样的东西:

$model->attributes=$_POST['Model'];
$model->number = floatval($model->number); //or intval if it is an integer.
$model->save(); //or $model->validate();

然后在显示数字时添加逗号。

或者,您可以创建自己的验证函数,允许使用数字、逗号和小数。并使用它而不是内置numeric验证。

于 2012-11-02T17:13:50.793 回答
0

str_replace在保存或验证模型之前使用:

在模型中beforeValidate()

protected function beforeValidate() {
    if(parent::beforeValidate) {
        $this->svalue = str_replace(',', '', $this->svalue);
        return true;
    }
    return false;
}

或者在控制器的保存和更新操作中:

$model->attributes = $_POST['Modelname'];
$model->svalue = str_replace(',', '', $model->svalue);

但是最好的方法是在客户端(实际上是查看文件)本身,在表单提交之前将值更改回数字,并且每当显示表单时,添加逗号。

显示表单时,为已存储的值添加逗号(更新场景或部分验证场景):

$("#field").val( $("#field").val().replace(/,/g,"").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") );

对于新输入的值,您已经拥有添加逗号的功能。

然后在提交表单之前,将值改回不带逗号的值:

$("#form-selector").submit(function(){
    $("#field").val( $("#field").val().replace(/,/g,"") );
    return true; // let the form submit
});

由于这纯粹是一个演示更改,我认为操作应该在客户端。

于 2012-11-02T20:58:54.413 回答