protected override bool ValidCheckBitImpl(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, out char rightBit) { var mod = ISO7064_1983.MOD11_2(idNumber.SelectAndTakeToInt32Array(17), WeightFactors, 11); rightBit = CheckBits[mod]; return(rightBit == idNumber[17]); }
protected override bool ValidBirthdayImpl(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, out DateTime date) { var s = idNumber.Slice(6, 8).GetString(); return(DateTime.TryParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date) && s.All(c => c.IsNumber())); }
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); }
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); }
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); }
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 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); }
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); }
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 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 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 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 ValidBirthday(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info) { return(true); }
protected override bool ValidCheckBitImpl(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, out char rightBit) { rightBit = char.MinValue; 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); } }
protected abstract bool ValidCheckBitImpl(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, out char rightBit);
protected abstract bool ValidBirthdayImpl(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, out DateTime date);
public abstract bool ValidLength(ReadOnlySpan <char> idNumber, ChinaIdNumberValidationOptions options, List <VerifyFailure> failures, ChinaIdNumberInfo info);