2017-10-13 24 views
0

我是一個新手入軌,我需要你的幫助。錯誤的輸入紅寶石日期驗證

在下面的代碼中,如果第一個輸入是錯誤的,而第二個輸入是正確的,那麼表達式會計算第一個輸入。 我希望用戶輸入總是被評估。

require 'date' 

puts "x is not a valid date" 
until (x = gets.chomp) == ((x.match(/\d{4}-\d{1,2}-\d{1,2}$/).to_s &&Date.strptime(x, '%Y-%m-%d')rescue false) ==true) 
+0

TY爲輸入,它的大加讚賞 –

回答

1

在一般情況下,你應該嘗試將數據inout邏輯與數據驗證和後續處理分開。這樣,你的方法只關心一件事情,這使得它們更容易推理,從而更加強大。

在這裏,我們介紹一個valid_date_string?方法,該方法檢查傳遞的input對象是否是有效的日期字符串。

require 'date' 

def valid_date_string?(input) 
    # First, we check that the given input is of the expected type. 
    # We do this here explicitly since we are validating a String. Most 
    # of the time, you would rely on duck typing instead. 
    return false unless input.is_a?(String) 

    # Then, we ensure roughly valid syntax (i.e. it looks like a date) 
    return false unless input =~ /\A\d+-\d+-\d+\z/ 

    # Then, we "parse" it and split it into an array of year, month, day... 
    parts = input.split('-').map(&:to_i) 
    # ...and validate that this represents a valid date 
    Date.valid_date?(*parts) 
end 

在這個解決方案,我十分小心不要依賴例外程序流,因爲這通常是在,因爲它會導致未被發現的錯誤和有表現不佳皺起了眉頭。

然後,我們可以使用一些輸入迴路這種方法要求用戶輸入一些值

def get_valid_date 
    loop do 
    input = gets.chomp 
    return input if valid_date_string?(input) 

    # Here, the user entered an invalid date. We can now do our 
    # error handling and try again. 
    puts "Invalid date given. Please try again..." 
    end 
end 

my_valid_date_string = get_valid_date 
+1

老實說你提供了更好的解決方案+1 – mabe02

+0

謝謝@Holger!這幫助我澄清了更多的事情! –

0

如下我會解決這個問題:

# date_test.rb 

def date_input 
    puts "Please enter a date (format YYYY-MM-DD):" 
    d = gets.chomp 
    if d =~ /\d{4}-\d{1,2}-\d{1,2}$/ 
    puts "You entered: #{d}" 
    else 
    puts "#{d} is not a valid date." 
    date_input 
    end 
end 

date_input 

說明:

  • 提示輸入一個日期(指定的預期格式)
  • 獲取並終日啃食用戶輸入
  • 驗證格式
    • 如果有效,把日期
    • 如果無效,把錯誤信息和當你運行它再次啓動

$ ruby date_test.rb 
Please enter a date (format YYYY-MM-DD): 
invalid date 
invalid date is not a valid date. 
Please enter a date (format YYYY-MM-DD): 
2017-10-13 
You entered: 2017-10-13 
$ 
+0

謝謝@ mabe02,代碼看起來像下面並驗證日期格式和現有日期: 需要 '日期' DEF date_input 提出 「請輸入日期(格式YYYY-MM-DD):」 d = gets.chomp 如果(d =〜/ \ d {4 } - \ d {1,2} - \ d {1,2} $/&& Date.strptime(d,'%Y-%m-%d')rescue false) puts「You entered:#{d} 「 其他 puts「#{d}不是有效日期。」 date_input end end date_input –

+0

嘿@GeorgeConstantin,你覺得這個回答有用嗎?它能解決你的問題嗎?如果沒有,你能告訴我如何改進以便被接受嗎? – mabe02

+0

嘿,@ mabe02,是的,它非常有用,謝謝 –