2

私は私のクラスでこれを持っています

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

5 や 78 のような整数を入力すると問題ないように見えますが、5.2 のような数値を入力しようとすると、次のエラー メッセージが表示されます。

入力が float ではないようです

4

3 に答える 3

5

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を取得します。

于 2014-01-22T12:01:06.420 に答える
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;
}    

}

于 2015-09-16T08:17:14.687 に答える
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]
        ]);
于 2015-01-22T16:12:04.000 に答える