用户输入是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。用户输入字符串:
我现在用的是:
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。
发布于 2016-06-03 17:09:03
问题是,根据可用的数字数,H
格式匹配一个或两个数字。在您的情况下,它将获取前两位数字"55“,这不是一个正确的时间。填充零是解决这个问题的方法:
var c = TimeSpan.ParseExact(value.PadLeft(4, '0'), new string[] { "%hmm", }, CultureInfo.InvariantCulture);
如果您想要处理不同的格式,那么尝试将所有可能的输入与一种模式相匹配的简单的、老的If -else就更容易了。
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.
}
发布于 2016-06-03 16:49:06
我刚找到了解决方案,但不是通过格式。只需:使用用户字符串输入的.PadLeft(4,'0')
。不过,我还是很好奇,它能用格式来完成吗?
编辑:但是现在这并不像预期的那样工作:
var b = TimeSpan.ParseExact("5", new string[] { "%h" }, CultureInfo.InvariantCulture);
它会抛出异常:(
https://stackoverflow.com/questions/37619449
复制相似问题