Запятая вместо точки

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Запятая вместо точки

Сообщение iamguruman »

доброе утро

как научить систему понимать запятую как точку?
https://prnt.sc/r3c7v1

p.s.

Код: Выделить всё

public function rules()
    {
        return [
            [['amount'], 'number'],
в бд decimal(10,2)
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Запятая вместо точки

Сообщение yiiliveext »

Первый способ.

Код: Выделить всё

return  [
['your_number_field', 'filter', 'filter' => function ($value) {
       return str_replace(',', '.', $value);
    }],
['your_number_field', 'number'],
];
Второй способ

Код: Выделить всё

private $locale;

public function beforeValidate() 
{
    $this->locale = setlocale(LC_ALL, 0);
    setlocale(LC_ALL, 'ru_RU.UTF-8');
}

public function afterValidate()
{
    setlocale(LC_ALL, $this->locale);
}
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Запятая вместо точки

Сообщение unknownby »

Можно попробовать еще так. Объединив два способа.

Код: Выделить всё

['amount', 'filter', 'filter' => function ($value) {
		$fmt = numfmt_create(\Yii::$app->formatter->locale, \NumberFormatter::DECIMAL);
		$value = numfmt_parse($fmt, $value);
		return $value;
	}, 'skipOnEmpty' => true],
[['amount'], 'number', 'skipOnEmpty' => true],
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Запятая вместо точки

Сообщение yiiliveext »

unknownby писал(а): 2020.02.17, 10:09 Можно попробовать еще так. Объединив два способа.

Код: Выделить всё

['amount', 'filter', 'filter' => function ($value) {
		$fmt = numfmt_create(\Yii::$app->formatter->locale, \NumberFormatter::DECIMAL);
		$value = numfmt_parse($fmt, $value);
		return $value;
	}, 'skipOnEmpty' => true],
[['amount'], 'number', 'skipOnEmpty' => true],
Это не два способа, а вариация первого. И она не будет работать с числами, где разделитель точка.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Запятая вместо точки

Сообщение unknownby »

yiiliveext писал(а): 2020.02.17, 10:33 Это не два способа, а вариация первого. И она не будет работать с числами, где разделитель точка.
Так он же хочет, чтобы понимал запятую как точку. Он не говорил о том, чтобы можно было вводить двумя способами. Ему нужно строго запятая вместо точки. Пусть сам уже смотрит, что ему подойдет ;)
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Запятая вместо точки

Сообщение yiiliveext »

unknownby писал(а): 2020.02.17, 11:09
yiiliveext писал(а): 2020.02.17, 10:33 Это не два способа, а вариация первого. И она не будет работать с числами, где разделитель точка.
Так он же хочет, чтобы понимал запятую как точку. Он не говорил о том, чтобы можно было вводить двумя способами. Ему нужно строго запятая вместо точки. Пусть сам уже смотрит, что ему подойдет ;)
B c дефолтным английским языком тоже не будет работать ваш вариант)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Запятая вместо точки

Сообщение unknownby »

yiiliveext писал(а): 2020.02.17, 12:02 B c дефолтным английским языком тоже не будет работать ваш вариант)
Согласен :D
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: Запятая вместо точки

Сообщение iamguruman »

мой вариант получился так:

rules:

[['amount'], 'number', 'numberPattern' => '/^\s*[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?\s*$/'],

+

public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {

$this->amount = str_replace(",", ".", $this->amount);

return true;

} else {

return false;

}
}
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Запятая вместо точки

Сообщение unknownby »

iamguruman писал(а): 2020.02.18, 10:48 мой вариант получился так:
Пробуй первый способ, который выше указан
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: Запятая вместо точки

Сообщение iamguruman »

unknownby писал(а): 2020.02.18, 11:26
iamguruman писал(а): 2020.02.18, 10:48 мой вариант получился так:
Пробуй первый способ, который выше указан
согласен, спасибо всем
Ответить