Каков наилучший способ проверки чисел с запятой как десятичной разделитель?

В приложении Laravel у меня есть форма, на которой мне нужно проверить числа с запятой в качестве разделителя с десятичной запятой. На данный момент он работает только с точкой, потому что мое правило проверки:

$rules = [ 'amount' => 'numeric|min:0', ]; 

Какой лучший метод:

  • Сохраните правило и замените запятую точкой перед проверкой? Есть ли наблюдатель before_validation или что-то вроде этого?
  • Создать собственное правило проверки? Например, french_numeric?

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) , не имеет смысла, я проигнорировал эту проблему.

С уважением