Skip to content
This repository has been archived by the owner on Dec 11, 2020. It is now read-only.

Commit

Permalink
Refactor IBAN checksum to calculator class, Add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
okj579 committed Jun 13, 2015
1 parent d0f985f commit 9a2721e
Show file tree
Hide file tree
Showing 4 changed files with 484 additions and 21 deletions.
67 changes: 67 additions & 0 deletions src/Faker/Calculator/Iban.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace Faker\Calculator;

class Iban
{
/**
* Generates IBAN Checksum
*
* @param string $iban
* @return string Checksum (numeric string)
*/
public static function checksum($iban)
{
// Move first four digits to end and set checksum to '00'
$checkString = substr($iban, 4) . substr($iban, 0, 2) . '00';

// Replace all letters with their number equivalents
$checkString = preg_replace_callback('/[A-Z]/', array('self','alphaToNumberCallback'), $checkString);

// Perform mod 97 and subtract from 98
$checksum = 98 - self::mod97($checkString);

return str_pad($checksum, 2, '0', STR_PAD_LEFT);
}

private static function alphaToNumberCallback($match)
{
return self::alphaToNumber($match[0]);
}

/**
* Converts letter to number
*
* @param string $char
* @return int
*/
public static function alphaToNumber($char)
{
return ord($char) - 55;
}

/**
* Calculates mod97 on a numeric string
*
* @param string $number Numeric string
* @param int
*/
public static function mod97($number)
{
$checksum = (int)$number[0];
for ($i = 1, $size = strlen($number); $i < $size; $i++) {
$checksum = (10 * $checksum + (int) $number[$i]) % 97;
}
return $checksum;
}

/**
* Checks whether an IBAN has a valid checksum
*
* @return boolean
*/
public static function isValid($iban)
{
return self::checksum($iban) === substr($iban, 2, 2);
}
}
23 changes: 2 additions & 21 deletions src/Faker/Provider/Payment.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Faker\Provider;

use Faker\Calculator\Iban;
use Faker\Calculator\Luhn;

class Payment extends Base
Expand Down Expand Up @@ -254,27 +255,7 @@ protected static function iban($countryCode, $prefix = '', $length = null)

$result = static::addBankCodeChecksum($result, $countryCode);

$tempResult = str_split($result . $countryCode . '00');

// Convert letters to numbers
foreach ($tempResult as &$letter) {
$num = ord($letter) - 55;
if ($num >= 10 && $num <= 35) {
$letter = str_pad($num, 2, '0', STR_PAD_LEFT);
}
}
unset($letter);
$tempResult = join('', $tempResult);

// perform MOD97-10 checksum calculation
$checksum = (int) $tempResult[0];
for ($i = 1, $size = strlen($tempResult); $i < $size; $i++) {
$checksum = (10 * $checksum + (int) $tempResult[$i]) % 97;
}
$checksum = 98 - $checksum;
if ($checksum < 10) {
$checksum = '0'.$checksum;
}
$checksum = Iban::checksum($countryCode . '00' . $result);

return $countryCode . $checksum . $result;
}
Expand Down
Loading

0 comments on commit 9a2721e

Please sign in to comment.