Skip to content

Instantly share code, notes, and snippets.

@freak4pc
Last active May 21, 2024 11:53
Show Gist options
  • Save freak4pc/6802be89d019bca57756a675d761c5a8 to your computer and use it in GitHub Desktop.
Save freak4pc/6802be89d019bca57756a675d761c5a8 to your computer and use it in GitHub Desktop.
Israeli ID Validator (Javascript)
function isValidIsraeliID(id) {
var id = String(id).trim();
if (id.length > 9 || id.length < 5 || isNaN(id)) return false;
// Pad string with zeros up to 9 digits
id = id.length < 9 ? ("00000000" + id).slice(-9) : id;
return Array
.from(id, Number)
.reduce((counter, digit, i) => {
const step = digit * ((i % 2) + 1);
return counter + (step > 9 ? step - 9 : step);
}) % 10 === 0;
}
// Usage
["1234567890","001200343", "231740705", "339677395"].map(function(e) {
console.log(e + " is " + (isValidIsraeliID(e) ? "a valid" : "an invalid") + " Israeli ID");
});
// Outputs:
// 1234567890 is an invalid Israeli ID
// 001200343 is an invalid Israeli ID
// 231740705 is a valid Israeli ID
// 339677395 is a valid Israeli ID
extension String {
func isValidIsraeliID() -> Bool {
let trimmed = trimmingCharacters(in: .whitespacesAndNewlines)
let isNumeric = rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
guard 1...9 ~= trimmed.count,
isNumeric else { return false }
let neededZeros = 9 - trimmed.count
let tested = String(repeating: "0", count: neededZeros) + trimmed
return tested.enumerated()
.reduce(into: 0) { counter, args in
let (idx, char) = args
guard let digit = char.wholeNumberValue else { return }
let step = digit * ((idx % 2) + 1)
counter += step > 9 ? step - 9 : step
} % 10 == 0
}
}
@freak4pc
Copy link
Author

Updated based on your comments. Thanks guys ! @davidfeldi @benjamingr .

@theyuv
Copy link

theyuv commented Nov 22, 2017

Hey, do you have code for company id numbers as well?
Or maybe just know what the basic rules are for those?

Thanks.

@adi518
Copy link

adi518 commented Apr 12, 2018

This is an ancient algo that's present many years: https://gist.github.com/adi518/84214b150357291e7523179c331f3bc1

I slightly updated it, but it misses padding. My point though, does it differ logic-wise? If not, I guess you should put yours on npm. There's one entry on npm atm, but it lacks padding and source is not as good. :)

@adi518
Copy link

adi518 commented Apr 15, 2018

Don't need var here: var id = String(id).trim();.

@landesm
Copy link

landesm commented Jan 30, 2021

hello, is there anyway to turn this into a regexp ?
thanks

@freak4pc
Copy link
Author

@landesm Don't see how. Regex is for matching, not complex computation.

@matantech
Copy link

@freak4pc
Thank you for the swift version!

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