UNPKG

polish-number-to-words

Version:

Spell numbers using words in Polish | Napisz liczbę słownie po polsku

215 lines (214 loc) 9.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.commonFractionToWordsPL = void 0; const integerToWords_1 = require("./integerToWords"); const pluralize_1 = require("./pluralize"); const WORDS_0_TO_19 = [ new pluralize_1.PluralizerPL('zerowa', 'zerowe', 'zerowych'), new pluralize_1.PluralizerPL('pierwsza', 'pierwsze', 'pierwszych'), new pluralize_1.PluralizerPL('druga', 'drugie', 'drugich'), new pluralize_1.PluralizerPL('trzecia', 'trzecie', 'trzecich'), new pluralize_1.PluralizerPL('czwarta', 'czwarte', 'czwartych'), new pluralize_1.PluralizerPL('piąta', 'piąte', 'piątych'), new pluralize_1.PluralizerPL('szósta', 'szóste', 'szóstych'), new pluralize_1.PluralizerPL('siódma', 'siódme', 'siódmych'), new pluralize_1.PluralizerPL('ósma', 'ósme', 'ósmych'), new pluralize_1.PluralizerPL('dziewiąta', 'dziewiąte', 'dziewiątych'), new pluralize_1.PluralizerPL('dziesiąta', 'dziesiąte', 'dziesiątych'), new pluralize_1.PluralizerPL('jedenasta', 'jedenaste', 'jedenastych'), new pluralize_1.PluralizerPL('dwunasta', 'dwunaste', 'dwunastych'), new pluralize_1.PluralizerPL('trzynasta', 'trzynaste', 'trzynastych'), new pluralize_1.PluralizerPL('czternasta', 'czternaste', 'czternastych'), new pluralize_1.PluralizerPL('piętnasta', 'piętnaste', 'piętnastych'), new pluralize_1.PluralizerPL('szesnasta', 'szesnaste', 'szesnastych'), new pluralize_1.PluralizerPL('siedemnasta', 'siedemnaste', 'siedemnastych'), new pluralize_1.PluralizerPL('osiemnasta', 'osiemnaste', 'osiemnastych'), new pluralize_1.PluralizerPL('dziewiętnasta', 'dziewiętnaste', 'dziewiętnastych'), ]; const WORDS_TENS = { 20: new pluralize_1.PluralizerPL('dwudziesta', 'dwudzieste', 'dwudziestych'), 30: new pluralize_1.PluralizerPL('trzydziesta', 'trzydzieste', 'trzydziestych'), 40: new pluralize_1.PluralizerPL('czterdziesta', 'czterdzieste', 'czterdziestych'), 50: new pluralize_1.PluralizerPL('pięćdziesiąta', 'pięćdziesiąte', 'pięćdziesiątych'), 60: new pluralize_1.PluralizerPL('sześćdziesiąta', 'sześćdziesiąte', 'sześćdziesiątych'), 70: new pluralize_1.PluralizerPL('siedemdziesiąta', 'siedemdziesiąte', 'siedemdziesiątych'), 80: new pluralize_1.PluralizerPL('osiemdziesiąta', 'osiemdziesiąte', 'osiemdziesiątych'), 90: new pluralize_1.PluralizerPL('dziewięćdziesiąta', 'dziewięćdziesiąte', 'dziewięćdziesiątych'), }; const WORDS_HUNDREDS = { 100: new pluralize_1.PluralizerPL('setna', 'setne', 'setnych'), 200: new pluralize_1.PluralizerPL('dwusetna', 'dwusetne', 'dwusetnych'), 300: new pluralize_1.PluralizerPL('trzysetna', 'trzysetne', 'trzysetnych'), 400: new pluralize_1.PluralizerPL('czterysetna', 'czterysetne', 'czterysetnych'), 500: new pluralize_1.PluralizerPL('pięćsetna', 'pięćsetne', 'pięćsetnych'), 600: new pluralize_1.PluralizerPL('sześćsetna', 'sześćsetne', 'sześćsetnych'), 700: new pluralize_1.PluralizerPL('siedemsetna', 'siedemsetne', 'siedemsetnych'), 800: new pluralize_1.PluralizerPL('osiemsetna', 'osiemsetne', 'osiemsetnych'), 900: new pluralize_1.PluralizerPL('dziewięćsetna', 'dziewięćsetne', 'dziewięćsetnych'), }; const WORDS_THOUSAND_AND_MORE = [ new pluralize_1.PluralizerPL('tysięczna', 'tysięczne', 'tysięcznych'), new pluralize_1.PluralizerPL('milionowa', 'milionowe', 'milionowych'), new pluralize_1.PluralizerPL('miliardowa', 'miliardowe', 'miliardowych'), new pluralize_1.PluralizerPL('bilionowa', 'bilionowe', 'bilionowych'), new pluralize_1.PluralizerPL('biliardowa', 'biliardowe', 'biliardowych'), new pluralize_1.PluralizerPL('trylionowa', 'trylionowe', 'trylionowych'), new pluralize_1.PluralizerPL('tryliardowa', 'tryliardowe', 'tryliardowych'), new pluralize_1.PluralizerPL('kwadrylionowa', 'kwadrylionowe', 'kwadrylionowych'), new pluralize_1.PluralizerPL('kwadryliardowa', 'kwadryliardowe', 'kwadryliardowych'), new pluralize_1.PluralizerPL('kwintylionowa', 'kwintylionowe', 'kwintylionowych'), new pluralize_1.PluralizerPL('kwintyliardowa', 'kwintyliardowe', 'kwintyliardowych'), new pluralize_1.PluralizerPL('sekstylionowa', 'sekstylionowe', 'sekstylionowych'), new pluralize_1.PluralizerPL('sekstyliardowa', 'sekstyliardowe', 'sekstyliardowych'), new pluralize_1.PluralizerPL('septylionowa', 'septylionowe', 'septylionowych'), new pluralize_1.PluralizerPL('septyliardowa', 'septyliardowe', 'septyliardowych'), new pluralize_1.PluralizerPL('oktylionowa', 'oktylionowe', 'oktylionowych'), new pluralize_1.PluralizerPL('oktyliardowa', 'oktyliardowe', 'oktyliardowych'), new pluralize_1.PluralizerPL('nonilionowa', 'nonilionowe', 'nonilionowych'), new pluralize_1.PluralizerPL('noniliardowa', 'noniliardowe', 'noniliardowych'), new pluralize_1.PluralizerPL('decylionowa', 'decylionowe', 'decylionowych'), new pluralize_1.PluralizerPL('decyliardowa', 'decyliardowe', 'decyliardowych'), ]; const COMPOUND_AMOUNTS_0_TO_19 = [ '', 'jedno', 'dwu', 'trzy', 'cztero', 'pięcio', 'sześcio', 'siedmio', 'ośmio', 'dziewięcio', 'dziesięcio', 'jedenasto', 'dwunasto', 'trzynasto', 'czternasto', 'piętnasto', 'szesnasto', 'siedemnasto', 'osiemnasto', 'dziewiętnasto', ]; const COMPOUND_AMOUNTS_TENS = { 20: 'dwudziesto', 30: 'trzydziesto', 40: 'czterdziesto', 50: 'pięćdziesięcio', 60: 'sześćdziesięcio', 70: 'siedemdziesięcio', 80: 'osiemdziesięcio', 90: 'dziewięćdziesięcio', }; const COMPOUND_AMOUNTS_HUNDREDS = { 100: 'stu', 200: 'dwustu', 300: 'trzystu', 400: 'czterystu', 500: 'pięciuset', 600: 'sześciuset', 700: 'siedmiuset', 800: 'ośmiuset', 900: 'dziewięciuset', }; /** * Converts a common fraction (numerator/denominator) to a Polish phrase. * Returns grammatically correct feminine ordinal forms for denominators. * * @param numerator The numerator (e.g., 3) * @param denominator The denominator (e.g., 4) * @returns Polish words for the fraction (e.g., "trzy czwarte") */ function commonFractionToWordsPL(numerator, denominator) { const numeratorStr = convertNumerator(numerator); const denominatorStr = convertDenominator(denominator, numerator); return numeratorStr + ' ' + denominatorStr; } exports.commonFractionToWordsPL = commonFractionToWordsPL; function convertNumerator(num) { if (Math.abs(num) === 1) { return num < 0 ? 'minus jedna' : 'jedna'; } return (0, integerToWords_1.integerToWordsPL)(num).replace(/dwa$/, 'dwie'); } function convertDenominator(num, numeratorForPluralization) { if (num >= 0 && num <= 19) { return WORDS_0_TO_19[num].pluralize(numeratorForPluralization); } const parts = []; const isNegative = num < 0; let absNum = Math.abs(num); let groupIndex = 0; let wasGroupWithContentFound = false; while (absNum > 0) { const groupNum = absNum % 1000; if (groupNum !== 0) { const groupWords = groupIndex === 0 ? convertHundreds(groupNum, numeratorForPluralization) : convertGroupWithScale(groupNum, groupIndex, numeratorForPluralization, !wasGroupWithContentFound); parts.push(groupWords); wasGroupWithContentFound = true; } absNum = Math.floor(absNum / 1000); groupIndex++; } if (isNegative) parts.push('minus'); return parts.reverse().join(' '); } function convertHundreds(n, numeratorForPluralization) { const segs = []; if (n >= 100) { const h = (Math.floor(n / 100) * 100); if (n % 100 != 0) { segs.push((0, integerToWords_1.integerToWordsPL)(h)); } else { segs.push(WORDS_HUNDREDS[h].pluralize(numeratorForPluralization)); } n %= 100; } if (n >= 20) { const t = (Math.floor(n / 10) * 10); segs.push(WORDS_TENS[t].pluralize(numeratorForPluralization)); const u = n % 10; if (u > 0) segs.push(WORDS_0_TO_19[u].pluralize(numeratorForPluralization)); } else if (n > 0) { segs.push(WORDS_0_TO_19[n].pluralize(numeratorForPluralization)); } return segs.join(' '); } function convertGroupWithScale(groupAsHundreds, scaleIdx, numeratorForPluralization, isLowestGroup) { if (!isLowestGroup) { return (0, integerToWords_1.integerToWordsPL)(groupAsHundreds * 1000 ** scaleIdx); } const pluralizer = WORDS_THOUSAND_AND_MORE[scaleIdx - 1]; return `${convertHundredsForGroup(groupAsHundreds)}${pluralizer.pluralize(numeratorForPluralization)}`.trim(); } function convertHundredsForGroup(n) { const segs = []; if (n >= 100) { const h = (Math.floor(n / 100) * 100); if (n % 100 != 0) { segs.push((0, integerToWords_1.integerToWordsPL)(h) + ' '); } else { segs.push(COMPOUND_AMOUNTS_HUNDREDS[h]); } n %= 100; } if (n >= 20) { const t = (Math.floor(n / 10) * 10); segs.push(COMPOUND_AMOUNTS_TENS[t]); const u = n % 10; if (u > 0) segs.push(COMPOUND_AMOUNTS_0_TO_19[u]); } else if (n >= 2) { segs.push(COMPOUND_AMOUNTS_0_TO_19[n]); } return segs.join(''); }