UNPKG

@technobuddha/library

Version:
85 lines 7.69 kB
import { deconstructNumber } from "../deconstruct-number.js"; import { empty, negativeSign, space } from "../unicode.js"; import { fabricateAlphabeticFraction } from "./fabricate-alphabetic-fraction.js"; import { fabricateAlphabeticInteger } from "./fabricate-alphabetic-integer.js"; import { fabricateNumericFraction } from "./fabricate-numeric-fraction.js"; import { fabricateNumericInteger } from "./fabricate-numeric-integer.js"; import { makeOrdinal } from "./make-ordinal.js"; /** * Returns a string representation of the sign. * @param sign - The sign of the number, where `1` represents positive and `-1` represents negative. * @returns An empty string for positive sign, or the string `'negative '` for negative sign. * @internal */ export function signWord(sign) { return sign === 1 ? empty : 'negative '; } /** * Returns the string representation of a sign symbol based on the input value. * @param sign - The sign indicator, where `1` represents positive and `-1` represents negative. * @returns The corresponding sign symbol as a string. * @internal */ export function signSymbol(sign) { return sign === 1 ? empty : negativeSign; } /** * Converts a numeric input into a formatted string representation based on the provided options. * * The formatting can be numeric, alphabetic, or hybrid, and supports custom precision, ordinal forms, * and special handling for zero, NaN, and infinity values. The output can include both integer and fractional * parts, formatted according to the specified options. * @param input - The number to be formatted. * @param options - An object specifying formatting options, including: * - `output`: Determines the style for integer and fractional parts (`numeric`, `alphabetic`, or `hybrid`). * - `precision`: The number of decimal places to consider for the fractional part. * - `ordinal`: Whether to return the ordinal form (e.g., "1st", "second", "zeroth"). * @returns The formatted string representation of the input number according to the specified options. * @internal */ export function numbering(input, options) { const { output, precision, ordinal } = options; if (Number.isNaN(input)) { return (ordinal ? 'nth' : output.integer === 'numeric' ? 'NaN' : 'not a number'); } if (!Number.isFinite(input)) { return (ordinal ? 'nth' : output.integer === 'numeric' ? input < 0 ? `${negativeSign}∞` : '∞' : input < 0 ? 'negative infinity' : 'infinity'); } const { sign, whole, fractional } = deconstructNumber(input, precision); const s = output.integer === 'numeric' ? signSymbol(sign) : signWord(sign); if (whole.value === 0 && fractional.value === 0) { const words = output.integer === 'alphabetic' ? `${s}zero` : `${s}0`; return ordinal ? makeOrdinal(words) : words; } const fractionalPart = output.fraction === 'numeric' ? fabricateNumericFraction(fractional, options) : fabricateAlphabeticFraction(fractional, options); if (whole.value === 0) { if (ordinal) { const word = output.integer === 'alphabetic' ? 'zeroth' : '0th'; return `${word} and ${fractionalPart}`; } return `${s}${fractionalPart}`; } const integerPart = output.integer === 'alphabetic' || output.integer === 'hybrid' ? fabricateAlphabeticInteger(whole.value, options) : fabricateNumericInteger(whole.value, options); if (fractional.value === 0) { return `${s}${integerPart}`; } const join = (((output.integer === 'alphabetic' || output.integer === 'hybrid') && output.fraction === 'alphabetic') || ordinal) ? ' and ' : space; return `${s}${integerPart}${join}${fractionalPart}`.trim(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL251bWJlcmluZy9udW1iZXJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXFEaEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQVk7SUFDbkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLE9BQWtCO0lBQ3pELE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUUvQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQ0wsT0FBTyxD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