@deanisy/multi-rubles
Version:
Стоимость прописью с любыми наименованиями валютных единиц
175 lines (139 loc) • 4.29 kB
JavaScript
(function() {
'use strict';
var words = [
[
'', 'один', 'два', 'три', 'четыре', 'пять', 'шесть',
'семь', 'восемь', 'девять', 'десять', 'одиннадцать',
'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',
'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'
],
[
'', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'
],
[
'', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'
]
];
var requiredCurrency;
var toFloat = function(number) {
return parseFloat(number);
};
var plural = function(count, options) {
if (options.length !== 3) {
return false;
}
count = Math.abs(count) % 100;
var rest = count % 10;
if (count > 10 && count < 20) {
return options[2];
}
if (rest > 1 && rest < 5) {
return options[1];
}
if (rest === 1) {
return options[0];
}
return options[2];
};
var parseNumber = function(number, count) {
var first;
var second;
var numeral = '';
if (number.length === 3) {
first = number.substr(0, 1);
number = number.substr(1, 3);
numeral = '' + words[2][first] + ' ';
}
if (number < 20) {
numeral = numeral + words[0][toFloat(number)] + ' ';
} else {
first = number.substr(0, 1);
second = number.substr(1, 2);
numeral = numeral + words[1][first] + ' ' + words[0][second] + ' ';
}
if (count === 0) {
numeral = numeral + plural(number, requiredCurrency[0]);
} else if (count === 1) {
if (numeral !== ' ') {
numeral = numeral + plural(number, ['тысяча ', 'тысячи ', 'тысяч ']);
numeral = numeral.replace('один ', 'одна ').replace('два ', 'две ');
}
} else if (count === 2) {
if (numeral !== ' ') {
numeral = numeral + plural(number, ['миллион ', 'миллиона ', 'миллионов ']);
}
} else if (count === 3) {
numeral = numeral + plural(number, ['миллиард ', 'миллиарда ', 'миллиардов ']);
}
return numeral;
};
var parseDecimals = function(number) {
var text = plural(number, requiredCurrency[1]);
if (number === 0) {
number = '00';
} else if (number < 10) {
number = '0' + number;
}
return ' ' + number + ' ' + text;
};
var rubles = function(number, currency) {
if (!currency) {
requiredCurrency = [['рубль', 'рубля', 'рублей'], ['копейка', 'копейки', 'копеек']];
} else {
requiredCurrency = currency;
}
if (!number) {
return false;
}
var type = typeof number;
if (type !== 'number' && type !== 'string') {
return false;
}
if (type === 'string') {
number = toFloat(number.replace(',', '.'));
if (isNaN(number)) {
return false;
}
}
if (number <= 0) {
return false;
}
var splt;
var decimals;
number = number.toFixed(2);
if (number.indexOf('.') !== -1) {
splt = number.split('.');
number = splt[0];
decimals = splt[1];
}
var numeral = '';
var length = number.length - 1;
var parts = '';
var count = 0;
var digit;
while (length >= 0) {
digit = number.substr(length, 1);
parts = digit + parts;
if ((parts.length === 3 || length === 0) && !isNaN(toFloat(parts))) {
numeral = parseNumber(parts, count) + numeral;
parts = '';
count++;
}
length--;
}
numeral = numeral.replace(/\s+/g, ' ');
if (decimals) {
numeral = numeral + parseDecimals(toFloat(decimals));
}
return numeral;
};
var globals;
if (typeof module !== 'undefined' && module !== null) {
globals = exports;
} else {
globals = window;
}
globals.rubles = rubles;
})();