我在winforms中有一个组合框,其中包含以下项目:
15 min
30 min
1 hr
1 hr 30 min
2 hr
2 hr 30 min
etc . .
以下是winforms combobox Collection Items编辑器的屏幕截图
我需要解析该字符串并返回一个表示分钟数的整数。我希望看到最优雅的方式(现在我按空间分割,然后计算数组长度,感觉有点不对。
解析
2h 30 mins
将返回150
答案 0 :(得分: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分钟”或其任何组合将失败。
答案 1 :(得分:0)
我为此使用Dictionary
,因此根本没有解析。 (当有固定的选择时,它运行良好。)我比熟悉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;
答案 2 :(得分:-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;
}