2010-01-06 3 views
3

У меня есть строка длиной от 1 до 8 символов. Мне нужно преобразовать их в день, месяц и год. Для недостающих частей я буду использовать текущий.C#: Как упростить этот код строки-of-numbers-to-different-date-parts

Код, который у меня есть сейчас, является большим и уродливым, и мне было интересно, есть ли у кого-то более умная идея о том, как это сделать.

Мой текущий код приведен ниже:

var day = DateTime.Now.Day; 
var month = DateTime.Now.Month; 
var year = DateTime.Now.Year; 

switch (digits.Length) 
{ 
    case 1: 
    case 2: 
     day = int.Parse(digits.Substring(0)); 
     break; 

    case 3: 
    case 4: 
     day = int.Parse(digits.Substring(0, 2)); 
     month = int.Parse(digits.Substring(2)); 
     break; 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
     day = int.Parse(digits.Substring(0, 2)); 
     month = int.Parse(digits.Substring(2, 2)); 
     year = int.Parse(digits.Substring(4)); 
     break; 
    default: 
     break; 
} 

Примечание: Я знаю, что это не принимая во внимание культуру, но это не должно :)

Я пытался сделать это следующим образом:

day = int.Parse(digits.Substring(0, 2)); 
if(digits.Length > 2) 
    month = int.Parse(digits.Substring(2, 2)); 
if(digits.Length > 4) 
    year = int.Parse(digits.Substring(4, 4)); 

Но он будет бросать, если в ArgumentOutOfRangeException строка длиной 1, 3, 5, 6 или 7 цифр ... так что это не так хорошо работает. Если бы только метод подстроки просто взял столько букв, сколько мог, вместо того, чтобы потерпеть неудачу, когда не было достаточно букв для «заполнения» подстроки ...

Могут ли быть использованы регулярные выражения для этого?

ответ

7

Посмотрите на метод TryParseExact.

DateTime date; 
if (DateTime.TryParseExact(
    digits, 
    new[] { "dd", "ddMM", "ddMMyyyy" }, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out date)) 
{ 
    int day = date.Day; 
    int month = date.Month; 
    int year = date.Year;  
} 
+0

Теперь, смотрите, что это великолепно! Никогда не использовал этот метод раньше. Спасибо! – Svish

0

Вы можете получить свой второй фрагмент кода, чтобы работать, если вы подушечка правая сторона цифр строки с небольшим количеством пробелов:

digits += " "; 
day = int.Parse(digits.Substring(0, 2)); 
if(digits.Length > 2) 
    month = int.Parse(digits.Substring(2, 2)); 
if(digits.Length > 4) 
    year = int.Parse(digits.Substring(4, 4)); 
0

Regex может быть хорошим решением. С верхней части моей головы, это может выглядеть следующим образом:

^([0-9]{1,2})([0-9]{1,2})?([0-9]{1,4})? 

, который обеспечит до 4-х групп, индексируемых как: 0 - вся строка 1 - первые 2 цифры (1, если есть только одна цифра) 2 - вторая пара цифр (1, если есть только 3 цифры) 3 - последний набор из 1-4 цифр

0

Так что для программы первые два номера также будет день, а не в день месяца, как 38 день = 3, месяц = ​​8? День всегда был бы нулевым, лидирующим до 10 лет?

+0

В значительной степени. Хорошая точка зрения. Вероятно, лучше было бы справиться с этим, но когда я делал это, было уже слишком сложно: p Как это сделать, чтобы поддержать это? Все, что я могу придумать, - это очень уродливые джунгли if-заявлений: p – Svish