2013-06-26 113 views
4

我在的WinForms的組合框具有以下項目:將此字符串轉換爲分鐘數的最佳方法是什麼?

15 min 
30 min 
1 hr 
1 hr 30 min 
2 hr 
2 hr 30 min 
etc . . 

這裏是WinForms的組合框徵收項目編輯

enter image description here

的截圖,我需要解析字符串,返回表示分鐘數的整數。我想看看這樣做(現在的最優雅的方式我是通過空間拆分,然後計數數組長度,感覺有點不對勁。

所以解析

2h 30 mins 

將返回150

+8

你爲什麼不沿着存儲每個下拉條目的分鐘數? – dtb

+0

Diiiiiiictionary – Jonesopolis

+0

你的意思是分鐘數是多少?你正在計算還是增加了..用你的問題清楚... – Anirudha

回答

4

既然你說這是一個組合框,那麼你將要解析的值。您的用戶可以輸入自己的價值,以及。

var formats = new[] {"h' hr'", "m' min'", "h' hr 'm' min'"}; 

TimeSpan ts; 
if (!TimeSpan.TryParseExact(value, formats, null, out ts)) 
{ 
    // raise a validation message to your user. 
} 

// you said you wanted an integer number of minutes. 
var minutes = (int) ts.TotalMinutes; 

您可以將您在示例中顯示的任何字符串作爲value傳遞。

但是,請注意,由於TimeSpan的工作原理,使用此方法不能解析超過23小時或超過59分鐘。通過「24小時」或「60分鐘」或這些的任何組合都將失敗。

+0

我添加了截圖,你會在哪裏放置值? – leora

+0

這不是一個下拉菜單,這是一個組合框。所以是的,你需要解析。 –

+0

我更新爲使用'TryParseExact'來代替,這在您描述的場景中更加有用。 –

-1

這應該工作:

static int GetAllNumbersFromString(string timeString) 
    { 
    int min = 0; 

    MatchCollection mc=Regex.Matches(timeString, @"\d+"); 

    if(timeString.Contains("hr") && mc.Count = 1) 
    { 

      min = mc[0] * 60; 

    } 
    else 
    { 

     if(mc.Count > 1) 
     { 
      min = mc[0] * 60 + mc[1]; 
     } 
     else 
     { 
      min = mc[0]; 
     } 
    } 

    return min; 
} 
+0

這不起作用。 。當你解析「1小時」它返回1(不是60) – leora

+0

啊好點讓我編輯它 – Bit

0

我會使用這一個Dictionary,所以沒有解析,在所有參與。 (當有固定的選擇時,它運行良好。)我比Delphi更熟悉Delphi的UI控件,所以可能有更好的方式來填充ComboBox比我在這裏做的,但我確信有人會讓我知道如果有,我可以修復它。

(代碼爲OXYGENE,但它應該是容易翻譯到C#或VB.Net。)

method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs); 
var 
    KC: Dictionary<String, Int32>.KeyCollection; 
begin 
    aItems := new Dictionary<String, Int32>; 
    aItems.Add('15 min', 15); 
    aItems.Add('30 min', 30); 
    aItems.Add('1 hr', 60); 
    aItems.Add('1 hr 30 min', 90); 
    aItems.Add('2 hr', 120); 
    aItems.Add('2 hr 30 min', 150); 
    KC := aItems.Keys; 
    for s in KC do 
    comboBox2.Items.Add(s); 
    comboBox2.DropDownStyle := ComboBoxStyle.DropDownList; 
end; 

method MainForm.comboBox2_SelectedIndexChanged(sender: System.Object; e: System.EventArgs); 
begin 
    // Safe since style is DropDownList. 
    label1.Text := aItems[comboBox2.SelectedItem.ToString].ToString(); 
end; 
相關問題