2009-09-14 76 views

回答

3

在的聰明/正則表達式魔術一點點的費用,像下面這樣可以讓你測試不僅是一個字符串是否是數字(第一準則,作爲一個有效的年份),但它是否屬於一個特定的年份範圍內:

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 

上述功能與非數字字符,false對於那些數字,但所提供的範圍之外的任何字符串返回nil ,有效年份字符串爲true

+0

+ 1-Wow很好的工作......我想我也應該深入探究Regex! – RubyDubee

+0

一些(迂腐?)注意:您不能命名方法參數結束(因爲這是一個保留關鍵字),並且此方法將爲字符串「1999」返回false,因此您可能需要在.grep之前調用.strip。 –

+0

@Greg:參數名稱的好處 - 我明顯從IRB會話中提取了這個,而不是完整的源文件,因此在瀏覽器窗口中更改了名稱。調用'#strip'可能是驗證規則的有用放鬆,但它將取決於應用程序。 – rcoder

0
Date.parse(string_of_date).gregorian? 

另外,看看Date class的文檔。

+0

感謝之間的範圍,如果輸入的是1999年或者2005年你的建議不工作! Date.parse。我想是在尋找YYYYMMDD。 – railsuser

+0

啊。我沒有意識到你只想要一年(儘管它在問題中說得很對!)。我很抱歉。 – theIV

4

聽起來更直接的問題是:你如何驗證用戶輸入的字符串對應於1582和2500之間的數字(比如說)。你可以這樣做是這樣的:

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

這種方式,你可以選擇一個明智的一年是什麼,太 - 例如,800真的在你的應用有效的答案嗎?或3000?

4

下面是做這件事:

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

注意,這會拋出異常,如果字符串是在一個意想不到的格式。另一個(更寬容)選項,就是:

Date.new(date_str.to_i).gregorian? 
0
1

由@rcoder接受的答案將不會正常工作,因爲我在rails 4 + 上測試,我做了另一個簡單的。

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

第一行不接受的字符,你也可以改變你的願望