V Vinnaren Medlem sedan sep. 2005 833 inlägg Frågan 24 jan. 2008 17:01 #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
P Peter S Medlem sedan dec. 2002 5 483 inlägg ...
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]
...
V Vinnaren Medlem sedan sep. 2005 833 inlägg tusen tack, fungerade kanon
V Vinnaren Medlem sedan sep. 2005 833 inlägg 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
P Peter S Medlem sedan dec. 2002 5 483 inlägg För ovanstående kod, med Int64 ocr = 12002710044000066, får jag att IsValid == false samt att n - sum == 2.
V Vinnaren Medlem sedan sep. 2005 833 inlägg 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
P Peter S Medlem sedan dec. 2002 5 483 inlägg 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;
V Vinnaren Medlem sedan sep. 2005 833 inlägg tack, nu fungerar den perfekt.