Skip to content

Instantly share code, notes, and snippets.

@Den2016
Forked from ba-soft/Number2Phrase.js
Created November 17, 2020 04:08
Show Gist options
  • Save Den2016/ae5ad7e36d0d23001c2747cc8b356863 to your computer and use it in GitHub Desktop.
Save Den2016/ae5ad7e36d0d23001c2747cc8b356863 to your computer and use it in GitHub Desktop.
Цифры прописью, js
Number.prototype.toPhrase = function (fem, one, two, three, four, five)
// Число прописью от 0 до 999 триллионов
// 100.toPhrase(false, 'чайник', 'чайника', 'чайника', 'чайника', 'чайников')
{
var x = Math.round((this + Number.EPSILON) * 100) / 100;
if (x < 0 || x > 999999999999999.99) return false;
if (fem === undefined) fem = true;
if (!one) one = 'единица';
if (!two) two = 'единицы';
if (!three) three = 'единицы';
if (!four) four = 'единицы';
if (!five) five = 'единиц';
var groups = new Array();
groups[0] = new Array();
groups[1] = new Array();
groups[2] = new Array();
groups[3] = new Array();
groups[4] = new Array();
// единицы
var currency = 'RUB';
// по умолчанию
groups[0][-1] = {'RUB': five};
//исключения
groups[0][1] = {'RUB': one};
groups[0][2] = {'RUB': two};
groups[0][3] = {'RUB': three};
groups[0][4] = {'RUB': four};
// тысячи
// по умолчанию
groups[1][-1] = 'тысяч';
//исключения
groups[1][1] = 'тысяча';
groups[1][2] = 'тысячи';
groups[1][3] = 'тысячи';
groups[1][4] = 'тысячи';
// миллионы
// по умолчанию
groups[2][-1] = 'миллионов';
//исключения
groups[2][1] = 'миллион';
groups[2][2] = 'миллиона';
groups[2][3] = 'миллиона';
groups[2][4] = 'миллиона';
// миллиарды
// по умолчанию
groups[3][-1] = 'миллиардов';
//исключения
groups[3][1] = 'миллиард';
groups[3][2] = 'миллиарда';
groups[3][3] = 'миллиарда';
groups[3][4] = 'миллиарда';
// триллионы
// по умолчанию
groups[4][-1] = 'триллионов';
//исключения
groups[4][1] = 'триллион';
groups[4][2] = 'триллиона';
groups[4][3] = 'триллиона';
groups[4][4] = 'триллиона';
// цифры и числа
// либо просто строка, либо 4 строки в хэше
var names = new Array();
names[1] = {0: (fem ? 'одна' : 'один'), 1: 'одна', 2: 'один', 3: 'один', 4: 'один'};
names[2] = {0: (fem ? 'две' : 'два'), 1: 'две', 2: 'два', 3: 'два', 4: 'два'};
names[3] = 'три';
names[4] = 'четыре';
names[5] = 'пять';
names[6] = 'шесть';
names[7] = 'семь';
names[8] = 'восемь';
names[9] = 'девять';
names[10] = 'десять';
names[11] = 'одиннадцать';
names[12] = 'двенадцать';
names[13] = 'тринадцать';
names[14] = 'четырнадцать';
names[15] = 'пятнадцать';
names[16] = 'шестнадцать';
names[17] = 'семнадцать';
names[18] = 'восемнадцать';
names[19] = 'девятнадцать';
names[20] = 'двадцать';
names[30] = 'тридцать';
names[40] = 'сорок';
names[50] = 'пятьдесят';
names[60] = 'шестьдесят';
names[70] = 'семьдесят';
names[80] = 'восемьдесят';
names[90] = 'девяносто';
names[100] = 'сто';
names[200] = 'двести';
names[300] = 'триста';
names[400] = 'четыреста';
names[500] = 'пятьсот';
names[600] = 'шестьсот';
names[700] = 'семьсот';
names[800] = 'восемьсот';
names[900] = 'девятьсот';
var r = '';
var i, j;
var y = Math.floor(x);
// если НЕ ноль
if (y > 0) {
// выделим тройки с ед., тыс., миллионами, миллиардами и триллионами
var t = new Array();
for (i = 0; i <= 4; i++) {
t[i] = y % 1000;
y = Math.floor(y / 1000);
}
var d = new Array();
// выделим в каждой тройке сотни, десятки и единицы
for (i = 0; i <= 4; i++) {
d[i] = new Array();
d[i][0] = t[i] % 10; // единицы
d[i][10] = t[i] % 100 - d[i][0]; // десятки
d[i][100] = t[i] - d[i][10] - d[i][0]; // сотни
d[i][11] = t[i] % 100; // две правых цифры в виде числа
}
for (i = 4; i >= 0; i--) {
if (t[i] > 0) {
if (names[d[i][100]])
r += ' ' + ((typeof (names[d[i][100]]) == 'object') ? (names[d[i][100]][i]) : (names[d[i][100]]));
if (names[d[i][11]])
r += ' ' + ((typeof (names[d[i][11]]) == 'object') ? (names[d[i][11]][i]) : (names[d[i][11]]));
else {
if (names[d[i][10]])
r += ' ' + ((typeof (names[d[i][10]]) == 'object') ? (names[d[i][10]][i]) : (names[d[i][10]]));
if (names[d[i][0]])
r += ' ' + ((typeof (names[d[i][0]]) == 'object') ? (names[d[i][0]][i]) : (names[d[i][0]]));
}
if (names[d[i][11]]) // если существует числительное
j = d[i][11];
else
j = d[i][0];
if (groups[i][j]) {
if (i == 0)
r += ' ' + groups[i][j][currency];
else
r += ' ' + groups[i][j];
} else {
if (i == 0)
r += ' ' + groups[i][-1][currency];
else
r += ' ' + groups[i][-1];
}
}
}
if (t[0] == 0)
r += ' ' + groups[0][-1][currency];
} else
r = 'ноль ' + groups[0][-1][currency];
return r.trim();
};
Number.prototype.toMoneyPhrase = function (c)
// Сумма прописью для чисел от 0 до 999 триллионов, можно передать параметр "валюта": RUB,USD,EUR (по умолчанию RUB)
// 100500.toMoneyPhrase('EUR')
{
var x = Math.round((this + Number.EPSILON) * 100) / 100;
if (x < 0 || x > 999999999999999.99) return false;
var currency = 'RUB';
if (typeof (c) == 'string')
currency = c.trimAll().toUpperCase();
if (currency == 'RUR') currency = 'RUB';
if (currency != 'RUB' && currency != 'USD' && currency != 'EUR')
return false;
var groups = new Array();
groups[0] = new Array();
groups[1] = new Array();
groups[2] = new Array();
groups[3] = new Array();
groups[4] = new Array();
groups[9] = new Array();
// рубли
// по умолчанию
groups[0][-1] = {'RUB': 'рублей', 'USD': 'долларов США', 'EUR': 'евро'};
//исключения
groups[0][1] = {'RUB': 'рубль', 'USD': 'доллар США', 'EUR': 'евро'};
groups[0][2] = {'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
groups[0][3] = {'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
groups[0][4] = {'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
// тысячи
// по умолчанию
groups[1][-1] = 'тысяч';
//исключения
groups[1][1] = 'тысяча';
groups[1][2] = 'тысячи';
groups[1][3] = 'тысячи';
groups[1][4] = 'тысячи';
// миллионы
// по умолчанию
groups[2][-1] = 'миллионов';
//исключения
groups[2][1] = 'миллион';
groups[2][2] = 'миллиона';
groups[2][3] = 'миллиона';
groups[2][4] = 'миллиона';
// миллиарды
// по умолчанию
groups[3][-1] = 'миллиардов';
//исключения
groups[3][1] = 'миллиард';
groups[3][2] = 'миллиарда';
groups[3][3] = 'миллиарда';
groups[3][4] = 'миллиарда';
// триллионы
// по умолчанию
groups[4][-1] = 'триллионов';
//исключения
groups[4][1] = 'триллион';
groups[4][2] = 'триллиона';
groups[4][3] = 'триллиона';
groups[4][4] = 'триллиона';
// копейки
// по умолчанию
groups[9][-1] = {'RUB': 'копеек', 'USD': 'центов', 'EUR': 'центов'};
//исключения
groups[9][1] = {'RUB': 'копейка', 'USD': 'цент', 'EUR': 'цент'};
groups[9][2] = {'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
groups[9][3] = {'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
groups[9][4] = {'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
// цифры и числа
// либо просто строка, либо 4 строки в хэше
var names = new Array();
names[1] = {0: 'один', 1: 'одна', 2: 'один', 3: 'один', 4: 'один'};
names[2] = {0: 'два', 1: 'две', 2: 'два', 3: 'два', 4: 'два'};
names[3] = 'три';
names[4] = 'четыре';
names[5] = 'пять';
names[6] = 'шесть';
names[7] = 'семь';
names[8] = 'восемь';
names[9] = 'девять';
names[10] = 'десять';
names[11] = 'одиннадцать';
names[12] = 'двенадцать';
names[13] = 'тринадцать';
names[14] = 'четырнадцать';
names[15] = 'пятнадцать';
names[16] = 'шестнадцать';
names[17] = 'семнадцать';
names[18] = 'восемнадцать';
names[19] = 'девятнадцать';
names[20] = 'двадцать';
names[30] = 'тридцать';
names[40] = 'сорок';
names[50] = 'пятьдесят';
names[60] = 'шестьдесят';
names[70] = 'семьдесят';
names[80] = 'восемьдесят';
names[90] = 'девяносто';
names[100] = 'сто';
names[200] = 'двести';
names[300] = 'триста';
names[400] = 'четыреста';
names[500] = 'пятьсот';
names[600] = 'шестьсот';
names[700] = 'семьсот';
names[800] = 'восемьсот';
names[900] = 'девятьсот';
var r = '';
var i, j;
var y = Math.floor(x);
// если НЕ ноль рублей
if (y > 0) {
// выделим тройки с руб., тыс., миллионами, миллиардами и триллионами
var t = new Array();
for (i = 0; i <= 4; i++) {
t[i] = y % 1000;
y = Math.floor(y / 1000);
}
var d = new Array();
// выделим в каждой тройке сотни, десятки и единицы
for (i = 0; i <= 4; i++) {
d[i] = new Array();
d[i][0] = t[i] % 10; // единицы
d[i][10] = t[i] % 100 - d[i][0]; // десятки
d[i][100] = t[i] - d[i][10] - d[i][0]; // сотни
d[i][11] = t[i] % 100; // две правых цифры в виде числа
}
for (i = 4; i >= 0; i--) {
if (t[i] > 0) {
if (names[d[i][100]])
r += ' ' + ((typeof (names[d[i][100]]) == 'object') ? (names[d[i][100]][i]) : (names[d[i][100]]));
if (names[d[i][11]])
r += ' ' + ((typeof (names[d[i][11]]) == 'object') ? (names[d[i][11]][i]) : (names[d[i][11]]));
else {
if (names[d[i][10]]) r += ' ' + ((typeof (names[d[i][10]]) == 'object') ? (names[d[i][10]][i]) : (names[d[i][10]]));
if (names[d[i][0]]) r += ' ' + ((typeof (names[d[i][0]]) == 'object') ? (names[d[i][0]][i]) : (names[d[i][0]]));
}
if (names[d[i][11]]) // если существует числительное
j = d[i][11];
else
j = d[i][0];
if (groups[i][j]) {
if (i == 0)
r += ' ' + groups[i][j][currency];
else
r += ' ' + groups[i][j];
} else {
if (i == 0)
r += ' ' + groups[i][-1][currency];
else
r += ' ' + groups[i][-1];
}
}
}
if (t[0] == 0)
r += ' ' + groups[0][-1][currency];
} else
r = 'Ноль ' + groups[0][-1][currency];
y = Math.round(((x - Math.floor(x)) * 100));
if (y < 10) y = '0' + y;
r = r.trim();
r = r.substr(0, 1).toUpperCase() + r.substr(1);
r += ' ' + y;
y = y * 1;
if (names[y]) // если существует числительное
j = y;
else
j = y % 10;
return r;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment