Как проверить, что строка это год - PullRequest
2 голосов
/ 15 сентября 2009

Использование Ruby / RoR - Год - это строка в модели / представлении. Как проверить, что введенная пользователем строка является действительным григорианским календарным годом?

Ответы [ 6 ]

5 голосов
/ 15 сентября 2009

Похоже, более прямой вопрос: как вы проверяете, что пользователь вводит строку, соответствующую числу между 1582 и 2500 (скажем). Вы можете сделать это так:

 date_string.scan(/\D/).empty? and (1582..2500).include?(date_string.to_i)

Таким образом, вы также можете выбрать разумный год - например, действительно ли 800 является верным ответом в вашей заявке? или 3000?

4 голосов
/ 15 сентября 2009

Вот один из способов сделать это:

Date.strptime(date_str, "%Y").gregorian?

Обратите внимание, что это вызовет исключения, если строка имеет неожиданный формат. Еще один (более щадящий) вариант:

Date.new(date_str.to_i).gregorian?
3 голосов
/ 15 сентября 2009

За счет крошечного кусочка магии сообразительности / регулярного выражения, что-то вроде следующего позволит вам проверить не только то, является ли строка числовой (первый критерий для того, чтобы быть действительным годом), но и находится ли она в пределах определенный диапазон лет:

def is_valid_year?(date_str, start=1900, end=2099)
  date_str.grep(/^(\d)+$/) {|date_str| (start..end).include?(date_str.to_i) }.first
end

Вышеприведенная функция возвращает nil для любой строки с нечисловыми символами, false для тех, которые являются числовыми, но выходят за пределы указанного диапазона, и true для допустимых строк года.

2 голосов
/ 19 ноября 2017

Принятый ответ @rcoder не будет работать, так как я тестировал на рельсах 4+ я сделал еще один простой.

def is_valid_year? year
  return false if year.to_i.to_s != year
  year.strip.to_i.between?(1800, 2999)
end

В первой строке, не принимающей символы, вы также можете изменить диапазон по вашему желанию

0 голосов
/ 15 сентября 2009
Date.parse(string_of_date).gregorian?

Также ознакомьтесь с документацией для Даты класса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...