polish-number-to-words
Version:
Spell numbers using words in Polish | Napisz liczbę słownie po polsku
215 lines (214 loc) • 9.66 kB
JavaScript
"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('');
}