我正在尝试根据以下格式解析字符串:HH:MM
12:23 //Normal
2:24 //No trailing 0
01:00 //With trailing 0
00:21 //00 First number
0:32 //0 First Number
10:4 //No 0 second number, denotes 10:04
第一个号码最大24,最小0。
第二个数字最大59,最小0.
我使字符串regex字符串d+:d+
。但这仍然匹配范围之外的数字。处理这些数字的最好方法是什么?
我在c#中以字符串的形式进行验证,如果有更好的方法来验证这种格式(并将其分成小时和分钟,请告诉我!)
基本上,我接受输入HH:MM,验证它,分割它,然后将其转换为分钟的int
。
的例子:
- 用户输入10:20
- 检查格式验证
HH:MM
- 检查范围验证
(0-24):(0-60)
- 拆分为变量
int hrs = 10
和int mins = 20
-
return (mins + (hrs*60));
您可以使用TimeSpan.TryParse
。这样做的额外好处是可以通过TotalMinutes
属性为您计算分钟:
List<string> tests = new List<string>()
{
"12:23", //Normal
"2:24", //No trailing 0
"01:00", //With trailing 0
"00:21", //00 First number
"0:32", //0 First Number
"10:4", //No trailing 0 second number
};
foreach (var test in tests)
{
TimeSpan t;
if (TimeSpan.TryParse(test, out t))
Console.WriteLine(t.TotalMinutes);
else
Console.WriteLine("Not valid");
}
输出:743
144年
60
21日
32
604
@AlexK在注释中正确地指出,这将匹配包含秒的字符串,如11:22:33
。为了防止这种情况,您可以使用TryParseExact
并传递一个可接受的格式数组:
List<string> tests = new List<string>()
{
"12:23", //Normal
"2:24", //No trailing 0
"01:00", //With trailing 0
"00:21", //00 First number
"0:32", //0 First Number
"10:4", //No trailing 0 second number
"11:22:33", //Error
};
foreach (var test in tests)
{
TimeSpan t;
//if (TimeSpan.TryParse(test, out t))
if (TimeSpan.TryParseExact(test, new[] { "h\:m", "hh\:m", "hh\:m", "h\:mm", "hh\:mm" }, CultureInfo.CurrentCulture, out t))
Console.WriteLine(t.TotalMinutes);
else
Console.WriteLine("Failed");
}
输出743
144年
60
21日
32
604年
失败的