точность с плавающей точкой в рубине на проверках допустимости модели направляющих

Я пытаюсь проверить сумму в долларах с помощью regex: ^[0-9]+\.[0-9]{2}$

Это хорошо работает, но каждый раз, когда пользователь отправляет форму и концы суммы в долларах в 0 (нулях), рубин (или направляющие?) обрубает 0. Так 500.00 превращается в 500,0 таким образом сбоя regex проверки.

Там какой-либо путь состоит в том, чтобы заставить рубин/направляющие сохранить формат вводимым пользователем, независимо от конечных нулей?

5
задан Chris Allison 4 May 2010 в 16:09
поделиться

3 ответа

Я предполагаю, что ваша сумма в долларах имеет десятичный тип. Таким образом, любое значение, вводимое пользователем в поле, перед сохранением в базе данных преобразуется из строки в соответствующий тип. Валидация применяется к значениям, уже преобразованным в числовые типы, поэтому regex не совсем подходит для фильтра валидации в вашем случае.

Однако у вас есть пара возможностей решить эту проблему:

  1. Используйте validates_numericality_of. Таким образом, вы полностью оставляете преобразование на усмотрение Rails, и просто проверяете, находится ли сумма в заданном диапазоне.
  2. Используйте метод validate_each и закодируйте логику проверки самостоятельно (например, проверьте, имеет ли значение более 2 десятичных цифр).
  3. Проверяйте атрибут до того, как он был напечатан:

Это особенно полезно при ситуациях проверки, когда пользователь может ввести строку для целочисленного а вы хотите отобразить оригинальную строку обратно в сообщение об ошибке сообщение. Доступ к атрибуту обычно приводит строку к 0, а это не то, что вам нужно.

Итак, в вашем случае вы можете использовать:

validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period"

Обратите внимание, однако, что пользователям может показаться утомительным следовать вашим жестким правилам ввода (например, я бы предпочел иметь возможность набирать 500 вместо 500.00), и что в некоторых локалях точка не является десятичным разделителем (если вы планируете интернационализировать ваше приложение).

8
ответ дан 13 December 2019 в 22:03
поделиться

Обычно деньги лучше хранить как целое число в центах (500 центов - это $5.00). Для этого я использую Money gem.

0
ответ дан 13 December 2019 в 22:03
поделиться

В общем, если вы хотите «запомнить» десятичную точность значения с плавающей запятой, вы должны использовать десятичный тип , а не двоичный тип с плавающей запятой.

С другой стороны, я не уверен, почему вы хотите принудительно использовать строковое представление в такой строгой манере ... Как насчет принятия любого числа и его форматирования, например, number_to_currency ?

2
ответ дан 13 December 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: