@technobuddha/library
Version:
A large library of useful functions
85 lines • 7.69 kB
JavaScript
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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