import assertString from './util/assertString'; var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; // this link details how the check digit is calculated: // https://www.isin.org/isin-format/. it is a little bit // odd in that it works with digits, not numbers. in order // to make only one pass through the ISIN characters, the // each alpha character is handled as 2 characters within // the loop. export default function isISIN(str) { assertString(str); if (!isin.test(str)) { return false; } var _double = true; var sum = 0; // convert values for (var i = str.length - 2; i >= 0; i--) { if (str[i] >= 'A' && str[i] <= 'Z') { var value = str[i].charCodeAt(0) - 55; var lo = value % 10; var hi = Math.trunc(value / 10); // letters have two digits, so handle the low order // and high order digits separately. for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) { var digit = _arr[_i]; if (_double) { if (digit >= 5) { sum += 1 + (digit - 5) * 2; } else { sum += digit * 2; } } else { sum += digit; } _double = !_double; } } else { var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0); if (_double) { if (_digit >= 5) { sum += 1 + (_digit - 5) * 2; } else { sum += _digit * 2; } } else { sum += _digit; } _double = !_double; } } var check = Math.trunc((sum + 9) / 10) * 10 - sum; return +str[str.length - 1] === check; }