775ac7b58c
you must login with an BTP account in order to see the app
60 lines
No EOL
1.5 KiB
JavaScript
60 lines
No EOL
1.5 KiB
JavaScript
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;
|
|
} |