Валидация десятичных знаков в symfony 2 - PullRequest
5 голосов
/ 24 января 2012

У меня есть сущность symfony2, сопоставленная с таблицей с использованием Doctrine. Одно из свойств:

/**
 * @var decimal $price
 *
 * @ORM\Column(name="price", type="decimal", nullable=false)
 */
private $price;

Что Assert удовлетворит мое требование, чтобы $price было действительным десятичным числом?

Если я оставлю все как есть, то передача строки foo в качестве десятичного значения приведет к ошибке проверки, в то время как передача строки NaN пройдет проверку, потому что строка NaN отображается как float(NaN) и, таким образом, рассматривается как действительное десятичное значение.

Есть ли обходные пути?

Команда разработчиков Symfony уверяет, что это не проблема: https://github.com/symfony/symfony/issues/3161

Что ж, если это не так, то, вероятно, есть решение для его проверки. Есть идеи?

Ответы [ 3 ]

6 голосов
/ 24 января 2012

Из документации Symfony нет встроенного валидатора для десятичных дробей.Вы могли бы использовать валидатор обратного вызова или, что еще лучше, вы могли бы создать свой собственный валидатор, как в этой статье , описанной здесь .

Что касается фактической проверки, я бы использовал комбинацию is_numeric и is_float для проверки.Существуют методы, использующие регулярное выражение, но, по моему мнению, если значение удовлетворяет проверке is_numeric или is_float, то можно смело предположить, что это действительное десятичное число (или целое число).

РЕДАКТИРОВАТЬ:

Возможно, лучшим решением было бы проверить десятичность в виде строки.Что-то вроде ...

$stringDecimal = strval($decimalValue);
return (preg_match(/[0-9]+(\.[0-9][0-9]?)?/, $stringDecimal) !== 0);

Хотя это не идеально (вы могли бы легко передать '1.15adowadjaow', и это подтвердило бы), оно служит основой того, что вы ищете.Объединение приведенного выше регулярного выражения с чем-то, что ищет что-то кроме 0-9, fullstop или запятой (в зависимости от того, хотите ли вы использовать европейское десятичное форматирование).

2 голосов
/ 24 января 2012

вы можете попробовать пользовательский валидатор , который проверяет только эту строку.

1 голос
/ 04 февраля 2015

Если вы используете тип формы для записи

        ->add(
            'amount',
            'text', change text to number and it will be validated 
            [
                'required' => true
            ]
        )

Или вы можете использовать диапазон assert

  • @ Assert \ Range (min = 0)

будет подтверждено, что это должно быть число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...