Спецификация для разбираемой строки:
[ws][-]{ d | [d.]hh:mm[:ss[.ff]] }[ws]
, где ws
- это пробел, d
- дни от 0 до 10675199, а смысл остальных очевиден (если вы не знаете, как читать такую спецификацию, элементы в квадратных скобках необязательны, и один элемент должен быть выбран из элементов внутри фигурных скобок 1 ). Таким образом, если вы хотите проанализировать "01 52 22"
как TimeSpan
с TimeSpan.Minutes == 1
, TimeSpan.Seconds == 52
и TimeSpan.Milliseconds == 22
, то вам нужно либо переформатировать ваш ввод в "00:01:52.22"
и проанализировать
string s = "00: 01: 52.22";
TimeSpan t = TimeSpan.Parse (s);
или разбери строку сам так
string s = "01 52 22";
string[] fields = s.Split(' ');
int minutes = Int32.Parse(fields[0]);
int seconds = Int32.Parse(fields[1]);
int milliseconds = Int32.Parse(fields[2]);
TimeSpan t = new TimeSpan(0, 0, minutes, seconds, millseconds);
У меня это работает, если я ввожу что-то вроде 46 в текстовое поле, но тогда для дней устанавливается значение 46, а не секунд.
Таким образом, ссылаясь на вышеприведенную спецификацию, причина, по которой "46"
анализируется как TimeSpan
с TimeSpan.Days == 46
, заключается в том, что при повторном рассмотрении спецификации
[ws][-]{ d | [d.]hh:mm[:ss[.ff]] }[ws]
пробелов нет, нет -
, пробелов нет, и мы смотрим на
d
или
[d.]hh:mm[:ss[.ff]]
и "46"
явно соответствуют прежней спецификации и, таким образом, анализируют, как вы видели.
1 : сделайте себе одолжение и выучите регулярные выражения; Хотя приведенное выше не является регулярным выражением, его понимание поможет вам прочитать спецификации, подобные приведенным выше Я рекомендую Освоение регулярных выражений . Понимание формальной грамматики также помогает.