This repository has been archived by the owner on Dec 11, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor IBAN checksum to calculator class, Add unit tests
- Loading branch information
Showing
4 changed files
with
484 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.