UNPKG

polish-number-to-words

Version:

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

81 lines (80 loc) 3.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decimalFractionToWordsPL = void 0; const _utils_1 = require("./_utils"); const commonFractionToWords_1 = require("./commonFractionToWords"); const integerToWords_1 = require("./integerToWords"); const WORDS_0_TO_9 = [ 'zero', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć', ]; /** * Converts a decimal fraction into Polish words. * Can return either a full fractional phrase (e.g., "dwanaście tysięcznych") or a digit-by-digit form (e.g., "przecinek dwanaście"). Ignores the minus sign. * * @param num A non-integer number between 0 and 1 (e.g., 0.25, 0.125, etc.). * @param options Optional settings to customize the output style. * @throws Will throw if an integer is provided instead of a decimal fraction. * @returns A string representing the decimal fraction in Polish, ignoring the minus. */ function decimalFractionToWordsPL(num, options) { const optionsWithDefaults = { informal: false, informalFormIndividualNumberThreshold: 4, simplifyFraction: false, ...(options ?? {}), }; const isNegative = num < 0; num = Math.abs(num); if (num % 1 === 0) { throw new Error("Provided number isn't a fraction and cannot be spelled as a decimal fraction"); } const decimalPlaces = (0, _utils_1.getDecimalPlaces)(num); if (!optionsWithDefaults.informal) { const fractionNumerator = fractionToInteger(num); const fractionDenominator = 10 ** decimalPlaces; if (!optionsWithDefaults.simplifyFraction) { return (0, commonFractionToWords_1.commonFractionToWordsPL)(fractionNumerator, fractionDenominator); } const fraction = simplifyFraction(fractionNumerator, fractionDenominator); return (0, commonFractionToWords_1.commonFractionToWordsPL)(fraction.numerator, fraction.denominator); } const numAsString = num.toString().split('.')[1]; const parts = ['przecinek']; if (decimalPlaces < optionsWithDefaults.informalFormIndividualNumberThreshold) { parts.push((0, integerToWords_1.integerToWordsPL)(Number(numAsString))); } else { parts.push(...numAsString .split('') .slice(0, decimalPlaces) .map(v => WORDS_0_TO_9[Number(v)])); } return parts.filter(Boolean).join(' '); } exports.decimalFractionToWordsPL = decimalFractionToWordsPL; function fractionToInteger(n) { const decimalPlaces = (0, _utils_1.getDecimalPlaces)(n); return Math.round(n * 10 ** decimalPlaces); } function simplifyFraction(numerator, denominator) { const gcd = greatestCommonDivisor(Math.abs(numerator), Math.abs(denominator)); return { numerator: numerator / gcd, denominator: denominator / gcd, }; } function greatestCommonDivisor(a, b) { while (b !== 0) { [a, b] = [b, a % b]; } return a; }