Проверка десятичных знаков в symfony 2

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

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

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

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

Любые обходные пути?

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

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

Related of "Проверка десятичных знаков в symfony 2"

Из рассмотрения документации 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 или запятую (в зависимости от того, хотите ли вы использовать европейское десятичное форматирование).

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

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

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

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

  • @Assert \ Range (мин = 0)

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