number-to-georgian-text
Version:
This package is for converting numbers to Georgian text.
219 lines (216 loc) • 8.09 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
numberToOrdinal: () => numberToOrdinal,
numberToOrdinalText: () => numberToOrdinalText,
numberToText: () => numberToText
});
module.exports = __toCommonJS(src_exports);
// 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`;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
numberToOrdinal,
numberToOrdinalText,
numberToText
});
//# sourceMappingURL=index.js.map