在Laravel应用程序中,我有一个表单,我需要用逗号作为小数分隔符来验证数字。目前,它只适用于一点,因为我的验证规则是:
$rules = [
'amount' => 'numeric|min:0',
];
最好的方法是什么:
答案 0 :(得分:9)
Laravel在验证规则中支持regex
模式,因此您可以使用给定模式匹配12,365.00
之类的内容,并且建议在使用正则表达式时使用数组而不是管道
$rules = array('amount' => array('match:/^[0-9]{1,3}(,[0-9]{3})*\.[0-9]+$/'));
Check this link.此外,如果您因任何原因删除逗号,请check this answer。
答案 1 :(得分:1)
基于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',
];
注意:我只是正确地转发.
。如果你打算使用在正则表达式语法中有特殊含义的字符(比如*或+),你也必须逃避它们。
但是,由于550*345,00 (550,345.00)
或57+44 (57.44)
之类的浮点数没有意义,我忽略了这个问题。
亲切的问候
答案 2 :(得分:0)
如果其他人在解决方案中的正则表达式检查后验证输入的数字大小时遇到问题,我将我的解决方案发布在这里。我需要它 max 虽然与问题不同,但它可以很容易地适应 min。
我创建了一个新的规则对象,如下所述:https://laravel.com/docs/8.x/validation#using-rule-objects
注入参数的想法来自这个答案:https://stackoverflow.com/a/62384976/11854580
toFloat 方法是用户对 https://www.php.net/manual/en/function.floatval.php
的贡献<?php
namespace App\Rules;
use App\Utils\NumberUtils;
use Illuminate\Contracts\Validation\Rule;
class NumericMaxForString implements Rule
{
private $maxValue;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct($maxValue)
{
$this->maxValue = $maxValue;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$numericValue = NumberUtils::toFloat($value);
return $numericValue <= $this->maxValue;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute may not be greater than ' . $this->maxValue . '.';
}
}