如何验证输入是否具有zf2形式的浮点值?

时间:2014-01-21 22:36:27

标签: php zend-framework2 zend-form2 zend-inputfilter

我在班上有这个

$inputFilter->add(
                    $factory->createInput(array(
                        'name' => 'precio',
                        'required' => true,
                        'validators' => array(
                            array(
                                'name' => 'Float',
                                'options' => array(
                                    'min' => 0,
                                ),
                            ),
                        ),
                    ))
            );

当我输入一个像5或78这样的整数时,一切似乎都没问题,但是当我尝试使用类似5.2的数字时,我收到了下一条错误消息

  

输入似乎不是浮点数

3 个答案:

答案 0 :(得分:4)

Float Validator类中的十进制字符取决于应用程序中使用的语言环境。尝试将语言环境添加为如下选项:

$factory->createInput( array(
    'name' => 'precio',
    'required' => true,
    'validators' => array(
        array(
            'name' => 'Float',
            'options' => array(
                'min' => 0,
                'locale' => '<my_locale>'
            ),
        ),
    ),
) );

如果未设置区域设置,则Float类将获取php.ini中定义的 intl.default_locale

答案 1 :(得分:1)

您可以编写自己的验证器:

class Currency extends \Zend\Validator\AbstractValidator {

    /**
     * Error constants
     */
    const ERROR_WRONG_CURRENCY_FORMAT = 'wrongCurrencyFormat';

    /**
     * @var array Message templates
     */
    protected $messageTemplates = array(
        self::ERROR_WRONG_CURRENCY_FORMAT => "Vaule is not valid currency format. (xxx | xxx.xx | xxx,xx)",
    );

    /**
     * {@inheritDoc}
     */
    public function isValid($value) {

        $exploded = null;
        if (strpos($value, '.')) {
            $exploded = explode('.', $value);
        }
        if (strpos($value, ',')) {
            $exploded = explode(',', $value);
        }

        if (!$exploded && ctype_digit($value)) {
            return true;
        }
        if (ctype_digit($exploded[0]) && ctype_digit($exploded[1]) && strlen($exploded[1]) == 2) {
            return true;
        }
        $this->error(self::ERROR_WRONG_CURRENCY_FORMAT);
        return false;
    }

}

并过滤值:

class Float extends \Zend\Filter\AbstractFilter {

public function filter($value) {                    
    $float = $value;

    if($value){
        $float = str_replace(',', '.', $value);            
    }

    return $float;
}    

}

答案 2 :(得分:0)

你可以使用回调验证器。

use Zend\Validator\Callback;
$callback = new Callback([$this, 'validateFloat']);
$priceCallBack->setMessage('The value is not valid.');

然后,在课堂的某个地方你需要有这个功能。

public function validateFloat($value){
return (is_numeric($value));
}

最后在表单中添加此验证器, 例如。

$this->inputFilter->add([
            'name'=>'pro_price',
            'required' => true,
            'validators'=>[$callback]
        ]);