我正在尝试将用户输入的时间转换为TimeSpans。因为TimeSpan没有TryParseExact方法,所以我在DateTime中使用它并从中转换输出。
我想要处理的格式是:04:00,4400,4:00和400.前三个不是问题,对应于下面方法中if / else结构中的前三种情况。第四个可能对应于最后两个中的任何一个,但两者都不起作用。
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
CultureInfo enUS = new CultureInfo("en-US");
DateTime parsedDate = new DateTime();
string userInput = (string)e.Value;
if (DateTime.TryParseExact(userInput, "HH:mm", enUS, DateTimeStyles.None, out parsedDate))
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
else if (DateTime.TryParseExact(userInput, "HHmm", enUS, DateTimeStyles.None, out parsedDate))
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
else if (DateTime.TryParseExact(userInput, "H:mm", enUS, DateTimeStyles.None, out parsedDate))
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
else if (DateTime.TryParseExact(userInput, "hmm", enUS, DateTimeStyles.None, out parsedDate))
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
else if (DateTime.TryParseExact(userInput, "Hmm", enUS, DateTimeStyles.None, out parsedDate))
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
}
答案 0 :(得分:4)
我只是对用户输入执行string.PadLeft(int totalWidth, char paddingChar)
以确保字符串的长度为4个字符(最小值)。因此,您的Hmm输入将符合HHmm格式。
userInput = userInput.PadLeft(4, '0'); // "400" becomes "0400"
如果你的字符串已经达到或超过4,它将保持不变。
答案 1 :(得分:1)
只是一般性评论 - 您可以将一个布尔变量(如isValidDate)初始化为false,并将其设置为true
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
然后将该代码移动到最后的if块
if isValidDate then
{
e.Value = parsedDate.TimeOfDay;
e.ParsingApplied = true;
}
答案 2 :(得分:1)
您可以使用this overload of DateTime.TryParseExact一次指定多种格式。它看起来不像Hmm
格式,但您可以使用整数解析,如下所示:
internal static class Program
{
private static void Main(string[] args)
{
Console.WriteLine(ParseTime("04:00"));
Console.WriteLine(ParseTime("0400"));
Console.WriteLine(ParseTime("4:00"));
Console.WriteLine(ParseTime("400"));
}
public static TimeSpan ParseTime(string input)
{
CultureInfo cultureInfo = new CultureInfo("en-US");
DateTime parsedDateTime;
if (!DateTime.TryParseExact(input, new [] { "HH:mm", "HHmm", "H:mm" }, cultureInfo, DateTimeStyles.None, out parsedDateTime))
{
int parsedInt32;
if (!int.TryParse(input, NumberStyles.None, cultureInfo, out parsedInt32))
{
throw new ArgumentException("Unable to parse input value as time in any of the accepted formats.", "input");
}
int remainder;
int quotient = Math.DivRem(parsedInt32, 100, out remainder);
return new TimeSpan(quotient, remainder, 0);
}
return parsedDateTime.TimeOfDay;
}
}
答案 3 :(得分:0)
我使用了正则表达式选项(我通常知道使用的更糟糕但我使用的系统需要它......不要问):
Regex.Replace("935", "^([0-9]{3})$", "0$1"); // outputs "0935"
答案 4 :(得分:0)
我解决了这个问题如下:
DateTime.TryParseExact(
userInput,
new[] { "%H", "Hm", "H:m" },
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out parsedDate);