2016-06-03 4 views
0

Ввод пользователя 555 Я хочу, чтобы это было 05:55:00 (TimeSpan). Как преобразовать его в TimeSpan? Какой формат используется?Разбор 3-значного ввода как 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", чтобы быть 5: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

+0

Я думаю, что вам придется сделать это вручную, получите ввод как 'string' и выполните некоторую * подстроку * или используйте его как' int' и выполните некоторые '%' и '/', чтобы получить требуемые цифры. – Luiso

+0

Это уже строка. Я только нашел решение, но не по формату. Просто сделайте: '.PadLeft (4, '0')' с вводом пользовательской строки. – gurth

+0

Это действительно плохой метод, но работает: TimeSpan ts = TimeSpan.FromSeconds ((60 * (int) (int.Parse (input)/100)) + (int.Parse (input)% 100)); – jdweng

ответ

0

I просто нашел решение, но не по формату. Просто сделайте: .PadLeft(4,'0') с пользовательским строковым вводом. Тем не менее мне любопытно, можно ли это сделать с помощью формата?

редактировать: но теперь это не работает, как ожидалось:

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

йоту .PadLeft(4,'0') он бросает исключение :(

+0

'var c = TimeSpan.ParseExact (" 5 ".PadLeft (4, '0'),"% hmm ", CultureInfo.InvariantCulture);' будет работать. –

+0

Dodałem komentarz do głównego wątku. Po Twojej zmianie zamiast piątej godziny będę miał pięć po północy. :) Я редактировал главный вопрос, после этого изменения пользователь intpu «5» будет через пять минут после полуночи не так ожидаемый 5:00 утра – gurth

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

 Смежные вопросы

  • Нет связанных вопросов^_^