Skip to content

Instantly share code, notes, and snippets.

@wvanderdeijl
Last active August 8, 2022 11:20
Show Gist options
  • Save wvanderdeijl/176960eba2b75d644351eada2d5aa75b to your computer and use it in GitHub Desktop.
Save wvanderdeijl/176960eba2b75d644351eada2d5aa75b to your computer and use it in GitHub Desktop.
Werkgeversnummer valideren met typescript
/**
* Damm algorithm is a check digit algorithm that detects all single-digit errors and all adjacent transposition errors
* https://en.wikipedia.org/wiki/Damm_algorithm
*
* Live typescript playground at: https://www.typescriptlang.org/play?ssl=33&ssc=1&pln=1&pc=1#code/PQKhCgAIUgRBDAtoy8A2BzA9gJwJYAuAFingM6qQDGRAplQNaQAmeGhqmuhJkx8BFrQL0CFdGkhk8AOwxpaAWlbtBtHDlziZzTpPjMAVvCq0ZggjngyyAByzSCeLDMjrNOMlBhECBW2QAXMDAZgB0AO54DHi2tKzwYbgYwFExwAjIAPro2PjEiN7A4FQuZIJYcVZOLgAq8ABGCpAAvJAA2lCQ3e0ADAA0kADMgwCMgwDsgwCsgwCcgwAcgwBsgwAsgwBMALr9XT1TkAOQC5BbYzMbS6uDQ3sHHZvngydrkMuQR+PDV6cP3R6PyOs2O8xuv0gzwukBWAMB7XePxhIzBUL+ZyOi3hPVR7yO0Ne4MgoM+oxxHVJt1Ok22RMgP1R6wp7U+Z2eoLxdLRwJZ7LuEKRtJeaOmLJhVIZ10h+OJvQeOwA3OBwKAINBIAA1dB4ZgCWiUdgANzMkBkAFdEA11JBzdI5JBCAByCiwACCAFkPdQ6IwWGxCGFvJAAAI4YTmnA2Pg4c0GvAAMzNlutOEdFCNOuYgwT6DIBqwxHUUXzQegxQT5pkVBqrhN+ATAE9MogAMK+hiwAMEAAUsls5oIgSkllkGAAlJAAN6PcMESOuHuPQGQYAAPQAOswp0MAL4bsJbnf7w-b0a7gAkwDCInKfZkA4Ik4AZM-l4D+4P3yvumFw7Y0BMWge2AA9gAwQYnSdcdvx-MI7DQQgeygmCfzQyA-3ic1TB7HtNAiQYVEIScWgAPkgSp1AEZwZHqJpaHafCdnaABqIiCD2Y4SJaNpekecdlV3FVShsLAFDCNAsAwHt60TZskDbDsu1UZDRi2IYwnWaYVjCFZoIE8AgA
*/
const operationTable = [
[0, 3, 1, 7, 5, 9, 8, 6, 4, 2],
[7, 0, 9, 2, 1, 5, 4, 8, 6, 3],
[4, 2, 0, 6, 8, 7, 1, 3, 5, 9],
[1, 7, 5, 0, 9, 8, 3, 4, 2, 6],
[6, 1, 2, 3, 0, 4, 5, 9, 7, 8],
[3, 6, 7, 4, 2, 0, 9, 5, 8, 1],
[5, 8, 6, 9, 7, 2, 0, 1, 3, 4],
[8, 9, 4, 5, 3, 6, 2, 0, 1, 7],
[9, 4, 3, 8, 6, 1, 7, 2, 0, 5],
[2, 5, 8, 1, 4, 3, 6, 7, 9, 0],
];
/**
* Validate a given number using it's DAMM check digit.
* @returns true if number is valid, false otherwise.
*/
function verifyDammCheckDigit(input: string) {
return (
/^[1-9]\d{2}\.\d{3}\.\d{1}$/.test(input) && // adjust regex for different type of numbers
input
.replace(/\./g, '') // strip all . characters from input
.split('') // split input string in individual characters/digits
.reduce((row, digit) => operationTable[row][+digit], 0) === 0 // use each digit as column index and use outcome as next row index
);
}
console.log(verifyDammCheckDigit('123.456.6'));
@MarcelOldenkamp
Copy link

Het regex patroon op regel 26 moet zijn /^[1-9]\d{2}\.\d{3}\.\d$/ (nummer mag niet met 0 beginnen)

@wvanderdeijl
Copy link
Author

Het regex patroon op regel 26 moet zijn /^[1-9]\d{2}\.\d{3}\.\d$/ (nummer mag niet met 0 beginnen)

Thanks. Opgelost.

@wvanderdeijl
Copy link
Author

wvanderdeijl commented May 20, 2022

Deze controle is trouwens voor het formaat 999.999.9, maar de regex kan aangepast worden voor kortere/langere nummers, zoals bijvoorbeeld /^[1-9]\d{2}\.\d{3}\.\d{3}$/ voor 999.999.999. De controle gaat er wel vanuit dat het laatste cijfer het controlegetal is.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment