У меня есть объект 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
Ну, если это не так – тогда, вероятно, есть решение проверить его. Есть идеи?
Из рассмотрения документации 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 ] )
Или вы можете использовать утверждение диапазона
он будет проверять, что он должен быть числом