public override ParsedNationalIdentifierData Parse(string nationalIdentifier)
        {
            ParsedNationalIdentifierData parsedObj = new ParsedNationalIdentifierData();

            if (nationalIdentifier == null || !NationalIdentifierWhitelistValidator.IsMatch(nationalIdentifier))
            {
                return(parsedObj);
            }

            // nationalIdentifier should contain the following format DDMMYYCZZZQ since it passed the Regex validation
            var birthYear        = int.Parse(nationalIdentifier.Substring(4, 2));
            var centuarySign     = nationalIdentifier.Substring(6, 1)[0];
            var yearhWithCentury = ExtractYearhWithCentury(birthYear, centuarySign);
            var month            = int.Parse(nationalIdentifier.Substring(2, 2));
            var day = int.Parse(nationalIdentifier.Substring(0, 2));

            parsedObj.Valid = IsValidDate(yearhWithCentury, month, day) && HasValidControlDigit(nationalIdentifier);
            if (parsedObj.Valid)
            {
                var rollingId = nationalIdentifier.Substring(7, 3);
                parsedObj.Gender = int.Parse(rollingId) % 2 == 1 ? Gender.MALE : Gender.FEMALE;
                var birthday = new DateTime(yearhWithCentury, month, day);
                parsedObj.DateOfBirth = birthday;
                parsedObj.AgeInYears  = GetAge(birthday);
            }


            return(parsedObj);
        }
        public override ParsedNationalIdentifierData Parse(string nationalIdentifier)
        {
            ParsedNationalIdentifierData parsedObj = new ParsedNationalIdentifierData();

            if (nationalIdentifier == null)
            {
                return(parsedObj);
            }

            var isTemporary = false;

            if (!NationalIdentifierWhitelistValidator.IsMatch(nationalIdentifier))
            {
                if (!TemporaryNationalIdentifierWhitelistValidator.IsMatch(nationalIdentifier))
                {
                    return(parsedObj);
                }

                isTemporary = true;
            }

            // valueToCheck should have format: DDMMYYZZZQQ
            var valueToCheck     = nationalIdentifier.Replace("-", string.Empty);
            var year             = int.Parse(valueToCheck.Substring(4, 2));
            var serialNumber     = int.Parse(valueToCheck.Substring(6, 3));
            var yearhWithCentury = ExtractYearhWithCentury(year, serialNumber);

            if (yearhWithCentury < 0)
            {
                return(parsedObj);
            }

            var month = int.Parse(valueToCheck.Substring(2, 2));
            var day   = int.Parse(valueToCheck.Substring(0, 2));

            if (isTemporary)
            {
                day -= 40;                 // 40 is added to the day of temporary numbers so subtract away it
            }
            parsedObj.Valid = IsValidDate(yearhWithCentury, month, day) && HasValidControlDigits(valueToCheck);
            if (parsedObj.Valid)
            {
                //the last digit of the sequence number is odd for males and even for females.
                parsedObj.Gender = serialNumber % 2 == 1 ? Gender.MALE : Gender.FEMALE;

                var birthday = new DateTime(yearhWithCentury, month, day);
                parsedObj.DateOfBirth = birthday;
                parsedObj.AgeInYears  = GetAge(birthday);
            }

            return(parsedObj);
        }
        public override ParsedNationalIdentifierData Parse(string nationalIdentifier)
        {
            ParsedNationalIdentifierData parsedObj = new ParsedNationalIdentifierData();

            if (nationalIdentifier == null)
            {
                return(parsedObj);
            }

            var isTemporary = false;

            if (!NationalIdentifierWhitelistValidator.IsMatch(nationalIdentifier))
            {
                if (!TemporaryNationalIdentifierWhitelistValidator.IsMatch(nationalIdentifier))
                {
                    return(parsedObj);
                }

                isTemporary = true;
            }

            var hasPlusSign      = nationalIdentifier.Contains("+");
            var valueToCheck     = nationalIdentifier.Replace("-", string.Empty).Replace("+", string.Empty);
            var yearhWithCentury = ExtractYearhWithCentury(valueToCheck, hasPlusSign);

            // Since we no longer need centuary information remove it if it existed
            if (valueToCheck.Length == 12)
            {
                valueToCheck = valueToCheck.Substring(2);
            }

            // valueToCheck should contain the following format YYMMDDNNNC
            var month = int.Parse(valueToCheck.Substring(2, 2));
            var day   = int.Parse(valueToCheck.Substring(4, 2));

            if (isTemporary)
            {
                day -= 60;                 // 60 is added to the day of temporary numbers so subtract away it
            }
            // birthnumber even: female, odd: male
            parsedObj.Valid = IsValidDate(yearhWithCentury, month, day) && HasValidControlDigit(valueToCheck);
            if (parsedObj.Valid)
            {
                var rollingId = nationalIdentifier.Substring(nationalIdentifier.Length - 4);
                parsedObj.Gender = int.Parse(rollingId) % 2 == 1 ? Gender.MALE : Gender.FEMALE;
                var birthday = new DateTime(yearhWithCentury, month, day);
                parsedObj.DateOfBirth = birthday;
                parsedObj.AgeInYears  = GetAge(birthday);
            }

            return(parsedObj);
        }
        public override ParsedNationalIdentifierData Parse(string nationalIdentifier)
        {
            ParsedNationalIdentifierData parsedObj = new ParsedNationalIdentifierData();

            parsedObj.Valid = IsValid(nationalIdentifier);

            if (parsedObj.Valid)
            {
                parsedObj.Gender = Gender.UNKNOWN;
                var valueToCheck = nationalIdentifier;
                // valueToCheck should contain the following format DD.MM.YYYY
                var day              = int.Parse(valueToCheck.Substring(0, 2));
                var month            = int.Parse(valueToCheck.Substring(3, 2));
                var yearhWithCentury = int.Parse(valueToCheck.Substring(6, 4));
                var birthday         = new DateTime(yearhWithCentury, month, day);
                parsedObj.DateOfBirth = birthday;
                parsedObj.AgeInYears  = GetAge(birthday);
            }

            return(parsedObj);
        }