Vraag & Antwoord

Webprogrammeren & scripting

Controle algorithme

21 antwoorden
  • Hallo, Ik ben op zoek naar twee programmatjes die het volgende doen: Het ene programma controleert of een bankrekeningnummer correct is. (Ik dacht dat dat iets in de vorm van een nine-proof was, weet niet zeker) Het andere programma controleert de correctheid van een sofi-nummer. Hiermee bedoel ik dus niet de lengte of, of er bepaalde waardes aanwezig zijn. Maar de controle of het een correcte invoer betreft. (Dit bevat natuurlijk wel ook lengte en vorm) Ik hoef niet echt een programma te krijgen, alleen de controle methode of documentatie daarover is goed genoeg. Bedankt, Marcel
  • Volgens mij kan je hier weinig anders aan doen dan de lengte checken...
  • FISCAAL NUMMER Sinds de zomer van 1985 weten alle Nederlanders dat zij een fiscaal nummer hebben, een nummcr waaronder ze bij de be- lastingdienst bekend zijn. Daarvoor hadden ze ook al een num- mer, maar dat was niet openbaar. Iedereen krijgt op zijn vijftiende jaar, of zodra hij eeen bedrijf begint, een nummer toegewezen van de belastingdienst. Alles wat en iedereen die maar een beetje belastingplichtig zou kun- nen zijn, krijgt een fiscaal nummer. Dat nummer is volstrekt willekeurig; er valt niets uit af te lezen - noch de geboorteda- tum, noch het geslacht, of wat dan ook. Het getal lijkt uit negen cijfers te bestaan, maar het zijn er maar acht: hct laatste is weer een 'controlecijfer' zoals dat ook wordt gebruikt bij BANKBILJETTEN en STREEPJESCODE. Hier- mee wordt de kans verkleind dat mens of machine een fout maakt bij het inlezen of intikken van het fiscale nummer. Het systeem gaat volgens de zogeheten 11-modulus. Vermenigvuldig het eerste cijfer van het getal met 9, het tweede met 8, het derde met 7 enzovoort tot en met het achtste cijfer met 2. Tel de uitkomsten van al deze produkten by elkaar op, en deel door elf. De rest is het negende cijfer van het fiscale nummer. Bij voorbeeld het fiscale nummer 063 796 363 (de O telt mee; vroeger bestond het fiscale nummer uit acht, nu uit negen cij- fers): O x 9 = 0; 6 x 8 = 48; 3 x 7 = 21; 7 x 6 = 42; 9 x 5 = 45; 6 x 4 = 24; 3 x 3 = 9 en 6 x 2 = 12. Som: 201. Deling van 201 door 11 levert als rest 3, dat is het laatste cijfer van het fiscale nummer. De rest is nooit 10, daar is wel op gelet bij het maken van de nummers. Dus het fiscale nummer 063 795 36x bestaat niet, want dat zou een controle- som 197 opleveren en een rest van 10. Maar voor het overige zijn de fiscale nummers volstrekt wil- lekeurig. Ze zijn op de groei gemaakt: de cijfers lopen in princi- pe van 010 000 021 tot 999 999 999 (wie heeft het laagste num- mer?) terwijl er de komende tijd niet meer dan zes miljoen be- lastingplichtigen zullen zijn. Het fiscaal nummer is ook het nummer waaronder u bij de so- ciale diensten en bij de loonbelasting bekend bent - vandaar de benaming sofinummer: sociaal-fiscaal nummer. Achter het loonbelastingnummer staat soms nog een L met een getal; het getal geeft voor de werkgever aan in welk van zijn ondernemin- gen u werkzaam bent. Bron: ministerie van financiën _______________________________________ Sofinummers en bankrekeningnummers (dit geldt overigens *niet* voor gironummers) moeten aan de 11-proef voldoen. Je vermenigvuldigt alle cijfers met een factor. Voor het laatste cijfer is deze factor 1, voor ieder voorgaand cijfer is de factor steeds 1 hoger. De som van de vermenigvuldigingen moet uiteindelijk een veelvoud van 11 zijn. Voorbeeld: stel je sofinummer is 456123784. 4 5 6 1 2 3 7 8 4 sofinr 9 8 7 6 5 4 3 2 1 factor 36 40 42 6 10 12 21 16 4 vermenigvuldigd De som is dan 36+40+42+6+10+12+21+16+4=187 187 / 11 = 17 rest 0. Het nummer voldoet dus aan de 11-proef en is derhalve bestaanbaar. Al deze wijsheid en meer is hier te vinden: http://groups.google.com/groups?q=sofinummer+controleren&hl=nl
  • Je leert nog eens wat anders in dit forum :smile:
  • inderdaad :smile: De onderste oplossing werkt trouwens niet! Het totaal/11 moet niet op 0 uitkomen, maar er moet precies het laatste getal overblijven. Dit zou moeten werken.. [code:1:29e0270330] function elevenCheck(n) { var totaal = 0; var factor = 2; if(n.length==8) n = '0' + n; for(i = n.length-1; i > 0; i--,factor++) totaal += n.substring(i-1,i) * factor; var rest = totaal % 11; if(rest >= 10) return false; return (rest == n.substr(n.length-1)) ? true : false; } [/code:1:29e0270330] dit stukje zou het moeten controleren
  • En voor een bankrekening nummer geld het zelfde: http://cgi.dit.nl/bank.cgi
  • Wederom: bedankt voor alle hulp! Marcel
  • [quote:e01c8739e7] Op 03-05-2002 10:43 schreef Jurriaan R: inderdaad :smile: De onderste oplossing werkt trouwens niet! Het totaal/11 moet niet op 0 uitkomen, maar er moet precies het laatste getal overblijven. Dit zou moeten werken.. [code:1:e01c8739e7] function elevenCheck(n) { var totaal = 0; var factor = 2; if(n.length==8) n = '0' + n; for(i = n.length-1; i > 0; i--,factor++) totaal += n.substring(i-1,i) * factor; var rest = totaal % 11; if(rest >= 10) return false; return (rest == n.substr(n.length-1)) ? true : false; } [/code:1:e01c8739e7] dit stukje zou het moeten controleren [/quote:e01c8739e7] Uhm, nog even een opmerking ik heb namelijk het idee dat jij het anders bedoelt. (Alle 9 getallen) / 11 geeft een rest van 0. (Eerste 8 getallen) / 11 geeft een rest van het laatste getal.
  • Nog een kleine vraag: Ergens staat er een opmerking over gironummers dat dit niet werkt. Is hier wel iets voor? Marcel
  • met google kwam ik wat tegen, probeer zelf even, maar volgens mij zijn dat gewoon oplopendee nummers zonder controle cijfer. [quote:8dff320bf4] Gironummers, zoals je waarschijnlijk al wist, hebben niet altijd even veel cijfers, en beginnen gewoon bij 1. Gironummers kan je alleen controleren door de naam van de houder te vergelijken.[/quote:8dff320bf4] http://groups.google.com/groups?q=gironummers+controleren&amp;hl=nl&amp;selm=4lqir9%24eau%40news.IAEhv.nl&amp;rnum=2 staat trouwens hierboven ook al ergens: [quote:8dff320bf4] ... Bron: ministerie van financiën _______________________________________ Sofinummers en bankrekeningnummers [b:8dff320bf4](dit geldt overigens *niet* voor gironummers)[/b:8dff320bf4] moeten aan de 11-proef voldoen. Je vermenigvuldigt alle cijfers met een factor. Voor het laatste cijfer is deze factor 1, voor ieder voorgaand cijfer is de factor steeds 1 hoger. ... [/quote:8dff320bf4] <font size=-1>[ Dit bericht is bewerkt door: mvwinger op 2002-05-03 17:20 ]</font>
  • [quote:669984359e] Uhm, nog even een opmerking ik heb namelijk het idee dat jij het anders bedoelt. (Alle 9 getallen) / 11 geeft een rest van 0. (Eerste 8 getallen) / 11 geeft een rest van het laatste getal. [/quote:669984359e] Inderdaad, allebei de oplossingen worden gegeven. Alleen ze zijn niet hetzelfde... als ik mijn bankrekening invul in de eerste.. dan krijg ik true. Vul ik hem in op de 2e manier.. dan wordt het false. Andersom met een geldig sofinummer. Dan werkt de eerste methode niet, maar de 2e wel. &quot;(Eerste 8 getallen) / 11 geeft een rest van het laatste getal&quot; lijkt alleen voor het sofinummer te gelden en komt uit de handleiding van de belastingsdienst, &quot;(Alle 9 getallen) / 11 geeft een rest van 0&quot; lijkt te werken voor banknummers, maar niet voor sofinummers.
  • Volgens mij heeft Jurriaan inderdaad gelijk ik heb het ook uit zitten proberen met enkele sofi en bank nummers. P.S. ik vond ook nog dat de Rabobank nummers van 10 cijfers kan hebben. Dus misschien verstandig om tot tien te controleren. Bedankt!
  • Sorry, denk foutje, ben bezig met php scriptje om te checken. Tien cijferige nummers van de rabobank zijn spaarrekeningen.
  • Hmm, één manier werkt wel altijd als je met absoluten waarde gaat werken. Live te zien: http://membres.lycos.fr/mvwing/nummer.php?nummer= met daarachter het nummer. [code:1:a003101e1e] &lt;?PHP error_reporting(E_ALL); if (isset($_GET['nummer'])){ echo &quot;&lt;B&gt;&quot;.$nummer.&quot;&lt;/B&gt;&lt;BR&gt;&quot;; $totaal = 0; $len = strlen($_GET['nummer']); $val = $len; if ($len == 9 || $len == 10){ for ($a = 0; $a &lt; $len; $a++){ $num = substr($_GET['nummer'],$a,1); if ($num != &quot;.&quot;){ $totaal = $totaal + ($num * $val); $val--; } if ($a == ($len - 2)){ $check = (($totaal/11)-(round($totaal/11)))*11; echo &quot;Checkvalue = &lt;B&gt;&quot;.$check.&quot;&lt;/B&gt;&lt;BR&gt;&quot;; if (substr($_GET['nummer'],8,1) == (string)$check &amp;&amp; $len == 9){ $type = &quot;Sofinummer&quot;; } } if ($a == ($len-1) &amp;&amp; ((round($totaal/11)-($totaal/11))*11) == 0){ $type = &quot;Bankrekeningnummer&quot;; } } if (!isset($type)) $type = &quot;invalid&quot;; } echo &quot;Dit is een &quot;.$type; } else { echo &quot;Roep aan met &lt;I&gt;nummer.php?nummer=rekeningnummer&lt;/I&gt; ofn&lt;BR&gt; &lt;I&gt;nummer.php?nummer=sofinummer&lt;/I&gt; om te checken.&quot;; } ?&gt;[/code:1:a003101e1e] EDIT: Nieuwe code ondersteund ook 10 cijferige nummers. <font size=-1>[ Dit bericht is bewerkt door: mvwinger op 2002-05-03 19:17 ]</font>
  • Mooie parse error :wink:
  • was even bezig :razz:
  • Iets betere controler misschien... [quote:d61ba6fc42] 13080744 Warning: Undefined variable: type in nummer.php on line 35 Dit is een [/quote:d61ba6fc42]
  • Is al weg ik controleerde alleen op isset() maar nu ook op != &quot;&quot; Bij mij doet hij het nou. <font size=-1>[ Dit bericht is bewerkt door: mvwinger op 2002-05-03 19:40 ]</font>
  • En daar is dan weer de functie empty() voor.. die combineert isset() en !=&quot;&quot; dus: if(!empty($type))
  • Note: empty() is a language construct. Maar ik lees daar alleen maar negatieve verhalen, maar nu werkt het, en de volgende keer zal ik het niet meer vergeten en mischien zelfs empty() gebruiken.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.