C #: как упростить этот код строки чисел для различных частей даты - PullRequest
3 голосов
/ 06 января 2010

У меня есть строка длиной от 1 до 8 символов. Мне нужно преобразовать их в день, месяц и год. Для недостающих частей я буду использовать текущую.

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

Мой текущий код указан ниже:

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 цифр ... так что это не сработало так хорошо. Если бы только метод Substring просто взял бы столько букв, сколько мог, вместо того, чтобы завершиться сбоем, когда не было достаточно букв для «заполнения» подстроки ...

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

Ответы [ 4 ]

7 голосов
/ 06 января 2010

Посмотрите на метод 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 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

Regex может быть хорошим решением. С моей головы это может выглядеть так:

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

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

0 голосов
/ 06 января 2010

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

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));
...