簡體   English   中英

用逗號作為小數點分隔符驗證數字的最佳方法是什么?

[英]What's the best way to validate numbers with comma as decimal separator?

在 Laravel 應用程序中,我有一個表單,我需要在表單上使用逗號作為小數點分隔符來驗證數字。 目前,它只適用於一點,因為我的驗證規則是:

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

什么是最好的方法:

  • 保留規則並在驗證前用點替換逗號? 是否有 before_validation 觀察者或類似的東西?
  • 構建自定義驗證規則 ? 例如 french_numeric ?

Laravel 在驗證規則中支持regex模式,因此您可以使用給定的模式來匹配12,365.00之類的12,365.00並且在使用正則表達式作為規則時,建議使用數組而不是管道

$rules = array('amount' => array('match:/^[0-9]{1,3}(,[0-9]{3})*\.[0-9]+$/'));

檢查此鏈接。 另外,如果您出於任何原因想刪除逗號, 請檢查此答案

基於 The Alpha 的優秀答案,這里有一個代碼片段,用於使浮點驗證可配置。

將此代碼段添加到AppServiceProvider類中的boot()函數(使用 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)這樣的浮點數沒有意義,我忽略了這個問題。

親切的問候

如果其他人在從解決方案進行正則表達式檢查后驗證輸入的數字大小時遇到​​問題,我將我的解決方案發布在這里。 雖然與問題不同,但我需要它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 . '.';
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM