|
@@ -6,20 +6,27 @@ using System.Globalization;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Security.Cryptography;
|
|
|
+using System.Text;
|
|
|
+using System.Text.RegularExpressions;
|
|
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
|
|
|
|
namespace AvaloniaApplication5
|
|
|
{
|
|
|
public partial class MainWindow : Window
|
|
|
{
|
|
|
- string date = "";
|
|
|
- DateTime currentDate = DateTime.Now;
|
|
|
+ string date = ""; //Строка даты, которую будет вводить пользователь
|
|
|
+ DateTime currentDate = DateTime.Now; //Текущая дата
|
|
|
|
|
|
public MainWindow()
|
|
|
{
|
|
|
InitializeComponent();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Событие обработчик нажатия на кнопку "Проверить дату".
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="sender"></param>
|
|
|
+ /// <param name="e"></param>
|
|
|
private void Button_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
|
{
|
|
|
date = dp.SelectedDate.ToString();
|
|
@@ -35,11 +42,13 @@ namespace AvaloniaApplication5
|
|
|
int days = difference.Days % 365 % 30;
|
|
|
List<string> leadYears = new List<string>();
|
|
|
DayOfWeek dayOfWeek = (DayOfWeek)(dt.DayOfWeek);
|
|
|
+ string dayOfWeekPreview = CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(dayOfWeek);
|
|
|
+ CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(dayOfWeek);
|
|
|
tbMessage.Text = $"С дня рождения прошло {years} г. {months} мес. {days} дн. \n" +
|
|
|
- $"Вы родились в {dayOfWeek}\n" +
|
|
|
- $"В {dayOfWeek} вы отпраздновали день рождения {GetNumberDayAfterDate(dt, currentDate, dayOfWeek)} раз\n"
|
|
|
- + $"Високосных лет прошло: {GetCountLeapYear(dt, ref leadYears)}\n" +
|
|
|
- $"А конкретно: { string.Join(",", leadYears)} ";
|
|
|
+ $"Вы родились в {dayOfWeekPreview}\n" +
|
|
|
+ $"В {dayOfWeekPreview} вы отпраздновали день рождения {GetNumberDayAfterDate(dt, currentDate, dayOfWeek)} раз\n"
|
|
|
+ + $"Високосных лет прошло: {GetCountLeapYear(dt, ref leadYears)}\n" +
|
|
|
+ $"А конкретно: {string.Join(",", leadYears)} ";
|
|
|
sbVivibleZodiack.IsVisible = true;
|
|
|
}
|
|
|
else tbMessage.Text = $"Вы не могли родиться позже текущей даты";
|
|
@@ -47,6 +56,13 @@ namespace AvaloniaApplication5
|
|
|
else tbMessage.Text = $"Вы не выбрали дату";
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Получение количества дней рождения, которые отпраздновал пользователь в конкретный день недели за всю свою жизнь
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dateBirth">Дата рождения</param>
|
|
|
+ /// <param name="now">Текущая дата</param>
|
|
|
+ /// <param name="dayOfWeek">День недели</param>
|
|
|
+ /// <returns>Количество дней рождения определенного дня недели</returns>
|
|
|
int GetNumberDayAfterDate(DateTime dateBirth, DateTime now, DayOfWeek dayOfWeek)
|
|
|
{
|
|
|
int count = 0;
|
|
@@ -55,13 +71,19 @@ namespace AvaloniaApplication5
|
|
|
DateTime date = new DateTime(i, dateBirth.Month, dateBirth.Day);
|
|
|
if (date.DayOfWeek == dayOfWeek) count++;
|
|
|
}
|
|
|
- if(now.Month > dateBirth.Month && now.Day > dateBirth.Day)
|
|
|
+ if (now.Month > dateBirth.Month && now.Day > dateBirth.Day)
|
|
|
{
|
|
|
count--;
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Получение количества високосных лет, прошедших с конкретной даты
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dateBirth">дата</param>
|
|
|
+ /// <param name="leapYears">лист строк високосных лет</param>
|
|
|
+ /// <returns>количество високосных лет</returns>
|
|
|
int GetCountLeapYear(DateTime dateBirth, ref List<string> leapYears)
|
|
|
{
|
|
|
int count = 0;
|
|
@@ -71,7 +93,7 @@ namespace AvaloniaApplication5
|
|
|
DateTime current = new DateTime(i, 12, 31);
|
|
|
if (current.DayOfYear == 366)
|
|
|
{
|
|
|
- count++;
|
|
|
+ count++;
|
|
|
leapYears.Add(current.Year.ToString());
|
|
|
}
|
|
|
}
|
|
@@ -110,100 +132,159 @@ namespace AvaloniaApplication5
|
|
|
int razn = dt.Year - 1894;
|
|
|
tbGoroscope.Text = $"Вы родились в год животного: {ShowAnimal((razn % 12) + 1)}, цвета: {ShowColor((razn % 10) + 1)}";
|
|
|
}
|
|
|
- if(selectedItemCB.Content == "Не хочу") tbGoroscope.Text = $"Не хотите? Ну и не надо";
|
|
|
+ if (selectedItemCB.Content == "Не хочу") tbGoroscope.Text = $"Не хотите? Ну и не надо";
|
|
|
}
|
|
|
else tbGoroscope.Text = $"Дата не выбрана";
|
|
|
}
|
|
|
+
|
|
|
private void Read_File(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
|
{
|
|
|
+ tbFile.IsVisible = true;
|
|
|
if (File.Exists("users.csv"))
|
|
|
{
|
|
|
List<InfoForGadalka> listInfo = new List<InfoForGadalka>();
|
|
|
- using (StreamReader sr = new StreamReader("users.csv"))
|
|
|
+
|
|
|
+ try
|
|
|
{
|
|
|
- try
|
|
|
+ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //Необходимо к нему обратиться, чтобы считать из кодировки 1251
|
|
|
+ using (StreamReader sr = new StreamReader("users.csv", Encoding.GetEncoding(1251)))
|
|
|
{
|
|
|
+ sr.ReadLine();
|
|
|
while (!sr.EndOfStream)
|
|
|
{
|
|
|
- string line = sr.ReadLine();
|
|
|
- string[] lineArray = line.Split(';');
|
|
|
+ string dateString = sr.ReadLine();
|
|
|
+ string[] lineArray = Regex.Split(dateString, @"[,;\t\s]{1}");
|
|
|
+ lineArray[0] = GetNumberDayByName(lineArray[0]);
|
|
|
+ lineArray[1] = GetNumberMonthByName(lineArray[1]);
|
|
|
string zodiac = "";
|
|
|
string horoscope = "";
|
|
|
- if (lineArray[0] != "" || lineArray[1] != "")
|
|
|
+ string message = "";
|
|
|
+ if (lineArray[0] == "" || lineArray[1] == "") zodiac = "Невозможно определить";
|
|
|
+ if (lineArray[2] == "") horoscope = "Невозможно определить";
|
|
|
+ // Пытаемся прочитать дату
|
|
|
+ if (TryParseDate(string.Join(" ", lineArray), out DateTime date))
|
|
|
{
|
|
|
- zodiac = "Невозможно определить";
|
|
|
+ int razn = date.Year - 1894;
|
|
|
+ zodiac = GetZodiack(date);
|
|
|
+ horoscope = ShowAnimal((razn % 12) + 1);
|
|
|
+ message = "Успешно";
|
|
|
}
|
|
|
- if (lineArray[2] != "")
|
|
|
+ else
|
|
|
{
|
|
|
- horoscope = "Невозможно определить";
|
|
|
+ message = "Некорректная дата";
|
|
|
}
|
|
|
- InfoForGadalka info = new InfoForGadalka(lineArray[0], lineArray[1], lineArray[2], zodiac, horoscope);
|
|
|
+ InfoForGadalka info = new InfoForGadalka(lineArray[0], lineArray[1], lineArray[2], zodiac, horoscope, message);
|
|
|
listInfo.Add(info);
|
|
|
}
|
|
|
- }
|
|
|
- catch(Exception ex)
|
|
|
+ }
|
|
|
+ using (StreamWriter sw = new StreamWriter("usersResult.csv", false, Encoding.UTF8))
|
|
|
{
|
|
|
-
|
|
|
+ sw.WriteLine("День;Месяц;Год;Знак зодиака;Восточный гороскоп;Сообщение");
|
|
|
+ foreach (InfoForGadalka info in listInfo)
|
|
|
+ {
|
|
|
+ sw.WriteLine($"{info.Day};{info.Month};{info.Year};{info.Zodiac};{info.Horoscope};{info.Message}");
|
|
|
+ }
|
|
|
}
|
|
|
- };
|
|
|
+ tbFile.Text = "Результат сохранен в файле usersResult.csv";
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ tbFile.Text = $"Ошибка при работе с файлом: {ex.Message}";
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //ShowMessage.Text = "Файл users.csv не найден";
|
|
|
+ tbFile.Text = "Файл users.csv не найден";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static bool TryParseDate(string dateString, out DateTime date)
|
|
|
+ {
|
|
|
+ date = DateTime.MinValue;
|
|
|
+ string[] formats = {
|
|
|
+ "dd.MM.yyyy", // 15.02.1949
|
|
|
+ "d.MM.yyyy", // 4.09.1999
|
|
|
+ "dd.M.yyyy", // 15.2.1949
|
|
|
+ "d.M.yyyy", // 4.9.1999
|
|
|
+ "d MMMM yyyy", // 2 октябрь 2005
|
|
|
+ "D MMMM yyyy",
|
|
|
+ "dd MMMM yyyy",
|
|
|
+ "ddd MMMM yyyy",
|
|
|
+ "dddd MMMM yyyy",
|
|
|
+ "d MMMM yyyy", // 2 октября 2005 (с учетом возможного окончания месяца)
|
|
|
+ "MMMM d yyyy", // Октябрь 2 2005
|
|
|
+ "MMMM d yyyy", // Октября 2 2005 (с учетом возможного окончания месяца)
|
|
|
+ "dd MM yyyy", // 11 11 2005
|
|
|
+ "d MM yyyy", // 11 11 2005
|
|
|
+ "d M yyyy", // 11 11 2005
|
|
|
+ "MM yyyy", // 4 1689
|
|
|
+ "yyyy", // 1999
|
|
|
+ };
|
|
|
+ foreach (string format in formats)
|
|
|
+ {
|
|
|
+ if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ static string GetNumberDayByName(string day)
|
|
|
+ {
|
|
|
+ string[] days = { "первое", "второе", "третье", "четвертое", "пятое", "шестое", "седьмое", "восьмое", "девятое", "десятое",
|
|
|
+ "одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", "пятнадцатое", "шестнадцатое", "семнадцатое", "восемнадцатое", "девятнадцатое", "двадцатое",
|
|
|
+ "двадцать первое", "двадцать второе", "двадцать третье", "двадцать четвертое", "двадцать пятое", "двадцать шестое", "двадцать седьмое", "двадцать восьмое", "двадцать девятое", "тридцатое",
|
|
|
+ "тридцать первое"
|
|
|
+ };
|
|
|
+ int index = Array.IndexOf(days, day);
|
|
|
+ if (index != -1) return index.ToString();
|
|
|
+ return day;
|
|
|
+ }
|
|
|
+
|
|
|
+ static string GetNumberMonthByName(string number)
|
|
|
+ {
|
|
|
+ string[] month = { "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь" };
|
|
|
+ int index = Array.IndexOf(month, number);
|
|
|
+ if (index != -1) return index.ToString();
|
|
|
+ return number;
|
|
|
}
|
|
|
|
|
|
static string ShowColor(int n)
|
|
|
{
|
|
|
- switch (n)
|
|
|
+ string[] colors = { "Зеленый", "Зеленый", "Красный", "Красный", "Желтый", "Желтый", "Белый", "Белый", "Черный", "Черный" };
|
|
|
+ if (n > 0 && n < colors.Length)
|
|
|
{
|
|
|
- case 1: return "Зеленый";
|
|
|
- case 2: return ("Зеленый");
|
|
|
- case 3: return ("Красный");
|
|
|
- case 4: return ("Красный");
|
|
|
- case 5: return ("Желтый");
|
|
|
- case 6: return ("Желтый");
|
|
|
- case 7: return ("Белый");
|
|
|
- case 8: return ("Белый");
|
|
|
- case 9: return ("Черный");
|
|
|
- case 10: return ("Черный");
|
|
|
+ return colors[n - 1];
|
|
|
}
|
|
|
return "Такого нет";
|
|
|
}
|
|
|
+
|
|
|
static string ShowAnimal(int n)
|
|
|
{
|
|
|
- switch (n)
|
|
|
+ string[] animals = { "Лошадь", "Овца", "Обезьяна", "Петух", "Собака", "Свинья", "Крыса", "Бык", "Тигр", "Кролик", "Дракон", "Змея" };
|
|
|
+ if (n > 0 && n < animals.Length)
|
|
|
{
|
|
|
- case 1: return ("Лошадь");
|
|
|
- case 2: return ("Овца");
|
|
|
- case 3: return ("Обезьяна");
|
|
|
- case 4: return ("Петух");
|
|
|
- case 5: return ("Собака");
|
|
|
- case 6: return ("Свинья");
|
|
|
- case 7: return ("Крыса");
|
|
|
- case 8: return ("Бык");
|
|
|
- case 9: return ("Тигр");
|
|
|
- case 10: return ("Кролик");
|
|
|
- case 11: return ("Дракон");
|
|
|
- case 12: return ("Змея");
|
|
|
+ return animals[n - 1];
|
|
|
}
|
|
|
return "Такого нет";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class InfoForGadalka(string day, string month, string year, string zodiac, string horoscope)
|
|
|
+ class InfoForGadalka(string day, string month, string year, string zodiac, string horoscope, string message)
|
|
|
{
|
|
|
string day = day;
|
|
|
string month = month;
|
|
|
string year = year;
|
|
|
string zodiac = zodiac;
|
|
|
string horoscope = horoscope;
|
|
|
+ string message = message;
|
|
|
|
|
|
public string Day { get => day; set => day = value; }
|
|
|
public string Month { get => month; set => month = value; }
|
|
|
public string Year { get => year; set => year = value; }
|
|
|
public string Zodiac { get => zodiac; set => zodiac = value; }
|
|
|
public string Horoscope { get => horoscope; set => horoscope = value; }
|
|
|
-
|
|
|
+ public string Message { get => message; set => message = value; }
|
|
|
}
|
|
|
}
|