КодSEOБлогИное

Сумма прописью в рублях или другой единице

Две тысячи пять рублей 00 копеек

<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 нужна для правильного склонения: не «два книги», а «две книги»
  }
Все комментарии