Exemple #1
0
        public bool ValidArea(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var d = GBT2260_2013.Singleton.GetDictionary();

            info.AreaNumber       = 71;
            info.RecognizableArea = new(71, d[71]);
            return(true);
        }
Exemple #2
0
 public bool ValidLength(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
 {
     //10 位:第一位为大写字母
     if (idNumber.Length == 10 && idNumber.IsAllNumber(9) && idNumber[0].IsLetter())
     {
         return(true);
     }
     failures.Add(new(options.ParamName, "The length of the instance must be 10."));
     return(false);
 }
Exemple #3
0
 public bool ValidBirthday(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
 {
     return(true);
 }
        public bool ValidCheckBit(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var f = idNumber[0].ToUpper(CultureInfo.InvariantCulture) - 64;
            var s = f * 8
                    + (idNumber[1] - 48) * 7
                    + (idNumber[2] - 48) * 6
                    + (idNumber[3] - 48) * 5
                    + (idNumber[4] - 48) * 4
                    + (idNumber[5] - 48) * 3
                    + (idNumber[6] - 48) * 2;
            var  x = s % 11;
            char checkBit;

            if (x == 0)
            {
                checkBit = '0';
            }
            else if (x == 1)
            {
                checkBit = 'A';
            }
            else
            {
                checkBit = (char)(11 - x + 48);
            }

            var rightBit = idNumber.Length switch
            {
                8 => idNumber[7],
                10 => idNumber[8],
                _ => char.MinValue
            };

            var @try = rightBit == checkBit;

            if (!@try)
            {
                failures.Add(new(options.ParamName, "Wrong check code."));
                return(false);
            }

            info.CheckBit = checkBit;

            return(true);
        }
 public bool ValidTheRest(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
 {
     info.Gender   = ChinaIdGender.Undefined;
     info.Sequence = idNumber.Slice(1).GetString();
     return(true);
 }
        public bool ValidArea(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var s = idNumber.Slice(0, 6);

            if (!s.IsAllNumber())
            {
                failures.Add(new(options.ParamName, "Invalid administrative area code."));
                return(false);
            }

#if NETFRAMEWORK
            var areaNumber = int.Parse(s.GetString());
#else
            var areaNumber = int.Parse(s);
#endif
            var areaInfo = __getDeepestArea(areaNumber);
            var @try     = areaInfo is not null && areaInfo.GetDepth() >= (int)options.Limit;

            info.RecognizableArea = areaInfo;
            info.AreaNumber       = areaNumber;

            if (!@try)
            {
                if (areaInfo is null)
                {
                    failures.Add(new(options.ParamName, "Invalid administrative area code."));
                }
                else
                {
                    failures.Add(new VerifyFailure(options.ParamName, $"Administrative area's level is lower than level {options.Limit}"));
                }
                return(false);
            }

            return(true);

            // ReSharper disable once InconsistentNaming
            ChinaIdAreaInfo __getDeepestArea(int iArea)
            {
                ChinaIdAreaInfo area = null, lastArea = null;
                var             d = GBT2260_2013.Singleton.GetDictionary();

                while (iArea > 0)
                {
                    if (iArea < 10)
                    {
                        throw new ArgumentException("Administrative code is wrong.");
                    }
                    if (d.ContainsKey(iArea))
                    {
                        var t = new ChinaIdAreaInfo(iArea, d[iArea]);
                        if (area is null)
                        {
                            area = t;
                        }
                        else
                        {
                            lastArea.Parent = t;
                        }
                        lastArea = t;
                    }

                    iArea /= 100;
                }

                return(area);
            }
        }
 public bool ValidLength(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
 {
     // 8 位:不包含括号
     //10 位:第 8 10 位必须是括号
     if (idNumber.Length == 8 && idNumber.Slice(1).IsAllNumberOrA())
     {
         return(true);
     }
     if (idNumber.Length == 10 && idNumber.Slice(1).IsAllNumberOrA(7) && idNumber.IndexOfShouldBe(7, '(') && idNumber.IndexOfShouldBe(9, ')'))
     {
         return(true);
     }
     failures.Add(new(options.ParamName, "The length of the instance must be 8."));
     return(false);
 }
        public bool ValidTheRest(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var strSequence = GetSequenceImpl(idNumber);
            var sequence    = int.Parse(strSequence);

            info.Gender   = (ChinaIdGender)(sequence % 2);
            info.Sequence = strSequence;

            return(true);
        }
        public bool ValidBirthday(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            if (!ValidBirthdayImpl(idNumber, options, failures, out var birthday))
            {
                failures.Add(new(options.ParamName, "The date of birth cannot be recognized."));
                return(false);
            }

            var @try = birthday > DateTime.MinValue &&
                       birthday.Year >= options.MinYear &&
                       birthday <= DateTimeFactory.Now().Date;

            if (!@try)
            {
                failures.Add(new(options.ParamName, "The date of birth is invalid or exceeds the limit."));
                return(false);
            }

            info.Birthday = birthday;

            return(true);
        }
        public bool ValidCheckBit(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var @try = ValidCheckBitImpl(idNumber, options, failures, out var checkBit) || options.IgnoreCheckBit;

            if (!@try)
            {
                failures.Add(new(options.ParamName, "Wrong check code."));
                return(false);
            }

            info.CheckBit = checkBit;

            return(true);
        }
 public abstract bool ValidLength(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info);
 public override bool ValidLength(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
 {
     if (idNumber.Length == 18)
     {
         return(true);
     }
     failures.Add(new(options.ParamName, "The length of the instance must be 18."));
     return(false);
 }
Exemple #13
0
        public bool ValidTheRest(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            var f = idNumber[0];

            if (f.BeNotContainedIn('1', '5', '7'))
            {
                failures.Add(new(options.ParamName, "The first number is illegal."));
                return(false);
            }

            info.Gender   = ChinaIdGender.Undefined;
            info.Sequence = idNumber.Slice(1, 6).GetString();
            return(true);
        }
Exemple #14
0
        public bool ValidCheckBit(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info)
        {
            info.CheckBit = idNumber.Length switch
            {
                8 => idNumber[7],
                10 => idNumber[8],
                _ => char.MinValue
            };

            return(true);
        }