guneysus
7/3/2017 - 10:48 AM

AsElasticFormatDateTimeExtensions.cs

using System;
using System.Globalization;

namespace Helpers.Datetime
{
    public static class DateTimeExtensions
    {
        public static string AsElasticFormat(this DateTime? self, string formatName)
        {
            /*
            https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html

            epoch_millis                        : ToEpochMiliseconds
            epoch_second                        : ToEpochSeconds
            date_optional_time                  : "yyyy-MM-dd"
            strict_date_optional_time           : "yyyy-MM-dd"
            basic_date                          : "yyyyMMdd"
            basic_date_time                     : "yyyyMMddTHHmmss.SSSZ"
            basic_date_time_no_millis           : "yyyyMMddTHHmmssZ"
            basic_ordinal_date                  : "yyyyDDD"
            basic_ordinal_date_time             : "yyyyDDDTHHmmss.SSSZ"
            basic_ordinal_date_time_no_millis   : "yyyyDDDTHHmmssZ"
            basic_time                          : "HHmmss.SSSZ"
            basic_time_no_millis                : "HHmmssZ"
            basic_t_time                        : ...
            date_hour_minute_second             : "yyyy-MM-ddTHH:mm:ss"
            */
            if (self == null) throw new ArgumentNullException(paramName: nameof(self));
            switch (formatName)
            {
                case null:
                    throw new ArgumentNullException(paramName: nameof(formatName));
                case "date_hour_minute_second":
                    return self.AsString(format: "yyyy-MM-ddTHH:mm:ss");
            }

            throw new NotImplementedException();
        }

        public static double ToEpochMiliseconds(this DateTime? self)
        {
            if (self != null)
                return Normalize(self: self.Value)
                    .Subtract(value: new
                        DateTime(year: 1970, month: 1, day: 1, hour: 0, minute: 0, second: 0, kind: self.Value.Kind))
                    .TotalMilliseconds;

            throw new ArgumentNullException(paramName: nameof(self));
        }


        public static double ToEpochSeconds(this DateTime? self)
        {
            if (self != null)
                return Normalize(self: self.Value)
                    .Subtract(value: new
                        DateTime(year: 1970, month: 1, day: 1, hour: 0, minute: 0, second: 0, kind: self.Value.Kind))
                    .TotalSeconds;

            throw new ArgumentNullException(paramName: nameof(self));
        }

        public static string AsString(this DateTime? self, string format, CultureInfo cultureInfo)
        {
            if (self != null) return Normalize(self: self.Value).ToString(format: format, provider: cultureInfo);
            throw new ArgumentNullException(paramName: nameof(self));
        }

        public static string AsString(this DateTime? self, string format)
        {
            if (self != null) return Normalize(self: self.Value).ToString(format: format);
            throw new ArgumentNullException(paramName: nameof(self));
        }

        private static DateTime Normalize(DateTime self)
        {
            var value = self.Kind == DateTimeKind.Unspecified
                ? DateTime.SpecifyKind(value: self, kind: DateTimeKind.Local)
                : self.Kind == DateTimeKind.Local ? self.ToLocalTime() : self.ToUniversalTime();
            return value;
        }

        public static string AsString(this DateTime? self, IFormatProvider formatProvider)
        {
            if (self == null) throw new ArgumentNullException(paramName: nameof(self));
            var value = self.Value.Kind == DateTimeKind.Utc
                ? self.Value.ToUniversalTime()
                : self.Value.ToLocalTime();

            return value.ToString(provider: formatProvider);
        }

        public static DateTime ToDateTime(this string s,
            string format = "ddMMyyyy", string cultureString = "tr-TR")
        {
            var r = DateTime.ParseExact(
                s: s,
                format: format,
                provider: CultureInfo.GetCultureInfo(name: cultureString));
            return r;
        }

        public static DateTime ToDateTime(this string s,
            string format, CultureInfo culture)
        {
            var r = DateTime.ParseExact(s: s, format: format,
                provider: culture);
            return r;
        }
    }
}
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace PlateHelpers
{
    public static class PlateValidate
    {
        const string REGEX_4DIGITS = @"(?!0000)[0-9]{4}"; // http://stackoverflow.com/a/9074266/1766716
        const string REGEX_3DIGITS = @"0\.[0-9]{3}"; // http://stackoverflow.com/a/28056964/1766716
        const string REGEX_2DIGITS = @"0?[1-9]|[1-9][0-9]"; // http://stackoverflow.com/a/4013014/1766716
        const string REGEX_DIGITS = @"[1-9]";

        const string REGEX_WORD = @"\w{1,3}";
        const string REGEX_VALID_PLATE = @"^(0?[1-9]|[1-9][0-9])([a-zA-Z]{1,4})((?!0000)[0-9]{4}|((?!000)[0-9]{3})|(?!00)[0-9]{2}|((?!0)[0-9]{1}))$";

        public readonly static string pattern;

        public static bool IsValid (string plate) {
            return Regex.Match(input: plate, pattern: REGEX_VALID_PLATE, options: RegexOptions.IgnoreCase).Success;
        }

        static PlateValidate () {
            // Sıra önemli. Önce 
            // { REGEX_DIGITS}|{ REGEX_3DIGITS}
            // derseniz 9999'u 9 olarak yakalıyor.
            pattern = @"^(\d{2})([a-zA-Z]{1,4})(\d{1,4})$";
        }

        public enum Country {
            TR,
            ADB
        }

        public static IList<Match> Matches(string plateNumber) {
            var matches = new List<Match>();
            foreach ( Match match in Regex.Matches(input: plateNumber, pattern: pattern, options: RegexOptions.None) ) {
                matches.Add(match);
            }
            return matches;
        }

        public static string FormatPlate(string plate, Country country) {
            string formatted = "?";

            GroupCollection groups = null;
            switch ( country ) {
                case Country.TR:
                    var matches = Matches(plate);
                    if (matches.Count > 0){
                        groups = matches [0].Groups;
                        string a = groups [1].Value, b = groups [2].Value, c = groups [3].Value;
                        formatted = $"{a} {b} {c}";
                    }

                    break;
                case Country.ADB:
                    break;
                default:
                    break;
            }

            return formatted;
        }
    }
}