Есть ли лучший способ написать следующий метод? - PullRequest
0 голосов
/ 23 мая 2011

Есть ли лучшее, более элегантное решение для следующего метода?

Ожидаемый формат ввода:

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;
}

Ответы [ 5 ]

4 голосов
/ 23 мая 2011

Есть ли причина не использовать следующее?

value.Replace(" h ",".").Replace(" m",string.Empty)
3 голосов
/ 23 мая 2011

Я думаю, 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;   
}
0 голосов
/ 23 мая 2011

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.

0 голосов
/ 23 мая 2011

Выражение:

^(\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");
0 голосов
/ 23 мая 2011

Единственное, о чем я мог подумать, это то, что если бы 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]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...