private DateCalendarType GuessCalendarType(int yearNumber)
        {
            DateTime today       = DateTime.Today;
            int      gregYear    = today.Year;
            int      jalaliYear  = (new PersianCalendarEx(today)).GetYear();
            int      ghamariYear = (new HijriCalendarEx(today)).GetYear();

            int minYearDiff = Math.Abs(yearNumber - gregYear);
            DateCalendarType minCalendarType = DateCalendarType.Gregorian;

            int curDiff = Math.Abs(yearNumber - jalaliYear);

            if (curDiff < minYearDiff)
            {
                minYearDiff     = curDiff;
                minCalendarType = DateCalendarType.Jalali;
            }

            curDiff = Math.Abs(yearNumber - ghamariYear);

            if (curDiff < minYearDiff)
            {
                minYearDiff     = curDiff;
                minCalendarType = DateCalendarType.HijriGhamari;
            }

            return(minCalendarType);
        }
예제 #2
0
        /// <summary>
        /// Gets a date description string from the specified values and calendar types.
        /// The string is a descriptive statement in Persian Language.
        /// </summary>
        /// <param name="t">The type of calendar.</param>
        /// <param name="w">The day of the week.</param>
        /// <param name="dayNumber">The day of the month.</param>
        /// <param name="monthNum">The month number.</param>
        /// <param name="yearNum">The year number.</param>
        /// <returns></returns>
        public static string GetPersianDateString(DateCalendarType t, Weekdays w, int dayNumber, int monthNum, int yearNum)
        {
            string strWeekday = GetPersianWeekdayName(w);
            string strMonth   = "";

            switch (t)
            {
            case DateCalendarType.Gregorian:
                strMonth = GetPersianGregorianMonthName(monthNum);
                break;

            case DateCalendarType.Jalali:
                strMonth = GetPresianJalaliMonthName(monthNum);
                break;

            case DateCalendarType.HijriGhamari:
                strMonth = GetPersianGhamariMonthName(monthNum);
                break;
            }

            string day = "";

            if (0 < dayNumber && dayNumber < 35)
            {
                day = NumberToPersianString.ToString(dayNumber);
            }

            string year = "";

            if (0 <= yearNum)
            {
                year = NumberToPersianString.ToString(yearNum);
            }

            StringBuilder sb = new StringBuilder();

            if (strWeekday.Length > 0)
            {
                sb.Append(strWeekday + " ");
            }
            if (day.Length > 0)
            {
                sb.Append(day + " ");
            }
            if (strMonth.Length > 0)
            {
                sb.Append(strMonth + " ");
            }
            if (year.Length > 0)
            {
                sb.Append(year + " ");
            }

            return(sb.ToString().Trim());
        }
예제 #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="EnglishDatePatternInfo"/> class.
 /// </summary>
 /// <param name="content">The m_content.</param>
 /// <param name="index">The m_index.</param>
 /// <param name="length">The length of the pattern found.</param>
 /// <param name="t">The type of the calendar.</param>
 /// <param name="w">The day of the week.</param>
 /// <param name="dayNo">The day number (in month).</param>
 /// <param name="monthNo">The month number.</param>
 /// <param name="yearNo">The year number.</param>
 public EnglishDatePatternInfo(string content, int index, int length, DateCalendarType t, Weekdays w, int dayNo, int monthNo, int yearNo)
 {
     m_content     = content;
     m_index       = index;
     m_length      = length;
     m_calType     = t;
     m_weekday     = w;
     m_dayNumber   = dayNo;
     m_monthNumber = monthNo;
     m_yearNumber  = yearNo;
 }
