polish-number-to-words
Version:
Spell numbers using words in Polish | Napisz liczbę słownie po polsku
133 lines (132 loc) • 4.64 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.integerToWordsPL = void 0;
const pluralize_1 = require("./pluralize");
const WORDS_0_TO_19 = [
'zero',
'jeden',
'dwa',
'trzy',
'cztery',
'pięć',
'sześć',
'siedem',
'osiem',
'dziewięć',
'dziesięć',
'jedenaście',
'dwanaście',
'trzynaście',
'czternaście',
'piętnaście',
'szesnaście',
'siedemnaście',
'osiemnaście',
'dziewiętnaście',
];
const WORDS_TENS = {
20: 'dwadzieścia',
30: 'trzydzieści',
40: 'czterdzieści',
50: 'pięćdziesiąt',
60: 'sześćdziesiąt',
70: 'siedemdziesiąt',
80: 'osiemdziesiąt',
90: 'dziewięćdziesiąt',
};
const WORDS_HUNDREDS = {
100: 'sto',
200: 'dwieście',
300: 'trzysta',
400: 'czterysta',
500: 'pięćset',
600: 'sześćset',
700: 'siedemset',
800: 'osiemset',
900: 'dziewięćset',
};
const WORDS_THOUSAND_AND_MORE = [
new pluralize_1.PluralizerPL('tysiąc', 'tysiące', 'tysięcy'),
new pluralize_1.PluralizerPL('milion', 'miliony', 'milionów'),
new pluralize_1.PluralizerPL('miliard', 'miliardy', 'miliardów'),
new pluralize_1.PluralizerPL('bilion', 'biliony', 'bilionów'),
new pluralize_1.PluralizerPL('biliard', 'biliardy', 'biliardów'),
new pluralize_1.PluralizerPL('trylion', 'tryliony', 'trylionów'),
new pluralize_1.PluralizerPL('tryliard', 'tryliardy', 'tryliardów'),
new pluralize_1.PluralizerPL('kwadrylion', 'kwadryliony', 'kwadrylionów'),
new pluralize_1.PluralizerPL('kwadryliard', 'kwadryliardy', 'kwadryliardów'),
new pluralize_1.PluralizerPL('kwintylion', 'kwintyliony', 'kwintylionów'),
new pluralize_1.PluralizerPL('kwintyliard', 'kwintyliardy', 'kwintyliardów'),
new pluralize_1.PluralizerPL('sekstylion', 'sekstyliony', 'sekstylionów'),
new pluralize_1.PluralizerPL('sekstyliard', 'sekstyliardy', 'sekstyliardów'),
new pluralize_1.PluralizerPL('septylion', 'septyliony', 'septylionów'),
new pluralize_1.PluralizerPL('septyliard', 'septyliardy', 'septyliardów'),
new pluralize_1.PluralizerPL('oktylion', 'oktyliony', 'oktylionów'),
new pluralize_1.PluralizerPL('oktyliard', 'oktyliardy', 'oktyliardów'),
new pluralize_1.PluralizerPL('nonilion', 'noniliony', 'nonilionów'),
new pluralize_1.PluralizerPL('noniliard', 'noniliardy', 'noniliardów'),
new pluralize_1.PluralizerPL('decylion', 'decyliony', 'decylionów'),
new pluralize_1.PluralizerPL('decyliard', 'decyliardy', 'decyliardów'),
];
/**
* Converts an integer into its Polish word form.
* Handles numbers from negative billions to large scale names like "kwintylion".
*
* @param num The integer to convert.
* @param options Optional formatting behavior.
* @returns The number written out in Polish.
*/
function integerToWordsPL(num, options) {
const optionsWithDefaults = {
explicitSingleThousand: false,
...(options ?? {}),
};
if (num >= 0 && num <= 19) {
return WORDS_0_TO_19[num];
}
const parts = [];
const isNegative = num < 0;
let absNum = Math.abs(num);
let groupIndex = 0;
while (absNum > 0) {
const groupNum = absNum % 1000;
if (groupNum !== 0) {
const groupWords = groupIndex === 0
? convertHundreds(groupNum)
: convertGroupWithScale(groupNum, groupIndex, optionsWithDefaults.explicitSingleThousand);
parts.push(groupWords);
}
absNum = Math.floor(absNum / 1000);
groupIndex++;
}
if (isNegative)
parts.push('minus');
return parts.reverse().join(' ');
}
exports.integerToWordsPL = integerToWordsPL;
function convertHundreds(n) {
const segs = [];
if (n >= 100) {
const h = (Math.floor(n / 100) * 100);
segs.push(WORDS_HUNDREDS[h]);
n %= 100;
}
if (n >= 20) {
const t = (Math.floor(n / 10) * 10);
segs.push(WORDS_TENS[t]);
const u = n % 10;
if (u > 0)
segs.push(WORDS_0_TO_19[u]);
}
else if (n > 0) {
segs.push(WORDS_0_TO_19[n]);
}
return segs.join(' ');
}
function convertGroupWithScale(n, scaleIdx, explicitSingleThousand) {
const pluralizer = WORDS_THOUSAND_AND_MORE[scaleIdx - 1];
if (n === 1 && !explicitSingleThousand) {
return pluralizer.pluralize(n);
}
return `${convertHundreds(n)} ${pluralizer.pluralize(n)}`;
}