/** * Rubles in words. No external services or permissions. * @param {number|number[][]} value Amount or range (0..999999999999.99). * @return {string|string[][]} Russian rubles and kopeks. * @customfunction */ function SUMMA_RU(value) { if (Array.isArray(value)) return value.map(function(row) { return row.map(SUMMA_RU); }); if (value === '' || value === null) return ''; if (typeof value !== 'number' || !isFinite(value) || value < 0 || value >= 1000000000000) return 'Введите число от 0 до 999999999999,99'; var total = Math.round((value + Number.EPSILON) * 100); if (total >= 100000000000000) return 'Сумма после округления превышает предел'; var whole = Math.floor(total / 100), cents = total % 100; var plural = function(n) { var h = n % 100, t = n % 10; return h >= 11 && h <= 19 ? 2 : (t === 1 ? 0 : (t >= 2 && t <= 4 ? 1 : 2)); }; var ones = ['','один','два','три','четыре','пять','шесть','семь','восемь','девять']; var tens = ['','','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто']; var teens = ['десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать']; var hundreds = ['','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот']; var scales = [[],['тысяча','тысячи','тысяч'],['миллион','миллиона','миллионов'],['миллиард','миллиарда','миллиардов']]; var n = whole, group = 0, result = []; while (n > 0) { var chunk = n % 1000; if (chunk) { var words = [], h = Math.floor(chunk / 100), r = chunk % 100, u = r % 10; if (h) words.push(hundreds[h]); if (r >= 10 && r <= 19) words.push(teens[r - 10]); else { if (r >= 20) words.push(tens[Math.floor(r / 10)]); if (u) words.push(group === 1 && u <= 2 ? ['','одна','две'][u] : ones[u]); } if (group) words.push(scales[group][plural(chunk)]); result.unshift(words.join(' ')); } n = Math.floor(n / 1000); group++; } var output = (result.length ? result.join(' ') : 'ноль') + ' ' + ['рубль','рубля','рублей'][plural(whole)] + ' ' + ('0' + cents).slice(-2) + ' ' + ['копейка','копейки','копеек'][plural(cents)]; return output.charAt(0).toUpperCase() + output.slice(1); }