Для тех, кто просто хочет скопировать и вставить рабочее (функциональное) решение в ES6 для проверки IBAN:
function isIBAN(s){
const rearranged = s.substring(4,s.length) + s.substring(0,4);
const numeric = Array.from(rearranged).map(c =>(isNaN(parseInt(c)) ? (c.charCodeAt(0)-55).toString() : c)).join('');
const remainder = Array.from(numeric).map(c => parseInt(c)).reduce((remainder, value) => (remainder * 10 + value) % 97,0);
return remainder === 1;}
Вы могли бы даже написать это как однострочник.
Операция по модулю выполняется над массивом целых чисел, в котором хранится фактическое число (divident
, применяемое как строка в функции):
function modulo(divident, divisor){
return Array.from(divident).map(c => parseInt(c)).reduce((remainder, value) => (remainder * 10 + value) % divisor,0);
};
Это работает, потому что Modulo является дистрибутивным по сложению, вычитанию и умножению:
- (a + b)% m = ((a% m) + (b% m))% m
- (a-b)% m = ((a% m) - (b% m))% m
- (a b)% m = ((a% m) (b% m))% m
Функция IBAN, переданная в ES5, выглядит следующим образом:
function (s) {
var rearranged = s.substring(4, s.length) + s.substring(0, 4);
var numeric = Array.from(rearranged).map(function (c) { return (isNaN(parseInt(c)) ? (c.charCodeAt(0) - 55).toString() : c); }).join('');
var remainder = Array.from(numeric).map(function (c) { return parseInt(c); }).reduce(function (remainder, value) { return (remainder * 10 + value) % 97; }, 0);
return remainder === 1;
};