Avatar billede 231077 Nybegynder
14. marts 2007 - 12:02 Der er 7 kommentarer og
1 løsning

hvordan laver jeg en cpr-validering

hej jeg er lige begyndt at programmer i C# og kunne bruge noget hjælp til at lave en cpr validering

eller er der allerede noget færdig, som man kunne bruge som inspiration???
Avatar billede drgonzo Praktikant
14. marts 2007 - 12:40 #1
har et program der udregner det sidste ciffer i cpr nummeret, der kan du se hvordan jeg adskiller de enkelte cifre, måske det kan hjælpe.


using System;

class CSDemo
{
public static void Main()
  {
  int v1 = 4;
  int v2 = 3;
  int v3 = 2;
  int v4 = 7;
  int v5 = 6;
  int v6 = 5;
  int v7 = 4;
  int v8 = 3;
  int v9 = 2;
 
  Console.WriteLine("\nIndtast de første 9 cifre i dit person nummer, uden bindestreg:\n ");
  int ShortCPR = int.Parse(Console.ReadLine());
 
  int c1 = ((ShortCPR%1000000000)-(ShortCPR%100000000))/100000000;
  int c2 = ((ShortCPR%100000000)-(ShortCPR%10000000))/10000000;
  int c3 = ((ShortCPR%10000000)-(ShortCPR%1000000))/1000000;
  int c4 = ((ShortCPR%1000000)-(ShortCPR%100000))/100000;
  int c5 = ((ShortCPR%100000)-(ShortCPR%10000))/10000;
  int c6 = ((ShortCPR%10000)-(ShortCPR%1000))/1000;
  int c7 = ((ShortCPR%1000)-(ShortCPR%100))/100;
  int c8 = ((ShortCPR%100)-(ShortCPR%10))/10;
  int c9 =  ShortCPR%10;
 
  int ct = ((c1*v1)+(c2*v2)+(c3*v3)+(c4*v4)+(c5*v5)+(c6*v6)+(c7*v7)+(c8*v8)+(c9*v9))%11;
  int c10 = (11-ct);
 
  if (ct == 0)
  c10=0;
 
  else if (ct == 1)
  Console.Write("\nUgyldigt CPR, prøv igen!\n");
 
  Console.Write("\nDit CPR nummer er: {0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", c1, c2, c3, c4, c5, c6, c7, c8, c9, c10);
 
  if ((c10==0) || (c10==2) || (c10==2) || (c10==4) || (c10==6) || (c10==8))
  Console.Write("\n\nDit kontrol ciffer er lige, altså er du en kvinde\n");
 
  else if ((c10==1) || (c10==3) || (c10==5) || (c10==7) || (c10==9))
  Console.Write("\n\nDit kontrol ciffer er ulige, altså er du en mand\n");
 
 
  }
}

Her er lidt info om udregning af de enkelte cifre
http://tom.paamand.dk/cpr.htm
Avatar billede _just4fun_ Nybegynder
14. marts 2007 - 12:41 #2
/// <summary>
        /// validerer et CPRNummer
        /// </summary>
        /// <param name="cprNummer">cprnummer af typen 111111-2222</param>
        private static bool CPRValid(string cprNummer){
            string cpr = cprNummer.Replace("-", "").Trim();
            if (cpr.Length != 10 ) return false;

            int sum=0;
            int[] check = new int[] {4, 3, 2, 7, 6, 5, 4, 3, 2, 1};
            try
            {
                for (int i = 0; i < check.Length; i++)
                {
                    sum += int.Parse(cpr.Substring(i, 1)) * check[i];
                }
            }
            catch (Exception ex) {
                sum = 1;
            }

            return sum % 11 == 0;
        }
Avatar billede _just4fun_ Nybegynder
14. marts 2007 - 13:03 #3
Det ser søreme ud til at tjekket kan laves lidt mere simpelt: :-)
http://www.cpr.dk/cpr/site.aspx?p=172&ArticleID=4347

        /// <summary>
        /// validerer et CPRNummer... uden modulus11 tjek!!
        /// </summary>
        /// <param name="cprNummer">cprnummer af typen 111111-2222</param>
        private static bool CPRValid_new(string cprNummer)
        {
            string cpr = cprNummer.Replace("-", "").Trim();
            if (cpr.Length != 10) return false;
            int theNum = 0;
            return int.TryParse(cpr, out theNum);
        }
