首页 > 解决方案 > 考虑 laravel 验证器数字规则的语言环境(分隔符)

问题描述

我使用 laravel 的本地化功能来本地化我的应用程序。当我将语言环境设置为德语 (de)(使用 App::setLocale())并使用验证器规则'amount' => ['required', 'numeric', 'min:0']时,出现验证错误验证“100000,00”时。“100000.00”有效。

问题是,小数点分隔符应该取决于语言环境:“。” (点)表示英语,“,”表示德语。

此外,“数字”规则根本不允许千位分隔符。应该允许。点还是逗号再次取决于语言环境。

知道如何以干净的方式解决这个问题吗?

标签: laravellaravel-validationlaravel-localizationlaravel-7.x

解决方案


根据 Laravel 文档,我找到了以下解决方案:

在 AppServiceProvider.php 的 boot() 方法中,像这样扩展 Validator:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
  /* validate international number format rule (depending on locale) */
  Validator::extend('intl_num', function ($attribute, $value, $parameters, $validator) {
      $numberFormatter = new \NumberFormatter(App::getLocale(), \NumberFormatter::DECIMAL);

      $num = $numberFormatter->parse($value);
      return ($num === false) ? false : true;
  });
  }
}

现在我们可以使用规则'intl_num' 进行验证,例如在FormRequest 类的rules() 方法中。


推荐阅读