/**
* JANのチェックデジットを検証し、[成功?, メッセージ] を返す
*/
function validate_jan($jan): array
{
$match = preg_match('|^(\d{12})(\d)$|', $jan, $matches);
if (!$match) {
return [false, '桁数エラー'];
}
$chars = str_split($matches[1]);
$odd_total = 0;
$even_total = 0;
foreach ($chars as $i => $v) {
if ($i % 2 == 0) {
// 0スタートなので0は奇数桁
$odd_total += $v;
} else {
$even_total += $v;
}
}
$total = $even_total * 3 + $odd_total;
$digit = (10 - ($total % 10)) % 10;
if ($matches[2] != $digit) {
return [false, "チェックディジットが不一致。本来は {$digit}"];
}
return [true, ""];
}
コメント