Skip to content

Instantly share code, notes, and snippets.

@nikhil-bhandari
Created February 24, 2017 09:26
Show Gist options
  • Save nikhil-bhandari/02bc6e092264483a0601f2f38ecee37b to your computer and use it in GitHub Desktop.
Save nikhil-bhandari/02bc6e092264483a0601f2f38ecee37b to your computer and use it in GitHub Desktop.

Revisions

  1. nikhil-bhandari created this gist Feb 24, 2017.
    59 changes: 59 additions & 0 deletions validate-person-number.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    // Code to validate swedish person number
    // Based on logic on wikipedia
    // https://en.wikipedia.org/wiki/Personal_identity_number_(Sweden)#Checksum

    function validate(number) {
    var personNumber = removeNonNumericChars(number);
    if (personNumber.length != 10 && personNumber.length != 12) {
    return console.log("Asa") && false;
    }
    var digits = personNumber.split("");
    var checksum = digits.pop();

    var sumOf9Digits = digits
    .map(function (item, index) {
    var result;
    if (index % 2 == 0) {
    result = singleDigiSum(item * 2);
    } else {
    result = singleDigiSum(item);
    }
    return result;
    })
    .reduce(sum, 0);

    var lastDigitOfSum = sumOf9Digits % 10;

    return checksum == (10 - lastDigitOfSum);
    }

    function removeNonNumericChars(number){
    return number.toString().replace(/\D/g,'');
    }

    function sumOfDigits(number) {
    return number
    .toString()
    .split('')
    .map(Number)
    .reduce(sum, 0);
    }

    function singleDigiSum(num) {
    while (numDigits(num) != 1) {
    num = sumOfDigits(num)
    }
    return num;
    }

    function numDigits(x) {
    return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
    }

    function sum(a, b) {
    return +a + (+b);
    }

    validate("8112289874");
    validate("1602079954");
    validate("1001018702");