Created
August 28, 2023 12:21
-
-
Save rozanovz/c286eba51b8d738255bf7707cda01720 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // преобразовать трёхзначные числа | |
| const t = (k, d) => { | |
| var e = [ | |
| ["", " одна", " дві", " три", " чотири", " пʼять", " шість", " сім", " вісім", " девʼять"], | |
| [" десять", " одинадцять", " дванадцять", " тринадцять", " чотирнадцять", " пʼятнадцять", " шістнадцять", " сімнадцять", " вісімнадцять", " девяʼятнадцять"], | |
| ["", "", " двадцять", " тридцять", " сорок", " пʼятдесят", " шестдесят", " семдесят", " вісемдесят", " девʼяносто"], | |
| ["", " сто", " двісті", " триста", " чотириста", " пʼятьсот", " шістсот", " сімсот", " вісімсот", " девʼятьсот"], | |
| ["", " одна", " дві"], | |
| ]; | |
| // should be == sign instead of === | |
| 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]])) | |
| ); | |
| } | |
| const num_letters = (k, d) => { | |
| // целое число прописью, это основа | |
| var i = "", | |
| e = [ | |
| ["", "тисяч", "мільйон", "мільярд", "триліон" ], | |
| ["а", "і", ""], | |
| ["", "а", "ов"], | |
| ]; | |
| if (k === "" || k === "0" || k === 0) return " нуль"; | |
| 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; | |
| } | |
| } | |
| return i; | |
| } | |
| // склонение именительных рядом с числительным: число (typeof = string), корень (не пустой), окончание | |
| const declOfNum = (n, t, o) => { | |
| 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); | |
| } | |
| const sum_letters = (a) => { | |
| a = Number(a).toFixed(2).split("."); // округлить до сотых и сделать массив двух чисел: до точки и после неё | |
| return razUp( | |
| num_letters(a[0]) + | |
| declOfNum(a[0], "грив", ["ня", "ні", 'eнь']) + | |
| " " + | |
| a[1] + | |
| declOfNum(a[1], "копі", ["йка", "йки", 'йок']) | |
| ); | |
| } | |
| export default sum_letters; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment