4
Jan

Prüfziffer der ISIN in PHP

categories Computer, PHP    

Die ISIN (International Securities Identification Number) ist eine Kennung für Wertpapiere. Wie viele andere solcher Kennungen, beinhaltet auch die ISIN ein Prüfziffer-Verfahren. Wie das in Theorie funktioniert, hat jemand richtig gut bei Wikipedia beschrieben.

Hiermit zeige ich eine kleine Klasse, wie man das in PHP machen kann (use with care and at own risk!). Ursprünglich hatte ich diesen Code in 2010 veröffentlicht, in 2018 arbeitete ich die Hinweise einiger Nutzer ein und aktualisierte die Routinen zu PHP7.

<br />
declare(strict_types=1);</p>
<p>/**<br />
 * Validierung einer ISIN (double at double-method)<br />
 * 2010-2018 von Björn A. Dietz<br />
 */<br />
class isin_validate{<br />
	public $isin;<br />
	private $cvok;</p>
<p>	function __construct($isin = false) {<br />
		if ($isin) $this-&gt;isin = $isin;<br />
	}</p>
<p>	public function isin_check() {<br />
		$isin = strtoupper($this-&gt;isin);<br />
		$s=&quot;&quot;; $cv = 0;<br />
		$this-&gt;cvok = false;</p>
<p>		for ($i=0;$i&lt;=10; $i++) {<br />
			$b = substr($isin,$i,1);<br />
			if (ord($b)&gt;=65 &amp;&amp; ord($b)&lt;=90) $b = ord($b)-55;<br />
			$s .= $b;<br />
		}</p>
<p>		$s = strrev($s);</p>
<p>		for ($i= 0;$i&lt;=strlen($s);$i++) {<br />
			$b = (int) substr($s,$i,1);<br />
			if (!bcmod((string) $i, &quot;2&quot;)) $b = $this-&gt;quersumme($b * 2);<br />
			$cv += $b;<br />
		}</p>
<p>		$cv = 10 - bcmod((string) $cv, &quot;10&quot;);<br />
		$cv = bcmod ((string) $cv, &quot;10&quot;);</p>
<p>		if ($cv == substr($isin,-1,1)) $this-&gt;cvok = true;<br />
		return $this-&gt;cvok;<br />
	}</p>
<p>	private function quersumme($zahl) {<br />
		$strZahl = (string) $zahl;<br />
		for( $intQS = $i = 0; $i &lt; strlen ($strZahl); $i++ ) {<br />
			$intQS += (int) $strZahl{$i};<br />
		}<br />
		return (int) $intQS;<br />
	}<br />
}<br />

…und so kann man die Klasse verwenden:

<br />
/* Anwendungsbeispiel */<br />
$cv_test = new isin_validate(&quot;DE000BAY0017&quot;);<br />
echo $cv_test-&gt;isin_check();<br />

Ich weiß, das geht immer noch besser… so ist es aber schön übersichtlich!