I was unable to find anywhere a Portuguese national postal service, package registry number check-digit validation. So, I politely asked them and soon after a PDF describing the algorithm was on my desk.
It’s pretty simple and standard stuff (only an awkward multiplier order of each digit), so the best way to describe it’s with a validation function in PHP (even for non PHP users/programmers should be simple to enough to understand at a glance):
function checkDigitCTT($ref) {
if (! preg_match('/^[a-z]{2}[0-9]{9}[a-z]{2}$/i', $ref))
return false;
$digits = substr($ref, 2, 9);
$multipliers = array(8,6,4,2,3,5,9,7);
$tmp = 0;
foreach ($multipliers as $k => $v)
$tmp = $tmp + (((int) $digits[$k]) * $v);
$tmp = round($tmp % 11);
if ($tmp == 0)
$check_digit = 5;
else if ($tmp == 1)
$check_digit = 0;
else
$check_digit = 11 - $tmp;
if ($check_digit == ((int) $digits[8]))
return true;
return false;
}