UNPKG

number-to-georgian-text

Version:

This package is for converting numbers to Georgian text.

1 lines 10.6 kB
{"version":3,"sources":["../src/converter.ts","../src/ordinal.ts"],"sourcesContent":["export const names: { [key: number]: string } = {\n 0: \"ნული\",\n 1: \"ერთი\",\n 2: \"ორი\",\n 3: \"სამი\",\n 4: \"ოთხი\",\n 5: \"ხუთი\",\n 6: \"ექვსი\",\n 7: \"შვიდი\",\n 8: \"რვა\",\n 9: \"ცხრა\",\n 10: \"ათი\",\n 11: \"თერთმეტი\",\n 12: \"თორმეტი\",\n 13: \"ცამეტი\",\n 14: \"თოთხმეტი\",\n 15: \"თხუთმეტი\",\n 16: \"თექვსმეტი\",\n 17: \"ჩვიდმეტი\",\n 18: \"თრვამეტი\",\n 19: \"ცხრამეტი\",\n 20: \"ოც\",\n 40: \"ორმოც\",\n 60: \"სამოც\",\n 80: \"ოთხმოც\",\n 100: \"ას\",\n 200: \"ორას\",\n 300: \"სამას\",\n 400: \"ოთხას\",\n 500: \"ხუთას\",\n 600: \"ექვსას\",\n 700: \"შვიდას\",\n 800: \"რვაას\",\n 900: \"ცხრაას\",\n};\n\nexport const magnitudes: { [key: string]: [number, number] } = {\n ათას: [1000, 1000000],\n მილიონ: [1000000, 1000000000],\n მილიარდ: [1000000000, 1000000000000],\n ტრილიონ: [1000000000000, 1000000000000000],\n კვადრილიონ: [1000000000000000, Number.MAX_SAFE_INTEGER + 1],\n};\n\nconst fractionalNames: { [key: number]: string } = {\n 1: \"მეათედი\",\n 2: \"მეასედი\",\n 3: \"მეათასედი\",\n 4: \"მეათიათასედი\",\n 5: \"მეასიათასედი\",\n 6: \"მემილიონედი\",\n 7: \"მეათიმილიონედი\",\n 8: \"მეასიმილიონედი\",\n 9: \"მემილიარდედი\",\n 10: \"მეათიმილიარდედი\",\n 11: \"მეასიმილიარდედი\",\n 12: \"მეტრილიონედი\",\n 13: \"მეათიტრილიონედი\",\n 14: \"მეასიტრილიონედი\",\n 15: \"მეკვადრილიონედი\",\n 16: \"მეათიკვადრილიონედი\",\n};\n\nexport type Input = string | number;\nexport type Options = {\n leadingOne?: boolean;\n decimalPointSeparator?: string;\n};\n\nconst defaultOptions: Options = {\n leadingOne: true,\n decimalPointSeparator: \"\",\n};\n\nexport function numberToText(input: Input, options?: Options): string {\n options = options || {};\n options = { ...defaultOptions, ...options };\n // console.log(input, options);\n if (typeof input === \"string\") {\n input = +input;\n }\n if (isNaN(input)) {\n throw new Error(\"Invalid input\");\n }\n if (input < 0) {\n return \"მინუს \" + numberToText(-input, options);\n }\n if (!Number.isInteger(input)) {\n const [whole, fractional] = input.toString().split(\".\");\n return (\n `${_generateText(+whole, options)} მთელი${options.decimalPointSeparator} ` +\n `${_generateText(+fractional, options)} ${getFractionalName(fractional)}`\n );\n }\n return _generateText(input, options);\n}\n\nfunction _generateText(input: number, opts: Options): string {\n if (input < 20) {\n return names[input];\n }\n if (input < 100) {\n if (input % 20 === 0) {\n return names[input] + \"\";\n }\n return names[20 * Math.floor(input / 20)] + \"და\" + _generateText(input % 20, opts);\n }\n if (input < 1_000) {\n if (input % 100 === 0) {\n return names[input] + \"\";\n }\n return names[100 * Math.floor(input / 100)] + \" \" + _generateText(input % 100, opts);\n }\n\n for (const [name, [base, magnitude]] of Object.entries(magnitudes)) {\n if (input < magnitude) {\n const remainder = input % base;\n const quotient = Math.floor(input / base);\n let prefix = \"\";\n if (quotient > 1 || opts.leadingOne) {\n prefix = _generateText(quotient, opts) + \" \";\n }\n if (remainder === 0) {\n return `${prefix}${name}ი`;\n }\n return `${prefix}${name} ` + _generateText(remainder, opts);\n }\n }\n return input.toString();\n}\n\nexport function getFractionalName(input: string): string {\n const len = input.length;\n return fractionalNames[len] || \"\";\n}\n\n// todo: add ordinal support\n","import { magnitudes, names, numberToText } from \"./converter\";\n\nconst ordinal_magnitudes = [\n [100, 1_000],\n [1_000, 1_000_000],\n [1_000_000, 1_000_000_000],\n [1_000_000_000, 1_000_000_000_000],\n [1_000_000_000_000, 1_000_000_000_000_000],\n];\n\nexport function numberToOrdinalText(input: number): string {\n if (input === 1) {\n return \"პირველი\";\n }\n return _generateText(input);\n}\n\nfunction _generateText(input: number, withPrefix = true): string {\n const name = names[input];\n if (input < 20) {\n return withPrefix ? `მე${name.substring(0, name.length - 1)}ე` : name;\n }\n if (input < 100) {\n if (input % 20 === 0) {\n return withPrefix ? `მე${name}ე` : `${name}ი`;\n }\n return names[20 * Math.floor(input / 20)] + \"და\" + _generateText(input % 20);\n }\n if (input < 1_000) {\n if (input % 100 === 0) {\n return withPrefix ? `მე${name}ე` : `${name}ი`;\n }\n return names[100 * Math.floor(input / 100)] + \" \" + _generateText(input % 100);\n }\n\n for (const [name, [base, magnitude]] of Object.entries(magnitudes)) {\n if (input < magnitude) {\n const remainder = input % base;\n const quotient = Math.floor(input / base);\n let prefix = \"\";\n if (quotient > 1) {\n prefix = numberToText(quotient, { leadingOne: false });\n }\n if (remainder === 0) {\n prefix = prefix.replace(/ /g, \"\");\n return `მე${prefix}${name}ე`;\n } else if (prefix) {\n prefix += \" \";\n }\n return `${prefix}${name} ` + _generateText(remainder);\n }\n }\n return input.toString();\n}\n\nexport function numberToOrdinal(input: number): string {\n if (input === 1) {\n return `1-ელი`;\n }\n if (input < 100) {\n return input < 20 || input % 20 === 0 ? `მე-${input}` : `${input}-ე`;\n }\n for (const [base, magnitude] of ordinal_magnitudes) {\n if (input < magnitude) {\n return input % base === 0 ? `მე-${input}` : `${input}-ე`;\n }\n }\n return `${input}-ე`;\n}\n"],"mappings":"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","names":["_generateText","name"]}