Проверка делимости валидационными средствами в JavaScript обычно реализуется на уровне пользовательских правил, поскольку стандартная библиотека Validator.js ориентирована на проверку форматов строковых данных (email, URL, числовые строки, длины и диапазоны), а не на математические операции. Тем не менее, механизм расширения позволяет встроить любые арифметические условия, включая проверку делимости чисел.
Validator.js работает преимущественно со строками. Это принципиально важно, поскольку входные данные часто поступают из HTTP-запросов, форм HTML или JSON, где числа представлены текстом.
Основные методы предварительной проверки:
Пример базовой подготовки данных:
const validator = require('validator');
const value = "42";
if (validator.isNumeric(value)) {
const number = parseInt(value, 10);
}
Проверка делимости сводится к математической операции остатка от деления. Условие делимости формулируется как:
число делится на N, если остаток от деления равен 0
const validator = require('validator');
function isDivisible(value, divisor) {
if (!validator.isInt(value)) {
return false;
}
const number = parseInt(value, 10);
if (divisor === 0) {
return false;
}
return number % divisor === 0;
}
Функция учитывает два ключевых аспекта:
Validator.js позволяет формировать слой абстракции поверх стандартных проверок. Обычно это реализуется через собственные модули валидации.
Пример композиции правил:
function validateUserInput(value) {
return validator.isNumeric(value) && isDivisible(value, 5);
}
В данном случае проверяется, что значение:
Стандартный Number в JavaScript имеет ограничения
точности. При работе с большими значениями используется
BigInt.
Расширенная версия проверки:
function isDivisibleBig(value, divisor) {
try {
const bigValue = BigInt(value);
const bigDivisor = BigInt(divisor);
if (bigDivisor === 0n) {
return false;
}
return bigValue % bigDivisor === 0n;
} catch (e) {
return false;
}
}
Особенности реализации:
BigInt исключает переполнение% работает аналогично числовому типуПри построении систем валидации входных данных логика делимости часто комбинируется с другими ограничениями.
Пример комплексного правила:
function validateTransaction(value) {
return (
validator.isInt(value, { min: 1 }) &&
isDivisible(value, 100)
);
}
Такая конструкция используется, например, при проверке:
Некоторые правила делимости можно реализовать без операции деления, что повышает производительность при массовой обработке данных.
function isDivisibleBy2(value) {
return validator.isInt(value) && parseInt(value, 10) % 2 === 0;
}
function isDivisibleBy10(value) {
return validator.isInt(value) && value.endsWith("0");
}
function isDivisibleBy3(value) {
if (!validator.isInt(value)) return false;
const sum = value
.split("")
.filter(char => char >= "0" && char <= "9")
.reduce((acc, digit) => acc + Number(digit), 0);
return sum % 3 === 0;
}
Такой подход уменьшает зависимость от арифметики больших чисел и используется в оптимизированных сценариях.
Типичные ошибки при проверке делимости:
Защитный слой:
function safeIsDivisible(value, divisor) {
if (!validator.isNumeric(value)) {
return false;
}
if (!validator.isInt(value)) {
return false;
}
const num = Number(value);
if (!Number.isFinite(num)) {
return false;
}
if (divisor === 0) {
return false;
}
return num % divisor === 0;
}
При обработке больших массивов данных важно минимизировать:
Оптимизированный вариант:
function isDivisibleFast(value, divisor) {
const num = Number(value);
if (!Number.isInteger(num)) {
return false;
}
return num % divisor === 0;
}
Такая реализация применяется в потоковой обработке данных и серверных API с высокой нагрузкой.
В системах валидации часто формируется последовательность проверок, где делимость является финальным условием.
Пример логики:
function validateStep(value) {
if (!validator.isInt(value, { min: 10, max: 1000 })) {
return false;
}
if (!isDivisible(value, 7)) {
return false;
}
return true;
}
Такая структура обеспечивает детерминированную обработку входных данных и упрощает трассировку ошибок валидации.