laravel - 考虑 laravel 验证器数字规则的语言环境(分隔符)
问题描述
我使用 laravel 的本地化功能来本地化我的应用程序。当我将语言环境设置为德语 (de)(使用 App::setLocale())并使用验证器规则'amount' => ['required', 'numeric', 'min:0']时,出现验证错误验证“100000,00”时。“100000.00”有效。
问题是,小数点分隔符应该取决于语言环境:“。” (点)表示英语,“,”表示德语。
此外,“数字”规则根本不允许千位分隔符。应该允许。点还是逗号再次取决于语言环境。
知道如何以干净的方式解决这个问题吗?
解决方案
根据 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() 方法中。
推荐阅读
- apache-spark - 将 sql 查询转换为等效的 spark 查询
- python - 使用“嵌套”创建一个脚本,首先打印列表中的单词,然后打印每个字母
- python - 在 PyQT 中单击按钮后的 Msg_box
- android - 无法在 OnCreate 中将视图添加到 LinearLayout
- in-app-purchase - 当我使用真实的产品 ID 测试我的应用时,我只能使用测试卡付款
- excel - Application.ScreenUpdating 上的运行时错误
- timescaledb - Timescaledb 更新致命:扩展“timescaledb”版本不匹配:共享库版本 1.6.1;SQL 版本 1.4.2
- javascript - Chrome webRequest onBeforeRequest 在收到函数返回后不会重定向
- java - Java 没有为第一个变量接受用户输入
- codeigniter-4 - Codeigniter 4 Query Builder 在再次执行时丢失 SELECT 和 WHERE 条件