<script> alert( sum_letters(2005) ); // вызов функции function num_letters(k, d) { // целое число прописью, это основа var i = '', e = [ ['','тысяч','миллион','миллиард','триллион','квадриллион','квинтиллион','секстиллион','септиллион','октиллион','нониллион','дециллион'], ['а','и',''], ['','а','ов'] ]; if (k == '' || k == '0') return ' ноль'; // 0 k = k.split(/(?=(?:\d{3})+$)/); // разбить число в массив с трёхзначными числами if (k[0].length == 1) k[0] = '00'+k[0]; if (k[0].length == 2) k[0] = '0'+k[0]; for (var j = (k.length - 1); j >= 0; j--) { // соединить трёхзначные числа в одно число, добавив названия разрядов с окончаниями if (k[j] != '000') { i = (((d && j == (k.length - 1)) || j == (k.length - 2)) && (k[j][2] == '1' || k[j][2] == '2') ? t(k[j],1) : t(k[j])) + declOfNum(k[j], e[0][k.length - 1 - j], (j == (k.length - 2) ? e[1] : e[2])) + i; } } function t(k, d) { // преобразовать трёхзначные числа var e = [ ['',' один',' два',' три',' четыре',' пять',' шесть',' семь',' восемь',' девять'], [' десять',' одиннадцать',' двенадцать',' тринадцать',' четырнадцать',' пятнадцать',' шестнадцать',' семнадцать',' восемнадцать',' девятнадцать'], ['','',' двадцать',' тридцать',' сорок',' пятьдесят',' шестьдесят',' семьдесят',' восемьдесят',' девяносто'], ['',' сто',' двести',' триста',' четыреста',' пятьсот',' шестьсот',' семьсот',' восемьсот',' девятьсот'], ['',' одна',' две'] ]; return e[3][k[0]] + (k[1] == 1 ? e[1][k[2]] : e[2][k[1]] + (d ? e[4][k[2]] : e[0][k[2]])); } return i; } function declOfNum(n, t, o) { // склонение именительных рядом с числительным: число (typeof = string), корень (не пустой), окончание var k = [2,0,1,1,1,2,2,2,2,2]; return (t == '' ? '' : ' ' + t + (n[n.length-2] == "1"?o[2]:o[k[n[n.length-1]]])); } function razUp(e) { // сделать первую букву заглавной и убрать лишний первый пробел return e[1].toUpperCase() + e.substring(2); } function sum_letters(a) { a = Number(a).toFixed(2).split('.'); // округлить до сотых и сделать массив двух чисел: до точки и после неё return razUp(num_letters(a[0]) + declOfNum(a[0], 'рубл', ['ь','я','ей']) + ' ' + a[1] + declOfNum(a[1], 'копе', ['йка','йки','ек'])); } </script>
При необходимости выделенный участок заменить на требуемые значения, например:
function sum_letters(a) { a = a.toString(); // число в строку, в примере выше это делает split return razUp(num_letters(a,1) + declOfNum(a, 'книг', ['а','и',''])); // 1 нужна для правильного склонения: не «два книги», а «две книги» }