В приложении Laravel у меня есть форма, на которой мне нужно проверить числа с запятой в качестве разделителя с десятичной запятой. На данный момент он работает только с точкой, потому что мое правило проверки:
$rules = [ 'amount' => 'numeric|min:0', ];
Какой лучший метод:
Laravel поддерживает шаблон regex
в правиле валидации, поэтому вы можете использовать данный шаблон в соответствии с чем-то вроде 12,365.00
и рекомендуется использовать массив вместо канала при регулярном использовании регулярных выражений
$rules = array('amount' => array('match:/^[0-9]{1,3}(,[0-9]{3})*\.[0-9]+$/'));
Проверьте эту ссылку. Кроме того, если вы хотите удалить запятые по любой причине, то проверьте этот ответ .
Основываясь на отличном ответе от The Alpha, здесь приведен фрагмент кода, позволяющий настраивать валидацию с плавающей точкой.
Добавьте этот фрагмент к функции boot()
в классе AppServiceProvider
(проверен с помощью Laravel 5.4):
Validator::extend('float', function ($attribute, $value, $parameters, $validator) { $thousandsSeparator = env('APP_NUMBER_THOUSANDS_SEPARATOR') == '.' ? '\\' . env('APP_NUMBER_THOUSANDS_SEPARATOR') : env('APP_NUMBER_THOUSANDS_SEPARATOR'); $commaSeparator = env('APP_NUMBER_COMMA_SEPARATOR') == '.' ? '\\' . env('APP_NUMBER_COMMA_SEPARATOR') : env('APP_NUMBER_COMMA_SEPARATOR'); $regex = '~^[0-9]{1,3}(' . $thousandsSeparator . '[0-9]{3})*' . $commaSeparator . '[0-9]+$~'; $validate = preg_match($regex, $value); if ($validate === 1) { return true; } return false; });
Ваш .env-файл будет иметь две строки:
APP_NUMBER_COMMA_SEPARATOR="." APP_NUMBER_THOUSANDS_SEPARATOR=","
И ваше правило будет выглядеть так:
$rules = [ 'amount' => 'float|min:0', ];
Примечание. Я только убегаю .
правильно. Если вы собираетесь использовать charaters, которые имеют особый смысл в синтаксисе regex (например, * или +), вам также нужно избегать их.
Но поскольку число с плавающей точкой, например 550*345,00 (550,345.00)
или 57+44 (57.44)
, не имеет смысла, я проигнорировал эту проблему.
С уважением