@technobuddha/library
Version:
A large library of useful functions
58 lines • 4.54 kB
JavaScript
import { deconstructNumber } from "./deconstruct-number.js";
import { numbering } from "./numbering.js";
import { empty, space } from "./unicode.js";
/**
* Convert a number into an ordinal number string (1st, 2nd, 3rd, etc).
* @param input - The number to convert
* @param options - see {@link OrdinalOptions}
* @example
* ```typescript
* ordinal(1); // "first"
* ordinal(2); // "second"
* ordinal(3); // "third"
* ordinal(21); // "twenty first"
* ordinal(101, { and: ' and ' }); // "one hundred and first"
* ordinal(2, { output: 'suffix' }); // "nd"
* ```
* @group Math
* @category Verbalization
*/
export function ordinal(input, options = {}) {
if (options.output === 'suffix') {
if (Number.isNaN(input) || !Number.isFinite(input)) {
return 'th';
}
const { whole } = deconstructNumber(input, Infinity);
if (whole.value % 10 === 1 && whole.value % 100 !== 11) {
return 'st';
}
else if (whole.value % 10 === 2 && whole.value % 100 !== 12) {
return 'nd';
}
else if (whole.value % 10 === 3 && whole.value % 100 !== 13) {
return 'rd';
}
return 'th';
}
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 ?? 9,
ordinal: options?.ordinal ?? true,
shift: options?.shift ?? false,
};
return numbering(input, numberingOptions);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkaW5hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcmRpbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBa0IsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUF3RDVDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYSxFQUFFLFVBQTBCLEVBQUU7SUFDakUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXJELElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQWM7UUFDbEMsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUNMLENBQUMsQ0FDQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFlBQVk7Z0JBQ2hDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUztnQkFDN0IsT0FBTyxFQUFFLE1BQU0sS0FBSyxRQUFRLENBQzdCLENBQUMsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTTtnQkFDaEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksU0FBUztZQUN6QyxRQUFRLEVBQ04sQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFlBQVksSUFBSSxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ25GLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWTtvQkFDN0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUztTQUMzQztRQUNELEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUs7UUFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksS0FBSztRQUNoQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxJQUFJO1FBQ3JDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxJQUFJLFFBQVE7UUFDL0MsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksQ0FBQztRQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJO1FBQ2pDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEtBQUs7S0FDL0IsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVDLENBQUMifQ==