polish-number-to-words
Version:
Spell numbers using words in Polish | Napisz liczbę słownie po polsku
60 lines (59 loc) • 2.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.numberToWordsPL = void 0;
const _utils_1 = require("./_utils");
const decimalFractionToWords_1 = require("./decimalFractionToWords");
const integerToWords_1 = require("./integerToWords");
const SPECIAL_FRACTION_FORMS = {
[1.5]: 'półtorej',
[0.5]: 'pół',
[0.25]: 'ćwierć',
};
/**
* Converts a number into its Polish word form.
* Handles integers, fractions, and combinations, with support for informal forms and custom options.
*
* @param num The number to convert (e.g., 123, 0.5, 2.25, -1).
* @param options Optional settings to control formatting behavior.
* @returns The number expressed in Polish words.
*/
function numberToWordsPL(num, options) {
const optionsWithDefaults = {
informalFraction: false,
informalFractionFormIndividualNumberThreshold: 4,
simplifyFraction: false,
useSingleWordFractions: false,
...(options ?? {}),
};
const isNegative = num < 0;
num = Math.abs(num);
const integerPart = Math.floor(num);
const integerPartStr = (0, integerToWords_1.integerToWordsPL)(integerPart);
if (Number.isInteger(num)) {
return (isNegative ? 'minus ' : '') + integerPartStr;
}
if (optionsWithDefaults.informalFraction &&
optionsWithDefaults.useSingleWordFractions &&
SPECIAL_FRACTION_FORMS[num]) {
return (isNegative ? 'minus ' : '') + SPECIAL_FRACTION_FORMS[num];
}
const decimalPlaces = (0, _utils_1.getDecimalPlaces)(num);
const fractionPart = roundToPrecision(num % 1, decimalPlaces);
const fractionPartStr = (0, decimalFractionToWords_1.decimalFractionToWordsPL)(fractionPart, {
informal: optionsWithDefaults.informalFraction,
informalFormIndividualNumberThreshold: optionsWithDefaults.informalFractionFormIndividualNumberThreshold,
simplifyFraction: optionsWithDefaults.simplifyFraction,
});
const fractionPartUsesPrzecinek = /przecinek/.test(fractionPartStr);
const isIntegerZero = integerPart === 0;
const keepIntegerPart = fractionPartUsesPrzecinek || !isIntegerZero;
return ((isNegative ? 'minus ' : '') +
(keepIntegerPart ? integerPartStr + ' ' : '') +
(fractionPartUsesPrzecinek || isIntegerZero ? '' : 'i ') +
fractionPartStr);
}
exports.numberToWordsPL = numberToWordsPL;
function roundToPrecision(value, precision) {
const factor = Math.pow(10, precision);
return Math.round(value * factor) / factor;
}