UNPKG

polish-number-to-words

Version:

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

133 lines (132 loc) 4.64 kB
"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)}`; }