Для тех, кто просто хочет скопировать и вставить работающее (функциональное) решение в 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);
};
Это работает, потому что модуль является дистрибутивным по отношению к сложению, вычитанию и умножению:
- (a+b)%m = ((a%m)+(b%m))%m
- (a-b)%m = ((a%m)-(b%m))%m
- (ab)%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;
};
person
Ph. Wiget
schedule
19.07.2017