webForumDet fria alternativet

problem att räkna ut kontrollsiffra

.NETur .NET

7 svar · 1 610 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#1

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

Medlem sedan dec. 20025 483 inlägg
#2
...
   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]
...
Medlem sedan sep. 2005833 inlägg
#3

tusen tack, fungerade kanon

Medlem sedan sep. 2005833 inlägg
#4

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

Medlem sedan dec. 20025 483 inlägg
#5

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

Medlem sedan sep. 2005833 inlägg
#6

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

Medlem sedan dec. 20025 483 inlägg
#7

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;
Medlem sedan sep. 2005833 inlägg
#8

tack, nu fungerar den perfekt.

133 ms totalt · 3 externa anrop · v20260731065814-full.02a0f7de
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)