Skip to content

Instantly share code, notes, and snippets.

@rozanovz
Created August 28, 2023 12:21
Show Gist options
  • Select an option

  • Save rozanovz/c286eba51b8d738255bf7707cda01720 to your computer and use it in GitHub Desktop.

Select an option

Save rozanovz/c286eba51b8d738255bf7707cda01720 to your computer and use it in GitHub Desktop.
// преобразовать трёхзначные числа
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