2009-09-04 294 views
0

我需要計算(使用python)用戶輸入了多少時間,是否輸入類似3:30或3.5的東西。我不確定最好的方法是什麼,我想我會徵求專家的意見。用Python計算用戶輸入時間

===編輯==================

爲了更加清晰地明確,我希望用戶輸入小時和分鐘或只有幾分鐘的路程。我希望他們能夠以hh:mm(3:30或03:30)或浮動(3.5)小時兩種格式輸入時間。

總體目標是跟蹤他們工作的時間。所以,我會增加他們進入的時間來獲得總數。

回答

0

有幾種可能的解決方案,但在某些時候你會遇到模棱兩可的情況,導致任意轉換。總的來說,我會建議採取任何輸入和解析分隔符(無論是:或。或其他),然後根據您定義的單位的一些模式轉換爲秒。

或者,您可以執行一系列try/except語句,以針對不同的時間格式方案測試它,以查看它是否匹配。

我不知道會是最好的,你的情況是什麼?

1

你能精確地定義了允許用戶輸入字符串的語法?一旦你這樣做了,如果它足夠簡單,它可以通過簡單的Python字符串表達式匹配,否則你可能會更好用pyparsing或類似的東西。此外,精確的語法將使識別任何歧義變得更加容易,因此您可以更改規則(以避免輸入字符串含糊不清),或者至少確定如何解釋它們(併爲用戶的利益記錄事實! )。

編輯:鑑於OP的澄清(HH:MM或只有幾分鐘的路程爲float)看似簡單:

while True: 
    s = raw_input('Please enter amount of time (hh:mm or just minutes):') 
    try: 
     if ':' in s: 
     h, m = s.split(':') 
     else: 
     h = '' 
     m = s 
     t = int(h)*3600 + float(m)* 60 
    except ValueError, e: 
     print "Problems with your input (%r): %s" % (s, e) 
     print "please try again!" 
    else: 
     break 

您可能希望獲得更細粒度的-診斷到底是什麼問題,用戶輸入可能有(當你接受和解析用戶輸入時,99%的努力會用來識別令人難以置信的[[刪除]]錯誤:這很難讓你的代碼萬無一失,因爲傻瓜確實非常愚蠢!幫助你開始。

0

首先,你需要一些約定。是3.55分鐘到4小時,5毫秒到4秒,還是3和55/100分鐘/小時/秒?這同樣適用於3:55。至少要區分點和冒號,指定點代表分數和冒號,分隔符爲小時/分鐘/秒。

雖然你還沒有指定「時間」是什麼(自從或點鐘?),你也需要這樣做。

然後,它很簡單,只需要最後一次表達您想要使用的時間,然後繼續轉換輸入,直到達到最終表示形式。假設您決定最終應將時間表示爲MM:SS(兩位數分鐘,一個冒號,兩位數秒),您需要在字符串中搜索允許出現的字符,並相應地採取行動。例如,不允許同時使用冒號和點。如果只有一個冒號,那麼你有一個分數,因此你將第二部分當作60的一部分。

繼續這樣做,直到你有最後的表示,然後只是做你應該做的與「時間」。

我不知道你在處理什麼限制,但如果不是一個單一的「時間」輸入,而是你有兩個問題,問題可能會縮小:第一個是人們輸入小時的地方,第二個,他們在那裏鍵入分鐘。當然,只有當您可以分割輸入時,這纔會起作用...

+0

不好意思,但一毫秒是1/1000秒,所以3.55秒實際上是450毫秒短於4秒。不知道你會怎麼想出5,除非你認爲毫秒是1/60秒? – 2009-09-04 02:37:36

+0

@John Y沒問題,因爲注意到:) – inerte 2009-09-04 02:53:47

0

這是我們在我們的一個內部Web應用程序中使用的代碼,我們使用時間跟蹤目的。當用戶輸入時間時,字符串值將通過此函數傳遞,該函數返回時間數據結構。

它是用javascript編寫的,代碼可以直接移植到python。

我希望它有一點幫助。

var ParseTime_NOW_MATCH = /^ *= *$/ 
var ParseTime_PLUS_MATCH = /^ *\+ *([0-9]{0,2}(\.[0-9]{0,3})?) *$/ 
var ParseTime_12_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *([aApP])[mM]? *$/ 
var ParseTime_24_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *$/ 


// ######################################################################################## 
// Returns either: 
// { 
//  Error: false, 
//  HourDecimal: NN.NN, 
//  HourInt: NN, 
//  MinuteInt: NN, 
//  Format12: "SS:SS SS", 
//  Format24: "SS:SS" 
// } 
// or 
// { 
//  Error: true, 
//  Message: "Error Message" 
// } 
function ParseTime(sTime) 
{ 
    var match; 

    var HH12; 
    var HH24; 
    var MM60; 
    var AMPM; 

    /////////////////////////////////////////////////////////////////////////////////////// 
    if((match = ParseTime_NOW_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     return {Error: true, Message: "Unsupported format"}; 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_PLUS_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     return {Error: true, Message: "Unsupported format"}; 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_24_MATCH.exec(sTime)) != null) 
    { 
//    console.log("24"); 
//    console.log(match); 
     HH24 = parseInt(match[1], 10); 
     MM60 = parseInt(match[2], 10); 

     if(HH24 > 23 || MM60 > 59) 
     { 
      return {Error: true, Message: "Invalid Hour or Minute (24)."}; 
     } 
     else if(HH24 == 0) 
     { 
      HH12 = 12; 
      AMPM = 'AM'; 
     } 
     else if(HH24 <= 11) 
     { 
      HH12 = HH24; 
      AMPM = 'AM'; 
     } 
     else if(HH24 == 12) 
     { 
      HH12 = HH24; 
      AMPM = 'PM'; 
     } 
     else 
     { 
      HH12 = HH24 - 12; 
      AMPM = 'PM'; 
     } 

    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_12_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     AMPM = ((match[3] == 'A' || match[3] == 'a') ? 'AM' : 'PM'); 
     HH12 = parseInt(match[1], 10); 
     MM60 = parseInt(match[2], 10); 

     if(HH12 > 12 || HH12 < 1 || MM60 > 59) 
     { 
      return {Error: true, Message: "Invalid Hour or Minute (12)."}; 
     } 
     else if(HH12 == 12 && AMPM == 'AM') 
     { 
      HH24 = 0; 
     } 
     else if(AMPM == 'AM') 
     { 
      HH24 = HH12; 
     } 
     else if(AMPM == 'PM') 
     { 
      HH24 = HH12 + 12; 
     } 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else 
    { 
     return {Error: true, Message: "Invalid Time Format."}; 
    } 

    return { 
     Error  : false, 
     HourDecimal : HH24 + (MM60/60), 
     HourInt  : HH24, 
     MinuteInt : MM60, 
     Format12 : HH12 + ':' + (MM60 < 10 ? "0"+MM60 : MM60) + ' ' + AMPM, 
     Format24 : (HH24 < 10 ? "0"+HH24 : HH24) + ':' + (MM60 < 10 ? "0"+MM60 : MM60) 
    } 

} 
+0

感謝gahooa,這很有趣 – Joe 2009-09-04 13:08:44

0

你能有GUI做到這一點,限制用戶輸入?處理文本似乎是超級錯誤,否則(在用戶方面,更不用說程序員),並且工作了幾個小時......你想要正確地做到這一點。