2013-06-26 98 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; 
相关问题