@technobuddha/library
Version:
A large library of useful functions
45 lines • 3.48 kB
JavaScript
import { numbering } from "./numbering.js";
import { empty, space } from "./unicode.js";
/**
* Converts a numeric input into a formatted fraction string, either in numeric or alphabetic form.
*
* The function finds the closest matching fraction from a predefined list and formats the output
* based on the specified options. If the input is negative, the result is prefixed accordingly.
* The output can be either a numeric representation (e.g., "1 1⁄2") or an alphabetic representation
* (e.g., "one and one half").
* @param input - The number to convert to a fraction string.
* @param options - An optional object specifying the output format.
* @returns The formatted fraction string.
* @example
* ```typescript
* fraction(1.5); // "one and one half"
* fraction(2.75, { output: 'numeric' }); // "2 3⁄4"
* fraction(-0.25, { output: 'alphabetic' }); // "negative one quarter"
* fraction(0.333, { precision: 2 }); // "one third"
* ```
* @group Math
* @category Verbalization
*/
export function fraction(input, options = {}) {
const numberingOptions = {
output: {
integer: ((options?.output === 'alphabetic' ||
options?.output === 'numeric' ||
options?.output === 'hybrid') ?
options.output
: options.output?.integer) ?? 'numeric',
fraction: (options?.output === 'alphabetic' || options?.output === 'numeric' ? options.output
: options?.output === 'hybrid' ? 'alphabetic'
: options.output?.fraction) ?? 'numeric',
},
and: options?.and ?? empty,
hyphen: options?.hyphen ?? space,
tolerance: options?.tolerance ?? 0.01,
denominators: options?.denominators ?? 'common',
precision: options?.precision ?? 6,
ordinal: options?.ordinal ?? false,
shift: options?.shift ?? false,
};
return numbering(input, numberingOptions);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnJhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlENUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWEsRUFBRSxVQUEyQixFQUFFO0lBQ25FLE1BQU0sZ0JBQWdCLEdBQWM7UUFDbEMsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUNMLENBQUMsQ0FDQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFlBQVk7Z0JBQ2hDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUztnQkFDN0IsT0FBTyxFQUFFLE1BQU0sS0FBSyxRQUFRLENBQzdCLENBQUMsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTTtnQkFDaEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksU0FBUztZQUN6QyxRQUFRLEVBQ04sQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFlBQVksSUFBSSxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ25GLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWTtvQkFDN0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUztTQUMzQztRQUNELEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUs7UUFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksS0FBSztRQUNoQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxJQUFJO1FBQ3JDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxJQUFJLFFBQVE7UUFDL0MsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksQ0FBQztRQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxLQUFLO1FBQ2xDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEtBQUs7S0FDL0IsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVDLENBQUMifQ==