---
title: "problem att räkna ut kontrollsiffra"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/168394-problem-att-räkna-ut-kontrollsiffra"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Vinnaren"
published: "2008-01-24T17:01:59.000Z"
updated: "2008-01-25T15:41:17.000Z"
replies: 7
views: 1616
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/168394-problem-att-räkna-ut-kontrollsiffra"
---

# problem att räkna ut kontrollsiffra

## #1 — Vinnaren, 2008-01-24T17:01Z

Ska försöka räkna ut kontrollsiffran i ett ocr-nummer men vet inte hur jag ska göra det  :r 

Har följande:

```
int userid = Convert.ToInt32(Session["UserId"]);
  String uniqueId = Session.SessionID.ToString();

  Order o = new Order(userid, uniqueId);
  int orderid = Order.CreateNewOrder(o);

  Int64 ocr = Convert.ToInt64(userid.ToString() + orderid.ToString());

  Order.SaveOCR(orderid, userid, ocr);
```

 

Manualen finns här:
<http://www.bankgirot.se/upload/Gemensamt/Trycksaker/Manualer/BG4019.pdf>

Men hur löser man detta kod-mässigt??

Tacksam för all hjälp  :stud

Permalänk: https://www.webforum.nu/p/168394

## #2 — Peter S, 2008-01-24T18:26Z

```
...
   int arrPos = 1;
   int check = ocr % 10;
   int sum = 0;
   int[] mul = {1,2};
   ocr = Convert.ToInt32(ocr / 10);
   while (true)
   {
    int m = ocr % 10;
    if (m * mul[Math.Max(arrPos, 0)] > 9)
     sum += m * mul[Math.Max(arrPos, 0)] - 9;
    else
     sum += m * mul[Math.Max(arrPos, 0)];
    arrPos *= -1;
    ocr = Convert.ToInt32(ocr / 10);
    if (ocr < 1) break;
   }
   int n = sum;
   if (n % 10 != 0) n = n + 10 - n % 10;
   [red][B]bool isValid = n - sum == check;[/B][/red]
...
```

Permalänk: https://www.webforum.nu/p/2075494

## #3 — Vinnaren, 2008-01-24T21:08Z

tusen tack, fungerade kanon

Permalänk: https://www.webforum.nu/p/2075527

## #4 — Vinnaren, 2008-01-24T21:35Z

märkte nu att siffran var fel när man validerade ocr-nummret.

har koden:

```
                Int64 ocr = Convert.ToInt64(userid.ToString() + orderid.ToString());

                Int64 arrPos = 1;
                Int64 check = ocr % 10;
                Int64 sum = 0;
                Int64[] mul = { 1, 2 };
                ocr = ocr / 10;
                while (true)
                {
                    Int64 m = ocr % 10;
                    if (m * mul[Math.Max(arrPos, 0)] > 9)
                        sum += m * mul[Math.Max(arrPos, 0)] - 9;
                    else
                        sum += m * mul[Math.Max(arrPos, 0)];
                    arrPos *= -1;
                    ocr = ocr / 10;
                    if (ocr < 1) break;
                }
                Int64 n = sum;
                if (n % 10 != 0) n = n + 10 - n % 10;
                bool isValid = n - sum == check;

                if (isValid)
                {
                    ocr = Convert.ToInt64(userid.ToString() + orderid.ToString() + check.ToString());
                    Order.SaveOCRnumberToOrder(orderid, userid, ocr);
                }
```

 

Får 12002710044000066 men den sista siffran ska igenligen vara en 2:a.

Vad kan det vara för fel??   :stud

Permalänk: https://www.webforum.nu/p/2075535

## #5 — Peter S, 2008-01-25T07:49Z

För ovanstående kod, med Int64 ocr = 12002710044000066, får jag att IsValid == false samt att n - sum == 2.

Permalänk: https://www.webforum.nu/p/2075581

## #6 — Vinnaren, 2008-01-25T12:47Z

konstigt, när jag kör följande:

```
            Int64 ocr = Convert.ToInt64("1200271004400006");

            Int64 arrPos = 1;
            Int64 check = ocr % 10;
            Int64 sum = 0;
            Int64[] mul = { 1, 2 };
            ocr = ocr / 10;
            while (true)
            {
                Int64 m = ocr % 10;
                if (m * mul[Math.Max(arrPos, 0)] > 9)
                    sum += m * mul[Math.Max(arrPos, 0)] - 9;
                else
                    sum += m * mul[Math.Max(arrPos, 0)];
                arrPos *= -1;
                ocr = ocr / 10;
                if (ocr < 1) break;
            }
            Int64 n = sum;
            if (n % 10 != 0) n = n + 10 - n % 10;
            bool isValid = n - sum == check;
```

 

Så får jag check = 6. Validerar jag sedan hela strängen på bankgirot.se säger den att det är ett felaktigt ocr-nummer  :r

Permalänk: https://www.webforum.nu/p/2075626

## #7 — Peter S, 2008-01-25T13:37Z

Hm, du vill alltså inte validera kontrollsiffran utan räkna fram den.   :p Då

```
            Int64 ocr = Convert.ToInt64("1200271004400006");

            Int64 arrPos = 1;
            Int64 check = -1;
            Int64 sum = 0;
            Int64[] mul = { 1, 2 };
            while (true)
            {
                Int64 m = ocr % 10;
                if (m * mul[Math.Max(arrPos, 0)] > 9)
                    sum += m * mul[Math.Max(arrPos, 0)] - 9;
                else
                    sum += m * mul[Math.Max(arrPos, 0)];
                arrPos *= -1;
                ocr = ocr / 10;
                if (ocr < 1) break;
            }
            Int64 n = sum;
            if (n % 10 != 0) n = n + 10 - n % 10;
            check = n - sum;
```

Permalänk: https://www.webforum.nu/p/2075629

## #8 — Vinnaren, 2008-01-25T15:41Z

tack, nu fungerar den perfekt.

Permalänk: https://www.webforum.nu/p/2075662

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/168394-problem-att-räkna-ut-kontrollsiffra
