Пишу программу в С#, которая предполагает простое анкетирование пользователей с последующем выводом данных.
Как правильно организовать в консольном приложении C# получение от пользователя данных о дате его рождения?
Сделайте метод, который в цикле опрашивает ввод, пока не будет введено правильное значение:
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();
Попробуйте так:
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]);
Всё зависит от ваших требований, если достаточно простого ручного ввода, то можно воспользоваться одним из ответов, присланных ранее.
Если вы реализуете консольный графический интерфейс, можно придумать что-то наподобие такого:
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);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, пытаюсь реализовать паттерн MVP на примере приложения Windows FormВозникла проблема с асинхронной загрузки данных при загрузке формы
Имеется класс Action, который представляет собой некое действиеЭто действие также может содержать коллекцию вложенных действий ChildAction
Используется Visual Studio 2015
Помогите разобраться с циклом и xmlЭто мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников