以下方法是否有更好,更优雅的解决方案?
预期输入格式:
8 h 13 m
预期输出格式:
8.13
我的代码:
private string FormatHours(string value)
{
//Example: (Input = 10 h 53 m) (Output = 10.53)
var timeValues = Regex.Split(value, @"[\shm]", RegexOptions.IgnoreCase).Where(s => !string.IsNullOrEmpty(s)).ToArray();
return ((timeValues != null) && (timeValues.Length == 2)) ? string.Format(@"{0:hh}.{1:mm}", timeValues[0], timeValues[1]) : null;
}
答案 0 :(得分:4)
有没有理由不使用以下内容?
value.Replace(" h ",".").Replace(" m",string.Empty)
答案 1 :(得分:3)
我认为Regex.Split
在这里太过分了。常规的旧Match
将为您提供您想要的内容:
private static string FormatHours(string value)
{
Match m = Regex.Match(value, @"^(?<hours>\d{1,2}) h (?<minutes>\d{1,2}) m$");
if (m.Success)
{
int hours = int.Parse(m.Groups["hours"].Value);
int minutes = int.Parse(m.Groups["minutes"].Value);
if (hours >= 0 && hours < 24 && minutes >= 0 && minutes < 60)
return string.Concat(hours, ".", minutes);
}
return null;
}
答案 2 :(得分:0)
我唯一能想到的是timeValues
如果null
调用ToArray()
会抛出
private string FormatHours(string value)
{
var timeValues = Regex.Split(value, @"[\shm]", RegexOptions.IgnoreCase).Where(s => !string.IsNullOrEmpty(s));
if (timeValues == null || timeValues.Count() != 2)
return null;
string[] arr = timeValues.ToArray();
return string.Format(@"{0:hh}.{1:mm}", arr[0], arr[1]);
}
答案 3 :(得分:0)
表达式:
^(\d{1,2}) h (\d{1,2}) m$
代码:
var input = "8 h 13 m";
var regex = new Regex(@"^(\d{1,2}) h (\d{1,2}) m$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
var match = regex.Match(input);
if (!match.Success) throw new Exception();
int h = Int32.Parse(match.Groups[1].Value);
int m = Int32.Parse(match.Groups[2].Value);
var output = String.Format("{0}.{1}", h, m);
// or to be sure that that's the realistic numbers
var today = DateTime.Now;
var output2 = new DateTime(today.Year, today.Month, today.Day, h, m, 0).ToString("hh.mm");
答案 4 :(得分:0)
LINQ并不适合你的问题。正如我所做的那样,使用与你正在做的略有不同的正则表达式:
String FormatHours(String value) {
var regex = new Regex(@"^(?<hours>\d{1,2})\s*h\s*(?<minutes>\d{1,2})\s*m$");
var match = regex.Match(value);
if (match.Success) {
var hours = Int32.Parse(match.Groups["hours"].Value);
var minutes = Int32.Parse(match.Groups["minutes"].Value);
if (hours < 24 && minutes < 60)
return hours + "." + minutes;
}
return null;
}
您可以调整正则表达式以满足您的确切需求。这个字符串接受10 h 53 m
和10h53m
等字符串。