number-to-georgian-text
Version:
This package is for converting numbers to Georgian text.
190 lines (189 loc) • 6.98 kB
JavaScript
// src/converter.ts
var names = {
0: "\u10DC\u10E3\u10DA\u10D8",
1: "\u10D4\u10E0\u10D7\u10D8",
2: "\u10DD\u10E0\u10D8",
3: "\u10E1\u10D0\u10DB\u10D8",
4: "\u10DD\u10D7\u10EE\u10D8",
5: "\u10EE\u10E3\u10D7\u10D8",
6: "\u10D4\u10E5\u10D5\u10E1\u10D8",
7: "\u10E8\u10D5\u10D8\u10D3\u10D8",
8: "\u10E0\u10D5\u10D0",
9: "\u10EA\u10EE\u10E0\u10D0",
10: "\u10D0\u10D7\u10D8",
11: "\u10D7\u10D4\u10E0\u10D7\u10DB\u10D4\u10E2\u10D8",
12: "\u10D7\u10DD\u10E0\u10DB\u10D4\u10E2\u10D8",
13: "\u10EA\u10D0\u10DB\u10D4\u10E2\u10D8",
14: "\u10D7\u10DD\u10D7\u10EE\u10DB\u10D4\u10E2\u10D8",
15: "\u10D7\u10EE\u10E3\u10D7\u10DB\u10D4\u10E2\u10D8",
16: "\u10D7\u10D4\u10E5\u10D5\u10E1\u10DB\u10D4\u10E2\u10D8",
17: "\u10E9\u10D5\u10D8\u10D3\u10DB\u10D4\u10E2\u10D8",
18: "\u10D7\u10E0\u10D5\u10D0\u10DB\u10D4\u10E2\u10D8",
19: "\u10EA\u10EE\u10E0\u10D0\u10DB\u10D4\u10E2\u10D8",
20: "\u10DD\u10EA",
40: "\u10DD\u10E0\u10DB\u10DD\u10EA",
60: "\u10E1\u10D0\u10DB\u10DD\u10EA",
80: "\u10DD\u10D7\u10EE\u10DB\u10DD\u10EA",
100: "\u10D0\u10E1",
200: "\u10DD\u10E0\u10D0\u10E1",
300: "\u10E1\u10D0\u10DB\u10D0\u10E1",
400: "\u10DD\u10D7\u10EE\u10D0\u10E1",
500: "\u10EE\u10E3\u10D7\u10D0\u10E1",
600: "\u10D4\u10E5\u10D5\u10E1\u10D0\u10E1",
700: "\u10E8\u10D5\u10D8\u10D3\u10D0\u10E1",
800: "\u10E0\u10D5\u10D0\u10D0\u10E1",
900: "\u10EA\u10EE\u10E0\u10D0\u10D0\u10E1"
};
var magnitudes = {
\u10D0\u10D7\u10D0\u10E1: [1e3, 1e6],
\u10DB\u10D8\u10DA\u10D8\u10DD\u10DC: [1e6, 1e9],
\u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3: [1e9, 1e12],
\u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC: [1e12, 1e15],
\u10D9\u10D5\u10D0\u10D3\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC: [1e15, Number.MAX_SAFE_INTEGER + 1]
};
var fractionalNames = {
1: "\u10DB\u10D4\u10D0\u10D7\u10D4\u10D3\u10D8",
2: "\u10DB\u10D4\u10D0\u10E1\u10D4\u10D3\u10D8",
3: "\u10DB\u10D4\u10D0\u10D7\u10D0\u10E1\u10D4\u10D3\u10D8",
4: "\u10DB\u10D4\u10D0\u10D7\u10D8\u10D0\u10D7\u10D0\u10E1\u10D4\u10D3\u10D8",
5: "\u10DB\u10D4\u10D0\u10E1\u10D8\u10D0\u10D7\u10D0\u10E1\u10D4\u10D3\u10D8",
6: "\u10DB\u10D4\u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
7: "\u10DB\u10D4\u10D0\u10D7\u10D8\u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
8: "\u10DB\u10D4\u10D0\u10E1\u10D8\u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
9: "\u10DB\u10D4\u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D4\u10D3\u10D8",
10: "\u10DB\u10D4\u10D0\u10D7\u10D8\u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D4\u10D3\u10D8",
11: "\u10DB\u10D4\u10D0\u10E1\u10D8\u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D4\u10D3\u10D8",
12: "\u10DB\u10D4\u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
13: "\u10DB\u10D4\u10D0\u10D7\u10D8\u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
14: "\u10DB\u10D4\u10D0\u10E1\u10D8\u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
15: "\u10DB\u10D4\u10D9\u10D5\u10D0\u10D3\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8",
16: "\u10DB\u10D4\u10D0\u10D7\u10D8\u10D9\u10D5\u10D0\u10D3\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D4\u10D3\u10D8"
};
var defaultOptions = {
leadingOne: true,
decimalPointSeparator: ""
};
function numberToText(input, options) {
options = options || {};
options = { ...defaultOptions, ...options };
if (typeof input === "string") {
input = +input;
}
if (isNaN(input)) {
throw new Error("Invalid input");
}
if (input < 0) {
return "\u10DB\u10D8\u10DC\u10E3\u10E1 " + numberToText(-input, options);
}
if (!Number.isInteger(input)) {
const [whole, fractional] = input.toString().split(".");
return `${_generateText(+whole, options)} \u10DB\u10D7\u10D4\u10DA\u10D8${options.decimalPointSeparator} ${_generateText(+fractional, options)} ${getFractionalName(fractional)}`;
}
return _generateText(input, options);
}
function _generateText(input, opts) {
if (input < 20) {
return names[input];
}
if (input < 100) {
if (input % 20 === 0) {
return names[input] + "\u10D8";
}
return names[20 * Math.floor(input / 20)] + "\u10D3\u10D0" + _generateText(input % 20, opts);
}
if (input < 1e3) {
if (input % 100 === 0) {
return names[input] + "\u10D8";
}
return names[100 * Math.floor(input / 100)] + " " + _generateText(input % 100, opts);
}
for (const [name, [base, magnitude]] of Object.entries(magnitudes)) {
if (input < magnitude) {
const remainder = input % base;
const quotient = Math.floor(input / base);
let prefix = "";
if (quotient > 1 || opts.leadingOne) {
prefix = _generateText(quotient, opts) + " ";
}
if (remainder === 0) {
return `${prefix}${name}\u10D8`;
}
return `${prefix}${name} ` + _generateText(remainder, opts);
}
}
return input.toString();
}
function getFractionalName(input) {
const len = input.length;
return fractionalNames[len] || "";
}
// src/ordinal.ts
var ordinal_magnitudes = [
[100, 1e3],
[1e3, 1e6],
[1e6, 1e9],
[1e9, 1e12],
[1e12, 1e15]
];
function numberToOrdinalText(input) {
if (input === 1) {
return "\u10DE\u10D8\u10E0\u10D5\u10D4\u10DA\u10D8";
}
return _generateText2(input);
}
function _generateText2(input, withPrefix = true) {
const name = names[input];
if (input < 20) {
return withPrefix ? `\u10DB\u10D4${name.substring(0, name.length - 1)}\u10D4` : name;
}
if (input < 100) {
if (input % 20 === 0) {
return withPrefix ? `\u10DB\u10D4${name}\u10D4` : `${name}\u10D8`;
}
return names[20 * Math.floor(input / 20)] + "\u10D3\u10D0" + _generateText2(input % 20);
}
if (input < 1e3) {
if (input % 100 === 0) {
return withPrefix ? `\u10DB\u10D4${name}\u10D4` : `${name}\u10D8`;
}
return names[100 * Math.floor(input / 100)] + " " + _generateText2(input % 100);
}
for (const [name2, [base, magnitude]] of Object.entries(magnitudes)) {
if (input < magnitude) {
const remainder = input % base;
const quotient = Math.floor(input / base);
let prefix = "";
if (quotient > 1) {
prefix = numberToText(quotient, { leadingOne: false });
}
if (remainder === 0) {
prefix = prefix.replace(/ /g, "");
return `\u10DB\u10D4${prefix}${name2}\u10D4`;
} else if (prefix) {
prefix += " ";
}
return `${prefix}${name2} ` + _generateText2(remainder);
}
}
return input.toString();
}
function numberToOrdinal(input) {
if (input === 1) {
return `1-\u10D4\u10DA\u10D8`;
}
if (input < 100) {
return input < 20 || input % 20 === 0 ? `\u10DB\u10D4-${input}` : `${input}-\u10D4`;
}
for (const [base, magnitude] of ordinal_magnitudes) {
if (input < magnitude) {
return input % base === 0 ? `\u10DB\u10D4-${input}` : `${input}-\u10D4`;
}
}
return `${input}-\u10D4`;
}
export {
numberToOrdinal,
numberToOrdinalText,
numberToText
};
//# sourceMappingURL=index.mjs.map