Avatar billede arne_v Ekspert
14. marts 2007 - 15:18 #4
fra lageret:

using System;

namespace E
{
    public class CPR
    {
      private string number;
      public CPR(string number)
      {
          this.number = number;
      }
      public bool IsValid()
      {
          int[] ix = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10 };
          int[] c = { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };
          if (number.Length != 11)
          {
            return false;
          }
          if (number[6] != '-')
          {
            return false;
          }
          for (int i = 0; i < 10; i++)
          {
              if (!Char.IsDigit(number[ix[i]]))
              {
                  return false;
              }
          }
          if (dd() > 31)
          {
            return false;
          }
          if (mm() > 12)
          {
            return false;
          }
          if (century() == 0)
          {
            return false;
          }
          int temp = 0;
          for (int i = 0; i < 10; i++)
          {
            temp = temp + c[i] * int.Parse(number.Substring(ix[i], 1));
          }
          return ((temp % 11) == 0);
      }
      public bool IsMale() {
          return int.Parse(number.Substring(10,1)) % 2 == 1;
      }
      public bool IsFemale() {
          return int.Parse(number.Substring(10,1)) % 2 == 0;
      }
      private int dd()
      {
          return int.Parse(number.Substring(0, 2));
      }
      private int mm()
      {
          return int.Parse(number.Substring(2, 2));
      }
      private int yy()
      {
          return int.Parse(number.Substring(4, 2));
      }
      private int century() {
          switch (number[7]) {
              case '0' :
              case '1' :
              case '2' :
              case '3' :
                  return 1900;
              case '4' :
              case '9' :
                  if (yy() < 37)
                      return 2000;
                  else
                      return 1900;
              case '5' :
              case '6' :
              case '7' :
              case '8' :
              if (yy() < 37)
                  return 2000;
              else if (yy() > 57)
                  return 1800;
              else
                  return 0;
              default :
                  return 0;
          }
      }
    }
    public class TestClass
    {
        private static void Test(string s)
        {
            CPR nr = new CPR(s);
            Console.WriteLine(s + " valid: " + nr.IsValid());
        }
        public static void Main(string[] args)
        {
            Test("123456-1234");
            Test("111111-1118");
        }
    }
}
Avatar billede arne_v Ekspert
14. marts 2007 - 15:28 #5
bemaerk at det er annonceret at 11 checket bliver droppet
Avatar billede 231077 Nybegynder
16. marts 2007 - 08:18 #6
hej
i skal have tak for de insalg i er kommet med, men jeg glemte vidst lige at nævne at det er C# windows programmering altså i Former.
sådan som jeg har sat det op er; En Form i formen er der en Text box og en knap.
jeg har prøvet at lave lidt om på de forskellige kode men kan ikke få det til at virke.
Avatar billede 231077 Nybegynder
07. december 2010 - 10:22 #7
u
Avatar billede martinording Nybegynder
24. april 2013 - 14:52 #8
Jeg ved godt, det er et gammelt spørgsmål, men her er en bedre løsning. Den kan fortælle, om CPR-nummeret helt sikkert er ugyldigt (forkert længde, består ikke af tal osv.), måske gyldigt (overholder ikke modulus-11-tjekket) eller gyldigt (overholder modulus-11-tjekket). Hvis det helt sikkert er ugyldigt, kan man afvise brugerens input, hvis det måske er ugyldigt, kan man bare advare brugeren, for at være venlig.

Koden antager, at du selv har fjernet en eventuel bindestreg først, men det er nemt at ændre.

public enum CprValidity { Valid, MaybeValid, Invalid }

public static CprValidity IsCprValid(string cpr)
{
    if (cpr == null)
        throw new ArgumentNullException();

    if (cpr.Length != 10)
        return CprValidity.Invalid;

    int sum = 0;
    int[] check = new int[] { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };
    try
    {
        for (int i = 0; i < check.Length; i++)
            sum += int.Parse(cpr.Substring(i, 1)) * check[i];
    }
    catch (FormatException)
    {
        return CprValidity.Invalid;
    }

    if (sum % 11 == 0)
        return CprValidity.Valid;
    else
        return CprValidity.MaybeValid;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester