将3位数输入解析为TimeSpan

时间:2016-06-03 16:34:24

标签: c# parsing timespan

用户输入是555我希望它是05:55:00(TimeSpan)。如何将其转换为TimeSpan?使用什么格式?

var a = TimeSpan.ParseExact(/*user input string*/"5:55", new string[] { "%h\\:mm" }, CultureInfo.InvariantCulture);//OK output {05:55:00}
var b = TimeSpan.ParseExact(/*user input string*/"1111", new string[] { "%hmm" }, CultureInfo.InvariantCulture);//OK output {11:11:00}
var c = TimeSpan.ParseExact(/*user input string*/"555", new string[] { "%hmm", "hmm", "hhmm"}, CultureInfo.InvariantCulture);//Exception! None format works.

编辑:详细内容我想将用户字符串输入格式化为小时和分钟hh:mm。例如用户输入字符串:

  • " 5"是05:00
  • " 12"为12:00
  • " 1111"是11:11
  • " 12:12"是12:12
  • " 4:44"是4:44
  • 和一个不工作" 555"是5:55(抛出异常)

现在我正在使用:

private static string[] _foramts = {"%hmm", "hmm", "hhmm","%h", "hh\\:mm", "%h\\:mm" };
return TimeSpan.ParseExact((string)value, _foramts, CultureInfo.InvariantCulture).ToString("hh\\:mm");

使用PadLeft,现在没有例外,但是......

var d = TimeSpan.ParseExact(((string)value).PadLeft(4, '0'), new string[]  { "%hmm", "hmm", "hhmm", "%h", "hh\\:mm", "%h\\:mm" }, CultureInfo.InvariantCulture).ToString("hh\\:mm");

" 5"现在是00:05,我希望它是05:00

2 个答案:

答案 0 :(得分:0)

我刚刚找到解决方案,但不是格式化。只需使用用户字符串输入:.PadLeft(4,'0')。我仍然很好奇格式化吗?

编辑:但现在这不能按预期工作:

var b = TimeSpan.ParseExact("5", new string[] { "%h" }, CultureInfo.InvariantCulture);

whit .PadLeft(4,'0')它抛出异常 :(

答案 1 :(得分:0)

问题是H格式根据可用的位数匹配一位或两位数。在你的情况下,它会抓住前两位数字" 55"这不是一个正确的时间。用零填充是解决这个问题的方法:

 var c = TimeSpan.ParseExact(value.PadLeft(4, '0'), new string[] { "%hmm", }, CultureInfo.InvariantCulture);

如果你想处理不同的格式,那么尝试将所有可能的输入与一种模式相匹配的普通if-elses会更容易。

public static TimeSpan Parse(string value) {

    if (value.Length == 1)
    {
        value = value.PadLeft(2, '0');
        value = value.PadRight(4, '0');
    }
    else if (value.Length == 2)
    {
        value = value.PadRight(4, '0');
    }
    else if(value.Length == 3)
    {
        value = value.PadLeft(4, '0');
    }

    return TimeSpan.ParseExact(value, new string[] { "%h\\:mm", "%hmm", "hmm", "hhmm" }, CultureInfo.InvariantCulture);//Exception! None format works.
}