Number.prototype.decline = function(w1, w2, w5, complex) {
var nn = this.valueOf() % 100, n = nn % 10;
var w = n > 4 || n === 0 || nn - n === 10 ? w5 : (n === 1 ? w1 : w2);
return complex === false ? w : (this.toString() + ' ' + w);
};
days.decline('день', 'дня', 'дней'); // для days = 23 вернёт строку "23 дня"
Иногда возникает необходимость вывести слово в нужной форме без числа. Например, число должно быть внутри какого-нибудь тега, или хочется показать его в виде числительного. В таком случае пригодится необязательный аргумент complex.
days.decline('день', 'дня', 'дней', false); // а так получится "дня"
String.prototype.absorb = function(data) {
var h = typeof data === 'object';
var parts = h ? data : arguments;
return this.replace(/\{(\w+)\}/g, function(s, key) {
return parts[h ? key : Number(key)];
});
};
Для того, чтобы подставить данные в шаблон, есть известная функция supplant. Она всем хороша, кроме необходимости передавать эти данные в виде объекта, что не всегда удобно. Поэтому я написал свою функцию, которая может использовать как объект, так и простой набор аргументов.
var template = 'от {from} до {to}';
var data = {from: 'А', to: 'Я'};
template.absorb(data); // удобно, если есть готовый объект
var template = 'от {0} до {1}';
template.absorb('А', 'Я'); // а если объекта нет, можно и так
Number.prototype.constrain = function(min, max) {
var n = this.valueOf();
return (n < min) ? min : ((n > max) ? max : n);
};
n.constrain(0, 10); // вернёт число от 0 до 10 при любом значении n