Skip to content

Instantly share code, notes, and snippets.

@freak4pc
Last active June 17, 2024 16:19
Show Gist options
  • Select an option

  • Save freak4pc/6802be89d019bca57756a675d761c5a8 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
Author

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

@theyuv

theyuv commented Nov 22, 2017

Copy link
Copy Markdown

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

Thanks.

@adi-works

adi-works commented Apr 12, 2018

Copy link
Copy Markdown

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. :)

@adi-works

Copy link
Copy Markdown

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

@landesm

landesm commented Jan 30, 2021

Copy link
Copy Markdown

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

@freak4pc

Copy link
Copy Markdown
Author

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

@matantech

Copy link
Copy Markdown

@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