public ulong Generate(DateTime date, bool sex, int region) { if (region < 0 && region > 28) { return(0); } int month = date.Month; if (date.Year >= 2000) { month += 40; } else if (date.Year < 1900) { month += 20; } ulong result = 0; result = Convert.ToUInt64(date.ToString("yy")); result *= 100; result += (ulong)month; result *= 100; result += (ulong)date.Day; result *= 1000; int regionNumber = 0; lock (random) { regionNumber = random.Next(regions[region].StartRegion, regions[region].EndRegion); } if (regionNumber % 2 != 0 && sex) { regionNumber--; } if (regionNumber % 2 == 0 && !sex) { regionNumber++; } result += (ulong)regionNumber; result *= 10; EGN resultEGN = new EGN(result); resultEGN.FixChecksum(); if (resultEGN.IsValid()) { return(resultEGN.AsNumber); } return(0); }
public string Info(ulong egn) { try { var infoEGN = new EGN(egn); if (!infoEGN.IsValid()) { return("Невалидно ЕГН"); } string result = "Лице, родено на "; result += infoEGN.Day.ToString() + months[infoEGN.Month - 1] + infoEGN.Year.ToString(); bool found = false; int minIndex = 0; int maxIndex = 28; int queryIndex = 0; do { queryIndex = (maxIndex + minIndex) / 2; if (regions[queryIndex].StartRegion <= infoEGN.Region && regions[queryIndex].EndRegion >= infoEGN.Region) { result += " в регион " + regions[queryIndex].Name; found = true; } else if (regions[queryIndex].StartRegion < infoEGN.Region) { minIndex = queryIndex; } else { maxIndex = queryIndex; } } while (!found); if (infoEGN.IsMale) { result += ", от мъжки пол,"; } else { result += ", от женски пол,"; } int lastNumber = infoEGN.Region; if (infoEGN.IsMale) { lastNumber--; } int burthNumber = (lastNumber - regions[queryIndex].StartRegion) / 2 + 1; result += $" родено {burthNumber} подред."; return(result); } catch (Exception e) { return(e.Message); } }