Avatar billede xited Praktikant
31. januar 2008 - 14:56 Der er 14 kommentarer og
1 løsning

12 cifret tal - delt op i 12 variabler

Hejsa,

Jeg skal tjekke om en EAN13-stregkode er valid, og skal gøre følgende ved den 12-cifrede stregkode:

Add the digits (up to but not including the check digit) in the odd-numbered positions (first, third, fifth, etc.) together and multiply by three.
Add the digits (up to but not including the check digit) in the even-numbered positions (second, fourth, sixth, etc.) to the result.
If the last digit of the result is 0, then the check digit is 0.
If the last digit of the result is not zero, then subtract the last digit from 10. The answer must equal the check digit.

Fra: http://en.wikipedia.org/wiki/Check_digit

checkdigit = 10-((digit2+digit4+digit6+digit8+digit10)*3)+(digit1+digit3+digit5+digit7+digit9+digit11)

if(checkdigit==10){checkdigit=0;}

000000000222 tjekkes altså således:

((0+0+0+0+0+2)*3)+(0+0+0+0+0+2) = 8

Tallet trækkes fra 10, hvis tallet ikke er nul, hvilket i ovenstående tilfælde giver 2, som er det sidste nummer i stregkoden, hvilket betyder at den er valid.

Hvordan gør jeg det?
Avatar billede xited Praktikant
31. januar 2008 - 15:02 #1
undskyld, udregningen skal være:

((digit1+digit3+digit5+digit7+digit9+digit11)*3)+(digit2+digit4+digit6+digit8+digit10)

Resultatets sidste ciffer trækkes fra 10. (medmindre det sidste ciffer er 0, så er checkdigiten også 0)

Resultatet af 10 minus sidste ciffer er den endelige checkdigit.
Avatar billede jakobdo Ekspert
31. januar 2008 - 15:09 #2
Prøv at kig på: http://dk.php.net/str_split
Avatar billede xited Praktikant
31. januar 2008 - 15:45 #3
Ja, men jeg får dette:

Fatal error: Call to undefined function: str_split()
Avatar billede xited Praktikant
31. januar 2008 - 15:49 #4
Jeg har stykket dette sammen indtil videre:

$barcode = '000000000222';
$barcode_chunks = chunk_split($barcode, 1, ':');
$barcode_digit = explode(":", $barcode_chunks);
// $digit = str_split($barcode);
echo"$digit[0]";
$checkdigit1 = (($barcode_digit[0]+$barcode_digit[2]+$barcode_digit[4]+$barcode_digit[6]+$barcode_digit[8]+$barcode_digit[10])*3)+$barcode_digit[1]+$barcode_digit[3]+$barcode_digit[5]+$barcode_digit[7]+$barcode_digit[9];
echo"$checkdigit1";

...men hvordan får jeg fat i det sidste ciffer i $checkdigit1 ?
Avatar billede xited Praktikant
31. januar 2008 - 15:49 #5
Og uden det overflødige:

$barcode = '000000000222';
$barcode_chunks = chunk_split($barcode, 1, ':');
$barcode_digit = explode(":", $barcode_chunks);
$checkdigit1 = (($barcode_digit[0]+$barcode_digit[2]+$barcode_digit[4]+$barcode_digit[6]+$barcode_digit[8]+$barcode_digit[10])*3)+$barcode_digit[1]+$barcode_digit[3]+$barcode_digit[5]+$barcode_digit[7]+$barcode_digit[9];
echo"$checkdigit1";
Avatar billede jakobdo Ekspert
31. januar 2008 - 15:57 #6
Er det sidste ikke bare count($barcode_chunks) - 1 ?
Avatar billede xited Praktikant
31. januar 2008 - 16:04 #7
Det er denne ligning:

((digit1+digit3+digit5+digit7+digit9+digit11)*3)+(digit2+digit4+digit6+digit8+digit10)

