Ввод даты в консольном приложении

194
20 апреля 2017, 13:58

Пишу программу в С#, которая предполагает простое анкетирование пользователей с последующем выводом данных.

Как правильно организовать в консольном приложении C# получение от пользователя данных о дате его рождения?

Answer 1

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

DateTime inputDoB()
{
    DateTime dob; // date of birth
    string input;
    do
    {
        Console.WriteLine("Введите дату рождения в формате дд.ММ.гггг (день.месяц.год):");
        input = Console.ReadLine();
    }
    while (!DateTime.TryParseExact(input, "dd.MM.yyyy", null, DateTimeStyles.None, out dob));
    return dob;
}

Использование:

var dob = inputDoB();
Answer 2

Попробуйте так:

Console.WriteLine("Введите дату рождения в формате (DD.MM.YYYY): \n");
string input = Console.ReadLine();
string[] split = input.Split('.');
double day = Double.Parse(split[0]);
double month = Double.Parse(split[1]);
double year = Double.Parse(split[2]);
Answer 3

Всё зависит от ваших требований, если достаточно простого ручного ввода, то можно воспользоваться одним из ответов, присланных ранее.

Если вы реализуете консольный графический интерфейс, можно придумать что-то наподобие такого:

class ConsoleDatePicker
{
    public int Left { get; set; }
    public int Top { get; set; }
    public DateTime SelectedDate { get; set; }
    public ConsoleDatePicker(int left, int top)
    {
        Left = left;
        Top = top;
        SelectedDate = DateTime.Today;
    }
    public ConsoleDatePicker() : this(0, 0) { }
    string[] months = { "янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек" };
    public void Show()
    {
        int oldLeft = Console.CursorLeft, oldTop = Console.CursorTop;
        ShowFrame();
        ShowMonth();
        ShowCursor();
        Console.SetCursorPosition(oldLeft, oldTop);
    }
    void ShowFrame()
    {
        Console.SetCursorPosition(Left, Top);
        Console.Write("╔══════════════════════╗");
        Console.SetCursorPosition(Left, Top + 1);
        Console.Write("║                      ║");
        Console.SetCursorPosition(Left, Top + 2);
        Console.Write("╟──────────────────────╢");
        for (int topAdd = 3; topAdd <= 15; ++topAdd)
        {
            Console.SetCursorPosition(Left, Top + topAdd);
            Console.Write("║                      ║");
        }
        Console.SetCursorPosition(Left, Top + 16);
        Console.Write("╚══════════════════════╝");
    }
    void ShowMonth()
    {
        Console.SetCursorPosition(Left, Top + 1);
        Console.Write($"║       {months[SelectedDate.Month - 1]} {SelectedDate.Year:0000}       ║");
        string[,] days = new string[6, 7];
        int week = 0;
        int dayOfWeek = (int)FirstDayOfMonth(SelectedDate).DayOfWeek - 1;
        if (dayOfWeek == -1) dayOfWeek = 6;
        int daysInMonth = LastDayOfMonth(SelectedDate).Day;
        for (int day = 1; day <= daysInMonth; ++day)
        {
            days[week, dayOfWeek] = $"{day,2}";
            ++dayOfWeek;
            if (dayOfWeek == 7)
            {
                ++week;
                dayOfWeek = 0;
            }
        }
        for (int row = 0; row < 6; ++row)
            for (int column = 0; column < 7; ++column)
            {
                Console.SetCursorPosition(Left + 2 + column * 3, Top + 4 + row * 2);
                Console.Write(days[row, column] ?? "  ");
            }
    }
    void ShowCursor()
    {
        int column = (int)SelectedDate.DayOfWeek - 1;
        if (column == -1) column = 6;
        int row = (SelectedDate.Day + (int)FirstDayOfMonth(SelectedDate).DayOfWeek - 2) / 7;
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 3 + row * 2);
        Console.Write("┌──┐");
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 4 + row * 2);
        Console.Write("│");
        Console.SetCursorPosition(Left + 4 + column * 3, Top + 4 + row * 2);
        Console.Write("│");
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 5 + row * 2);
        Console.Write("└──┘");
    }
    void EraseCursor()
    {
        int column = (int)SelectedDate.DayOfWeek - 1;
        if (column == -1) column = 6;
        int row = (SelectedDate.Day + (int)FirstDayOfMonth(SelectedDate).DayOfWeek - 2) / 7;
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 3 + row * 2);
        Console.Write("    ");
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 4 + row * 2);
        Console.Write(" ");
        Console.SetCursorPosition(Left + 4 + column * 3, Top + 4 + row * 2);
        Console.Write(" ");
        Console.SetCursorPosition(Left + 1 + column * 3, Top + 5 + row * 2);
        Console.Write("    ");
    }
    DateTime FirstDayOfMonth(DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1);
    }
    DateTime LastDayOfMonth(DateTime date)
    {
        return FirstDayOfMonth(date.AddMonths(1)).AddDays(-1);
    }
    public DateTime GetDate()
    {
        int oldLeft = Console.CursorLeft, oldTop = Console.CursorTop;
        bool cursorVisible = Console.CursorVisible;
        Console.CursorVisible = false;
        ConsoleKeyInfo key;
        do
        {
            Console.SetCursorPosition(oldLeft, oldTop);
            key = Console.ReadKey();
            DateTime newDate = SelectedDate;
            if (key.Key == ConsoleKey.RightArrow) newDate = SelectedDate.AddDays(1);
            if (key.Key == ConsoleKey.LeftArrow) newDate = SelectedDate.AddDays(-1);
            if (key.Key == ConsoleKey.DownArrow) newDate = SelectedDate.AddDays(7);
            if (key.Key == ConsoleKey.UpArrow) newDate = SelectedDate.AddDays(-7);
            if (newDate != SelectedDate)
            {
                EraseCursor();
                bool changeMonth = newDate.Month != SelectedDate.Month;
                SelectedDate = newDate;
                if (changeMonth) ShowMonth();
                ShowCursor();
            }
        }
        while (key.Key != ConsoleKey.Enter);
        Console.CursorVisible = cursorVisible;
        Console.SetCursorPosition(oldLeft, oldTop);
        return SelectedDate;
    }
}

Использовать можно так:

        ConsoleDatePicker cdp = new ConsoleDatePicker(5, 5);
        cdp.Show();
        DateTime date = cdp.GetDate();
        Console.WriteLine("Вы выбрали {0:d}", date);

READ ALSO
Скрытие progressBar при асинхронной загрузке MVP

Скрытие progressBar при асинхронной загрузке MVP

Здравствуйте, пытаюсь реализовать паттерн MVP на примере приложения Windows FormВозникла проблема с асинхронной загрузки данных при загрузке формы

223
Чтение VM-свойства за пределами VM

Чтение VM-свойства за пределами VM

Имеется класс Action, который представляет собой некое действиеЭто действие также может содержать коллекцию вложенных действий ChildAction

264
C# xml в цикле for

C# xml в цикле for

Помогите разобраться с циклом и xmlЭто мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников

213