I can\'t seem to get the custom format right for my TimeSpan.ParseExact()
:
Time samples to be expected:
1:23:45.6
23:45.6
23:45
1:23:45
I'm not aware of the ability to specify optional parts like that in a custom format string. I suggest you use multiple format strings, and use the overload of TimeSpan.ParseExact
that takes an array of formats.
string[] formats = { @"h\:mm\:ss\.FFF", @"mm\:ss\.FFF",
@"h\:mm\:ss", @"mm\:ss"};
string[] values = { "1:23:45.6", "23:45.6", "23:45", "1:23:45" };
foreach (string value in values)
{
var parsed = TimeSpan.ParseExact(value, formats,
CultureInfo.InvariantCulture);
Console.WriteLine(parsed);
}
(I'm using FFF
as the milliseconds specifier to allow you to express "1:23:45.67" as well. If you only ever want hundreds of milliseconds, F
or f
would be fine.)
I would simply use DateTime.ParseExact
instead because it's more powerful:
string[] strings = new[] { "1:23:45.6", "23:45.6", "23:45", "1:23:45" };
string[] formats = new[] { "H:mm:ss.f", "H:mm.f", "H:mm", "H:mm:ss" };
TimeSpan[] timespans = strings
.Select(str =>
{
TimeSpan? ts = null;
DateTime dt;
if (DateTime.TryParseExact(str, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
ts = dt.TimeOfDay;
return ts;
})
.Where(ts => ts.HasValue)
.Select(ts => ts.Value)
.ToArray();
Demonstration