...men hvordan får jeg fat i det sidste ciffer af resultatet?
Avatar billede xited Praktikant
31. januar 2008 - 16:07 #8
Du kan se udregningen her: http://en.wikipedia.org/wiki/Check_digit - under "UPC"
Avatar billede xited Praktikant
31. januar 2008 - 16:18 #9
Dette virker, men jeg tror der findes en mere effektiv måde:

$barcode = '000000123457';
$barcode_chunks = chunk_split($barcode, 1, ':');
$barcode_digit = explode(":", $barcode_chunks);
$checkdigit1 = 10-((($barcode_digit[0]+$barcode_digit[2]+$barcode_digit[4]+$barcode_digit[6]+$barcode_digit[8]+$barcode_digit[10])*3)+$barcode_digit[1]+$barcode_digit[3]+$barcode_digit[5]+$barcode_digit[7]+$barcode_digit[9]);

while($checkdigit1<0){
$checkdigit1 = $checkdigit1+10;
}
$barcode_check = $barcode;
while($barcode_check>10){
$barcode_check = $barcode_check-10;
}

if($checkdigit1 == $barcode_check){
echo"Stregkoden er gyldig";
}else{
echo"Stregkoden er IKKE gyldig";
}
Avatar billede jakobdo Ekspert
31. januar 2008 - 16:29 #10
Jeg har testet:

<?php
//http://www.eksperten.dk/spm/817429

if (!function_exists("str_split")) {
  function str_split($str,$length = 1) {
    if ($length < 1) return false;
    $strlen = strlen($str);
    $ret = array();
    for ($i = 0; $i < $strlen; $i += $length) {
    $ret[] = substr($str,$i,$length);
    }
    return $ret;
  }
}

$barcode = '036000291452';
$parts = str_split($barcode);

$odd = $parts[0] + $parts[2] + $parts[4] + $parts[6] + $parts[8] + $parts[10];
$result = ($odd * 3) + $parts[1] + $parts[3] + $parts[5] + $parts[7] + $parts[9];
$check = 10 - ($result % 10);
if($parts[11] == $check){
    echo 'Det stemmer';
}else{
    echo 'Det stemmer ikke';
}

?>
Avatar billede xited Praktikant
31. januar 2008 - 16:38 #11
Tak, det gjorde da koden en del mindre...

Imidlertid er jeg løbet ind i et andet problem.

Jeg troede at stregkoden var fixed til 12 cifre, men det er tilsyneladende ikke tilfældet.

Hvordan laves kodestumpen, så den tager så mange odd's og even's med som der er? (og IKKE den sidste checkdigit!)
Avatar billede jakobdo Ekspert
31. januar 2008 - 19:13 #12
Så prøv følgende kode, den burde være mere dynamisk.

<?php
//http://www.eksperten.dk/spm/817429

if (!function_exists("str_split")) {
  function str_split($str,$length = 1) {
    if ($length < 1) return false;
    $strlen = strlen($str);
    $ret = array();
    for ($i = 0; $i < $strlen; $i += $length) {
    $ret[] = substr($str,$i,$length);
    }
    return $ret;
  }
}

$barcode = '036000291452';
$parts = str_split($barcode);

$odd = 0;
for($i = 0; $i < (count($parts) - 1); $i+=2)
{
    $odd+=$parts[$i];
}

$result = $odd * 3;
for($i = 1; $i < (count($parts) - 1); $i+=2)
{
    $result+=$parts[$i];
}

$check = 10 - ($result % 10);
if($parts[count($parts)-1] == $check){
    echo 'Det stemmer';
}else{
    echo 'Det stemmer ikke';
}

?>
Avatar billede xited Praktikant
01. februar 2008 - 10:16 #13
Jeg indføjede dette, før if-sætningen:

if($check == 10){$check = 0;}

...det tog den ikke lige højde for! - Men hey, det virker nu! - Point?
Avatar billede jakobdo Ekspert
01. februar 2008 - 10:20 #14
Svar!
Avatar billede jakobdo Ekspert
01. februar 2008 - 11:25 #15
Takker for point.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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