4

我在 winforms 中有一个组合框,其中包含以下项目:

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

这是winforms组合框Collection Items编辑器的截图

在此处输入图像描述

我需要解析该字符串并返回一个表示分钟数的整数。我想看看最优雅的方法(现在我按空间分割,然后计算数组长度,感觉有点不对劲。

所以解析

2h 30 mins

将返回 150

4

3 回答 3

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 分钟”或这些的任何组合都将失败。

于 2013-06-26T17:51:58.680 回答
0

我会Dictionary为此使用 a ,因此根本不涉及解析。(当有固定的选择时,它工作得很好。)我更熟悉 Delphi 的 UI 控件而不是 .NET,所以可能有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;
于 2013-06-26T18:43:13.600 回答
-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;
}
于 2013-06-26T17:52:08.513 回答