예제 #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PersianDatePatternInfo"/> class.
 /// </summary>
 /// <param name="content">The content.</param>
 /// <param name="index">The index.</param>
 /// <param name="length">The length of the found pattern.</param>
 /// <param name="t">The calendar type.</param>
 /// <param name="w">The day of the week.</param>
 /// <param name="dayNo">The day number (in month).</param>
 /// <param name="monthNo">The month number.</param>
 /// <param name="yearNo">The year number.</param>
 public PersianDatePatternInfo(string content, int index, int length, DateCalendarType t, Weekdays w, int dayNo, int monthNo, int yearNo)
 {
     this.content     = content;
     this.index       = index;
     this.length      = length;
     this.calType     = t;
     this.weekday     = w;
     this.dayNumber   = dayNo;
     this.monthNumber = monthNo;
     this.yearNumber  = yearNo;
 }
        private DateCalendarType GuessCalendarTypeAndAddPossibleYearNumbers(int yearNumber)
        {
            DateTime today       = DateTime.Today;
            int      gregYear    = today.Year;
            int      jalaliYear  = (new PersianCalendarEx(today)).GetYear();
            int      ghamariYear = (new HijriCalendarEx(today)).GetYear();

            int minYearDiff = Math.Abs(yearNumber - gregYear);
            DateCalendarType minCalendarType = DateCalendarType.Gregorian;

            int curDiff = Math.Abs(yearNumber - jalaliYear);

            if (curDiff < minYearDiff)
            {
                minYearDiff     = curDiff;
                minCalendarType = DateCalendarType.Jalali;
            }

            curDiff = Math.Abs(yearNumber - ghamariYear);

            if (curDiff < minYearDiff)
            {
                minYearDiff     = curDiff;
                minCalendarType = DateCalendarType.HijriGhamari;
            }

            if (yearNumber < 100)
            {
                // IT's better not to guess ghamari calendar
                //curDiff = Math.Abs(1400 + yearNumber - ghamariYear);
                //if (curDiff < minYearDiff)
                //{
                //    minYearDiff = curDiff;
                //    minCalendarType = DateCalendarType.HijriGhamari;
                //}

                curDiff = Math.Abs(1300 + yearNumber - jalaliYear);
                if (curDiff < minYearDiff)
                {
                    minYearDiff     = curDiff;
                    minCalendarType = DateCalendarType.Jalali;
                }

                curDiff = Math.Abs(2000 + yearNumber - gregYear);
                if (curDiff < minYearDiff)
                {
                    minYearDiff     = curDiff;
                    minCalendarType = DateCalendarType.Gregorian;
                }
            }

            return(minCalendarType);
        }
        private void AddPossibleYearNumbers(int yearNumber, DateCalendarType calendarType)
        {
            comboYearNumber.Items.Clear();
            if (yearNumber <= 0)
            {
                return;
            }

            if (yearNumber < 100)
            {
                int newYear = yearNumber;
                switch (calendarType)
                {
                case DateCalendarType.Gregorian:
                    if ((2000 - (1900 + yearNumber)) < ((2000 + yearNumber) - 2000))
                    {
                        newYear += 1900;
                    }
                    else
                    {
                        newYear += 2000;
                    }
                    break;

                case DateCalendarType.HijriGhamari:
                    newYear += 1400;
                    break;

                case DateCalendarType.Jalali:
                    newYear += 1300;
                    break;

                default:
                    break;
                }

                comboYearNumber.Items.Add(ParsingUtils.ConvertNumber2Persian(newYear.ToString()));

                comboYearNumber.Visible = true;
                comboYearNumber.Enabled = true;
            }

            comboYearNumber.Items.Add(ParsingUtils.ConvertNumber2Persian(yearNumber.ToString()));

            comboYearNumber.SelectedIndex = 0;
        }
        private ListViewItem[] CreateNumericDateSuggestions(NumericDatePatternInfo pi)
        {
            if (pi == null)
            {
                return(new ListViewItem[0]);
            }

            m_originalYearNumber = pi.YearNumber;

            DateCalendarType calType = GuessCalendarTypeAndAddPossibleYearNumbers(pi.YearNumber);

            AddPossibleYearNumbers(pi.YearNumber, calType);

            ListViewItem[] items = CreateGeneralDateSuggestions(
                new NumericDatePatternInfo(pi.Content, pi.Index, pi.Length, pi.DayNumber, pi.MonthNumber, GetSelectedYearNumber()),
                calType);

            cmboGuessedCalendarType.Enabled = true;
            return(items);
        }
