Skip to content

Instantly share code, notes, and snippets.

@osvik
Last active March 23, 2024 15:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osvik/7a1d379e2f666d18c3bf89170471b689 to your computer and use it in GitHub Desktop.
Save osvik/7a1d379e2f666d18c3bf89170471b689 to your computer and use it in GitHub Desktop.
Functions to validate Portuguese Citizen Card, JavaScript and PHP
const validator = {
/**
* Validates Portuguese citizen card
* @param {string} value For example 15697354 5 ZZ1
* @returns {boolean}
*/
portugueseCitizenCard: function (value) {
const letterValue = {
A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, G: 16, H: 17, I: 18, J: 19,
K: 20, L: 21, M: 22, N: 23, O: 24, P: 25, Q: 26, R: 27, S: 28, T: 29,
U: 30, V: 31, W: 32, X: 33, Y: 34, Z: 35
};
let ccNumber = value.replace(/-|\s/g, '');
ccNumber = ccNumber.toUpperCase();
ccNumber = ccNumber.split('').reverse();
ccNumber[1] = letterValue[ccNumber[1]];
ccNumber[2] = letterValue[ccNumber[2]];
let sum = 0;
for (let i = 0; i < ccNumber.length; i++) {
let dum = 0;
if (i % 2 === 0) {
dum = parseInt(ccNumber[i], 10);
} else {
dum = parseInt(ccNumber[i], 10) * 2;
if (dum >= 10) {
dum -= 9;
}
}
sum += dum;
}
return sum % 10 === 0;
},
};
// validator.portugueseCitizenCard("15697354-5-ZZ1")
// validator.portugueseCitizenCard("15697354 5 ZZ1")
<?php
/**
* Validates citizen card
* @param {string} value For example 15697354 5 ZZ1
* @returns {boolean}
*/
function portugueseCitizenCard($number)
{
$letterValue = array(
'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15, 'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19,
'K' => 20, 'L' => 21, 'M' => 22, 'N' => 23, 'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, 'S' => 28, 'T' => 29,
'U' => 30, 'V' => 31, 'W' => 32, 'X' => 33, 'Y' => 34, 'Z' => 35
);
$ccNumber = preg_replace('/[-\s]/', '', $number);
$ccNumber = strtoupper($ccNumber);
$ccNumber = str_split(strrev($ccNumber));
$ccNumber[1] = $letterValue[$ccNumber[1]];
$ccNumber[2] = $letterValue[$ccNumber[2]];
$sum = 0;
foreach ($ccNumber as $key => $value) {
$dum = 0;
if ($key % 2 === 0) {
$dum = intval($value);
} else {
$dum = intval($value) * 2;
if ($dum >= 10) {
$dum -= 9;
}
}
$sum += $dum;
}
return $sum % 10 === 0;
}
// var_dump(portugueseCitizenCard('15697354-5-ZZ1'));
// var_dump(portugueseCitizenCard('15697354 5 ZZ1'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment