Viitenumeron laskemiseen köysin koodivinkeistä tämmöisen esimerkin
<?php $yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7); $viite = "12345"; $viite = str_repeat("0", 19 - strlen($viite)) .$viite; for ($i = 0; $i < 19; $i++) { $temp[$i] = substr($viite, $i, 1) * $yks[$i]; } for ($i = 0; $i < 19; $i++) { $temp2 = $temp2 + $temp[$i]; } $tarkistus = 10 - substr($temp2, -1); if ($tarkistus = 10) {$tarkistus = 0;} print "Tarkistusnumero: " .$tarkistus; ?>
Haluaisin kuitenkin tietää, millä perusteella viitenumero luodaan sekä sen, että millä logiikalla tarkistusnumero toteutetaan.
Saako viitteessä olla ihan mitä vain tuohon 19 numeoroon asti. Vaikkapa esim laskun summa + laskutuspäivä + tarkistusnumero ?
Kiitoksia etukäteen vaivaa nähneille. Ja muillekkin :)
Vasta_alkaja kirjoitti:
Saako viitteessä olla ihan mitä vain tuohon 19 numeoroon asti. Vaikkapa esim laskun summa + laskutuspäivä + tarkistusnumero ?
Saa olla. Mieti kuitenkin tarvitseeko sinun kuljettaa tuollaista määrää tietoa viitenumerossa. Käyttäjän, eli laskun maksajan kannalta se 4 numeroa (minimi) on kivempi kuin 20. Jos ei haittaa, että asiakas pystyy päättelemään laskujen määrän, 100 + laskun juokseva id-numero toimii yksinkertaisimmillaan.
Tuo on kyllä paras vaihtoehto. Ei sen viitenumeron mikään armoton numerojono tarvitse olla. Kaikkien kannalta yksinkertaisempaa.
Hei,
voisiko joku selventää minulle miksi juuri tuolla logiikalla luodaan viitenmuro.
Miksi on esim.
$yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7);
Niin tai siis se juju on lisätä tarkistusmerkki jostakin keksittyyn numerosarjaan.
Tarkistusnumeron tarkoitus on auttaa varmistamaan, että numero on syötetty oikein. Yksinkertainen tapa voisi olla vaikka, että lasketaan numerosarjan kaikki numerot yhteen ja otetaan summasta kymmenen jakojäännös. Tämä simppeli tapa auttaa jo useimmiten havaitsemaan, jos yksittäinen numero on näppäilty väärin. Tällä tavalla ei kuitenkaan yleensä havaita, jos numerot ovat vaihtaneet paikkaansa.
Antamalla numerosarjan numeroille erilaiset painokertoimet - vaikka 1, 2, 1, 2, ... - peräkkäisten numeroiden vaihtuminen on yleensä mahdollista huomata.
En tiedä, miten viitenumeroissa on päädytty tuohon 137-sarjaan. Tärkeää siinä on, että peräkkäisillä numeroilla on eri kertoimet ja mieluusti niin, etteivät ne olisi jaollisia toistensa ja kymmenen kanssa, mutta muutoin ne lienee saatu numeromagialla.
Laskentakaavan pitää olla aika yksinkertainen, jotta se on riittävän helppo toteuttaa. Ei siinä kovin korkealentoista matematiikkaa kannata muutenkaan soveltaa, sillä jos tarkiste on yhden numeron mittainen, satunnainen apinakin saa joka kymmenennen numerosarjansa tarkastuksesta joka tapauksessa läpi.
Kuinka ollakaan, intternetistä löytyy aikas hyvät sivut tarkistusmerkkien laskentamenetelmistä, rispektiä niiden ylläpitäjälle.
Hei,
Alla olevaa esimerkkiä olen käyttänyt luodessani viitenumeron. Tämä esimerkki ei kuitenkaan mielestäni toimi oikein. Tämä palauttaa minulle aina tuloksen 0.
<?php $yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7); $viite = "12345"; $viite = str_repeat("0", 19 - strlen($viite)) .$viite; for ($i = 0; $i < 19; $i++) { $temp[$i] = substr($viite, $i, 1) * $yks[$i]; } for ($i = 0; $i < 19; $i++) { $temp2 = $temp2 + $temp[$i]; } $tarkistus = 10 - substr($temp2, -1); if ($tarkistus = 10) {$tarkistus = 0;} print "Tarkistusnumero: " .$tarkistus; ?>
Jos php:ssä pätee samat näkyvyysaluesäännöt (kuten epäilen) kun C++:ssa, niin ensimmäisessä for-loopissa oleva $temp-taulukko tuhotaan silmukan jälkeen ja toisessa luodaan uusi, eli se pitää luoda tyhjänä jo ennen silmukoita.
Vasta_alkaja kirjoitti:
Alla olevaa esimerkkiä olen käyttänyt luodessani viitenumeron. Tämä esimerkki ei kuitenkaan mielestäni toimi oikein. Tämä palauttaa minulle aina tuloksen 0.
Jos tulee väärä tulos, niin paras tapa sen selvittämiseen ennen avun pyytämistä on laittaa kaikkiin mahdollisiin paikkoihin tulostusta muuttujien arvoista, jolloin näet, missä kohtaa rupeaa menemään vikaan.
Eli ennen ja jälkeen for -lauseita vaan echoa, samoin for-lauseiden sisään. yms. yms. yms.
function viitenumero($laskunro){ if(strlen($laskunro) > 19) return 0; $kertoimet = array('7','3','1','7', '3','1','7','3','1','7','3','1','7','3','1','7','3','1','7'); $tarkiste = 0; $j = 0; $tmp = $laskunro; settype($tmp, "string"); for($i=strlen($tmp)-1; $i>-1; $i--){ $tarkiste = $tarkiste + $kertoimet[$j++] * intval(substr($tmp, $i, 1)); } $tarkiste = ceil($tarkiste / 10) * 10 - $tarkiste; $viite = "$laskunro$tarkiste"; return $viite; }
Sain toimimaan sekä löysin myös hieman karsitumman version.
Tässä vielä itselläni käytössä ollut versio, en muista enää mistä kopiotu.
Aihe on jo aika vanha, joten et voi enää vastata siihen.