예제 #8
0
        /// <summary>
        /// Parses and extracts information from the found regex match object
        /// containing an English date.
        /// The parsed pattern info is returned, and null is returned if
        /// the Match does not contain valid data.
        /// </summary>
        /// <param name="m">The regex match object to be parsed.</param>
        /// <returns></returns>
        private EnglishDatePatternInfo ExtractFromEnglishDate(Match m)
        {
            Weekdays weekday  = Weekdays.Illeagal;
            int      dayNum   = -1;
            int      monthNum = -1;
            int      yearNum  = -1;

            weekday  = ExtractWeekday(m);
            dayNum   = ExtractDayNum(m);
            monthNum = ExtractMonthNum(m);

            DateCalendarType ct = DateCalendarType.Illegal;

            if (1 <= monthNum && monthNum <= 12)
            {
                ct = DateCalendarType.Jalali;
            }
            else if (13 <= monthNum && monthNum <= 24)
            {
                ct        = DateCalendarType.Gregorian;
                monthNum -= 12;
            }
            else if (25 <= monthNum && monthNum <= 36)
            {
                ct        = DateCalendarType.HijriGhamari;
                monthNum -= 24;
            }
            else
            {
                ct = DateCalendarType.Illegal;
            }

            yearNum = ExtractYearNum(m);

            return(new EnglishDatePatternInfo(m.Value, m.Index, m.Length, ct, weekday, dayNum, monthNum, yearNum));
        }
        private ListViewItem[] CreateGeneralDateSuggestions(NumericDatePatternInfo pi, DateCalendarType calendarType)
        {
            if (pi == null)
            {
                return(new ListViewItem[0]);
            }

            currentNumericDatePatternInfo = pi;

            List <ListViewItem> lstSug = new List <ListViewItem>();

            if (pi.YearNumber >= 0 && pi.DayNumber > 0 && pi.MonthNumber > 0)
            {
                if (calendarType == DateCalendarType.Jalali)
                {
                    try
                    {
                        cmboGuessedCalendarType.SelectedIndex = 0;

                        PersianCalendarEx pc = new PersianCalendarEx(pi.YearNumber, pi.MonthNumber, pi.DayNumber);
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(pc.ToString()), UIDateTypes.NumericalPersian, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(pc.ToString(), UIDateTypes.NumericalEnglish, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(pc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Jalali));

                        DateTime dt = pc.DateTime;
                        lstSug.Add(CreateListViewItem(CalendarStringUtils.GetPersianDateString(dt), UIDateTypes.Literal, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(dt.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(dt.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Gregorian));

                        HijriCalendarEx hc = new HijriCalendarEx(pc.DateTime);
                        lstSug.Add(CreateListViewItem(hc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(hc.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(hc.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Ghamari));
                    }
                    catch { }
                }
                else if (calendarType == DateCalendarType.Gregorian)
                {
                    try
                    {
                        cmboGuessedCalendarType.SelectedIndex = 1;

                        DateTime dt = new DateTime(pi.YearNumber, pi.MonthNumber, pi.DayNumber);
                        lstSug.Add(CreateListViewItem(dt.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(dt.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(CalendarStringUtils.GetPersianDateString(dt), UIDateTypes.Literal, UIDateGroups.Gregorian));

                        PersianCalendarEx pc = new PersianCalendarEx(dt);
                        lstSug.Add(CreateListViewItem(pc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(pc.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(pc.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Jalali));

                        HijriCalendarEx hc = new HijriCalendarEx(dt);
                        lstSug.Add(CreateListViewItem(hc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(hc.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(hc.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Ghamari));
                    }
                    catch /*(Exception ex)*/ { }
                }
                else if (calendarType == DateCalendarType.HijriGhamari)
                {
                    try
                    {
                        cmboGuessedCalendarType.SelectedIndex = 2;

                        HijriCalendarEx hc = new HijriCalendarEx(pi.YearNumber, pi.MonthNumber, pi.DayNumber);
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(hc.ToString()), UIDateTypes.NumericalPersian, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(hc.ToString(), UIDateTypes.NumericalEnglish, UIDateGroups.Ghamari));
                        lstSug.Add(CreateListViewItem(hc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Ghamari));

                        DateTime dt = hc.DateTime;
                        lstSug.Add(CreateListViewItem(CalendarStringUtils.GetPersianDateString(dt), UIDateTypes.Literal, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(dt.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Gregorian));
                        lstSug.Add(CreateListViewItem(dt.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Gregorian));

                        PersianCalendarEx pc = new PersianCalendarEx(hc.DateTime);
                        lstSug.Add(CreateListViewItem(pc.ToString("D"), UIDateTypes.Literal, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(ParsingUtils.ConvertNumber2Persian(pc.ToString("d")), UIDateTypes.NumericalPersian, UIDateGroups.Jalali));
                        lstSug.Add(CreateListViewItem(pc.ToString("d"), UIDateTypes.NumericalEnglish, UIDateGroups.Jalali));
                    }
                    catch (Exception ex) { }
                }
            }

            return(lstSug.ToArray());
        }