@technobuddha/library
Version:
A large library of useful functions
614 lines • 45.7 kB
JavaScript
import { build } from "./build.js";
import { pad } from "./pad.js";
import { splitChars } from "./split-chars.js";
import { empty } from "./unicode.js";
/**
* Parses a numeric format mask string and extracts formatting information.
*
* The function analyzes the provided mask to determine digit placeholders,
* grouping, scaling (e.g., percent, per mille), decimal precision, exponent formatting,
* and literal characters. It returns an object describing the parsed mask.
* @param mask - The numeric format mask string to parse (e.g., "#,##0.00%").
* @returns An object containing:
* - `aMask`: Array of mask tokens after the decimal point.
* - `aDigits`: Number of digit placeholders after the decimal point.
* - `bMask`: Array of mask tokens before the decimal point.
* - `bDigits`: Number of digit placeholders before the decimal point.
* - `scale`: Numeric scale factor (e.g., 100 for %, 1000 for ‰).
* - `group`: Whether digit grouping (e.g., thousands separator) is used.
* - `exponent`: Number of digits in the exponent (if scientific notation is used).
* - `signExponent`: Whether the exponent includes a sign.
* - `precision`: Number of digits after the decimal point.
* @example
* ```typescript
* const result = parse("#,##0.00%");
* // result = {
* // aMask: ['0', '0'],
* // aDigits: 2,
* // bMask: ['#', ',', '#', '#', '0', '"%'],
* // bDigits: 4,
* // scale: 100,
* // group: true,
* // exponent: 0,
* // signExponent: false,
* // precision: 2
* // }
* ```
* @internal
*/
function parse(mask) {
let scale = 1;
let beforeDP = true;
const before = [];
let after = [];
let group = false;
let commas = 0;
let zeroSeen = false;
let exponent = 0;
let signExponent = false;
let precision = 0;
const m = splitChars(mask);
for (let i = 0; i < m.length; ++i) {
const c = m[i];
switch (c) {
case '"': //literal string
case "'": {
let s = '"';
for (++i; i < mask.length; ++i) {
const k = mask.charAt(i);
if (c === k) {
break;
}
s += k;
}
(beforeDP ? before : after).push(s);
break;
}
case '#': {
if (beforeDP) {
before.push(zeroSeen ? '0' : '#');
}
else {
precision++;
after.push('#');
}
break;
}
case '0': {
if (beforeDP) {
//If we see a 0 before the decimal point, all following #s are transformed into 0s
before.push('0');
zeroSeen = true;
}
else {
//if we see a 0 after the decimal point, the proceeding #s are transformed into 0s
precision++;
after = after.map((a) => (a === '#' ? '0' : a));
after.push('0');
}
break;
}
case ',': {
if (beforeDP) {
commas++;
}
break;
}
case '.': {
beforeDP = false;
break;
}
case '%': {
scale *= 100;
(beforeDP ? before : after).push(`"${c}`);
break;
}
case '‰': {
scale *= 1000;
(beforeDP ? before : after).push(`"${c}`);
break;
}
case '‱': {
scale *= 10000;
(beforeDP ? before : after).push(`"${c}`);
break;
}
case 'e':
case 'E': {
let signSeen = false;
let j = i + 1;
let e = 0;
if (mask.length > j && mask.charAt(j) === '+') {
j++;
signSeen = true;
}
else if (mask.length > j && mask.charAt(j) === '-') {
j++;
}
while (mask.length > j && mask.charAt(j) === '0') {
j++;
e++;
}
if (e > 0) {
i = j - 1;
exponent = e;
signExponent = signSeen;
(beforeDP ? before : after).push(c);
}
else {
(beforeDP ? before : after).push(`"${c}`);
}
break;
}
case '\\': {
if (i < mask.length - 1) {
(beforeDP ? before : after).push(`"${mask.charAt(++i)}`);
}
else {
(beforeDP ? before : after).push('"\\');
}
break;
}
default: {
(beforeDP ? before : after).push(`"${c}`);
break;
}
}
if (beforeDP && c !== ',') {
if (commas > 0) {
group = true;
}
commas = 0;
}
}
scale /= 1000 ** commas;
return {
aMask: after,
aDigits: after.reduce((acc, val) => (val === '0' || val === '#' ? acc + 1 : acc), 0),
bMask: before,
bDigits: before.reduce((acc, val) => (val === '0' || val === '#' ? acc + 1 : acc), 0),
scale: scale,
group: group,
exponent: exponent,
signExponent: signExponent,
precision: precision,
};
}
/**
* Internal utility for formatting a number into its sign, mantissa, and exponent components.
*
* This function prepares a number for custom formatting by extracting its sign, splitting it into digits,
* handling rounding, scaling, significant digits, leading zeros, and trimming zeros as specified.
* It returns a `NumberFormatter` instance, which provides a fluent API for building the final formatted string.
* @param input - The number to format.
* @param options - Formatting options:
* - `round`: Number of decimal places to round to (optional).
* - `precision`: Total number of significant digits to display (optional).
* - `scale`: Power-of-10 exponent to add to the number before formatting (optional).
* - `lead`: Minimum number of integer digits to display (default: 1).
* - `trim`: Which zeros to trim ('none', 'front', 'back', 'all'; default: 'none').
* @returns A `NumberFormatter` instance for further formatting and string building.
* @example
* ```typescript
* const fmt = format(1234.567, { round: 2 });
* const str = fmt.minus('-').whole().decimal().fraction().build(); // "1234.57"
* ```
* @internal
*/
function format(input, { round, precision, scale, lead = 1, trim = 'none' }) {
const sign = Math.sign(input);
const [m, e] = Math.abs(input).toExponential(15).split('e');
let exponent = Number(e) + 1; // +1 because we store the number without the decimal point
const mantissa = m.replace('.', empty).split(empty);
while (mantissa.length > exponent && mantissa.at(-1) === '0') {
--mantissa.length;
}
const rounder = (num) => {
let n = num;
if (mantissa.length < n) {
while (mantissa.length < n) {
mantissa.push('0');
}
}
else {
const c = mantissa[n];
mantissa.length = n;
if (c > '4') {
for (;;) {
if (n < 0) {
mantissa.unshift('0');
++exponent;
n = 1;
}
const d = mantissa[--n];
if (d === '0') {
mantissa[n] = '1';
break;
}
if (d === '1') {
mantissa[n] = '2';
break;
}
if (d === '2') {
mantissa[n] = '3';
break;
}
if (d === '3') {
mantissa[n] = '4';
break;
}
if (d === '4') {
mantissa[n] = '5';
break;
}
if (d === '5') {
mantissa[n] = '6';
break;
}
if (d === '6') {
mantissa[n] = '7';
break;
}
if (d === '7') {
mantissa[n] = '8';
break;
}
if (d === '8') {
mantissa[n] = '9';
break;
}
if (d === '9') {
mantissa[n] = '0';
mantissa.unshift('1');
++exponent;
break;
}
}
}
}
};
if (scale !== undefined) {
exponent += scale;
}
if (round !== undefined) {
rounder(exponent + round);
}
if (precision !== undefined) {
rounder(precision);
}
let length = Math.min(exponent, mantissa.length);
while (length < lead) {
mantissa.unshift('0');
++exponent;
++length;
}
if (trim === 'front' || trim === 'all') {
while (mantissa.length > 1 && mantissa[0] === '0') {
mantissa.shift();
--exponent;
}
}
if (trim === 'back' || trim === 'all') {
while (mantissa.length > exponent && mantissa.at(-1) === '0') {
--mantissa.length;
}
}
return new NumberFormatter(sign, mantissa, exponent);
}
/**
* Formats numbers by manipulating their sign, mantissa, and exponent components.
*
* The `NumberFormatter` class provides a fluent API for constructing formatted number strings,
* supporting features such as sign handling, digit grouping, decimal and fractional parts,
* and scientific notation. The output is built incrementally and can be retrieved as a string.
* @example
* ```typescript
* const formatter = new NumberFormatter(1, ['1', '2', '3', '4'], 2);
* const result = formatter.grouped().decimal().fraction().build(); // "1,2.34"
* ```
* @internal
*/
class NumberFormatter {
sign;
mantissa;
exponent;
constructor(sign, mantissa, exponent) {
this.sign = sign;
this.mantissa = mantissa;
this.exponent = exponent;
this.output = [];
}
output;
minus(negative, positive = empty) {
this.output.push(this.sign < 0 ? negative : positive);
return this;
}
grouped() {
const whole = this.mantissa.slice(0, this.exponent);
this.output.push(whole.map((c, i) => (i > 0 && (whole.length - i) % 3 === 0 ? `,${c}` : c)));
return this;
}
whole() {
const whole = this.mantissa.slice(0, this.exponent);
while (whole.length < this.exponent) {
whole.push('0');
}
this.output.push(whole);
return this;
}
decimal() {
if (this.exponent < this.mantissa.length) {
this.output.push('.');
}
return this;
}
fraction() {
this.output.push(this.mantissa.slice(this.exponent));
return this;
}
text(str) {
this.output.push(str);
return this;
}
scientific(e) {
this.output.push(this.mantissa[0], '.', this.mantissa.slice(1), e, this.exponent > 0 ? '+' : empty, pad(this.exponent - 1, 3));
return this;
}
build() {
return build(...this.output);
}
}
//#endregion
//#region formatNumber
/**
* Formats a number according to the specified mask.
*
* The mask can be a standard numeric format string (e.g., "C", "D", "E", "F", "G", "N", "P", "R", "X")
* with an optional precision specifier, or a custom numeric format string with optional sections for
* positive, negative, and zero values separated by semicolons.
*
* Standard format specifiers:
* - "C" or "c": Currency format.
* - "D" or "d": Decimal format.
* - "E" or "e": Scientific (exponential) format.
* - "F" or "f": Fixed-point format.
* - "G" or "g": General format (compact representation).
* - "N" or "n": Number format with group separators.
* - "P" or "p": Percent format.
* - "R" or "r": Round-trip format (ensures that a number converted to a string and back again yields the same number).
* - "X" or "x": Hexadecimal format.
*
* Custom format strings can include digit placeholders, group separators, decimal points, and
* optional sections for positive, negative, and zero values.
* @param input - The number to format.
* @param mask - The format mask string.
* @returns The formatted number as a string.
* @example
* ```typescript
* formatNumber(1234.56, "C2"); // "$1,234.56"
* formatNumber(-42, "D5"); // "-00042"
* formatNumber(0.123, "P1"); // "12.3 %"
* formatNumber(12345.678, "#,##0.00"); // "12,345.68"
* ```
* @group Math
* @category Verbalization
*/
export function formatNumber(input, mask) {
// cspell:ignore CDEFGNPX
if (/^([CDEFGNPX][0-9]*)|R$/iu.test(mask)) {
const f = mask.charAt(0);
let prec = Number.parseInt(mask.slice(1));
switch (f) {
case 'C':
case 'c': {
prec = Number.isNaN(prec) ? 2 : prec;
return format(input, { round: prec, lead: 1 })
.minus('($', '$')
.grouped()
.decimal()
.fraction()
.minus(')')
.build();
}
case 'D':
case 'd': {
prec = Number.isNaN(prec) ? 2 : prec;
return format(input, { round: 0, lead: prec }).minus('-').whole().build();
}
case 'E':
case 'e': {
prec = Number.isNaN(prec) ? 6 : prec;
return format(input, { precision: prec + 1 })
.minus('-')
.scientific(f)
.build();
}
case 'F':
case 'f': {
prec = Number.isNaN(prec) ? 2 : prec;
return format(input, { round: prec }).minus('-').whole().decimal().fraction().build();
}
case 'G':
case 'g': {
prec = Number.isNaN(prec) ? 15 : prec;
const sci = format(input, { precision: prec, trim: 'all' })
.minus('-')
.scientific(f === 'G' ? 'E' : 'e')
.build();
const fix = format(input, { precision: prec, trim: 'back' })
.minus('-')
.whole()
.decimal()
.fraction()
.build();
return sci.length < fix.length ? sci : fix;
}
case 'N':
case 'n': {
prec = Number.isNaN(prec) ? 2 : prec;
return format(input, { round: prec }).minus('-').grouped().decimal().fraction().build();
}
case 'P':
case 'p': {
prec = Number.isNaN(prec) ? 2 : prec;
return format(input, { scale: 2, round: prec })
.minus('-')
.whole()
.decimal()
.fraction()
.text(' %')
.build();
}
case 'R':
case 'r': {
return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
.map((p) => input.toPrecision(p))
.find((n) => Number.parseFloat(n) === input);
}
// no default
}
prec = Number.isNaN(prec) ? 0 : prec;
// eslint-disable-next-line no-bitwise
let hex = (input >>> 0).toString(16);
hex = hex.padStart(prec, '0');
if (f === 'X') {
hex = hex.toLocaleUpperCase();
}
return hex;
}
const formats = mask.split(';');
let fmt = parse(formats[0]);
if (Number.parseFloat((input * fmt.scale).toFixed(fmt.precision)) === 0) {
fmt = formats.length < 3 ? fmt : parse(formats[2]);
}
else if (input < 0) {
fmt = formats.length < 2 ? parse(`-${formats[0]}`) : parse(formats[1]);
}
let w;
let f;
let exp = 0;
if (fmt.exponent > 0) {
const [m, e] = Math.abs(input)
.toExponential(fmt.aDigits + fmt.bDigits - 1)
.split('e');
[w, f] = m.split('.').map((x) => x.split(empty));
exp = Number(e);
while (w.length < fmt.bDigits) {
w.push(f.shift());
exp--;
}
}
else if (fmt.bDigits === 0) {
w = Math.abs(input * fmt.scale)
.toFixed(0)
.split(empty);
f = [];
}
else {
let scaled = Math.abs(input * fmt.scale);
let rescale = 0;
let str;
let split;
//toFixed for numbers greater than 1e21 return scientific notation...
while (scaled > 1e21) {
scaled /= 1e21;
rescale += 21;
}
if (rescale > 0) {
str = scaled.toFixed(17);
split = str.split('.');
w = split[0].split(empty);
f = split[1].split(empty);
while (rescale-- > 0) {
w.push(f.shift());
f.push('0');
}
}
else {
str = scaled.toFixed(fmt.aDigits);
split = str.split('.');
w = split[0].split(empty); //whole part
f = split.length > 1 ? split[1].split(empty) : []; //fractional
}
}
while (w.length > 0 && w[0] === '0') {
w.shift();
}
let o = empty;
let d = 0;
let b = fmt.bDigits;
for (let i = fmt.bMask.length - 1; i >= 0; --i) {
const x = fmt.bMask[i];
if (x === '0' || x === '#') {
if (fmt.group && d === 3 && w.length > 0) {
o = `,${o}`;
d = 0;
}
if (x === '0') {
o = w.length > 0 ? w.pop() + o : `0${o}`;
d++;
b--;
}
else if (w.length > 0) {
o = w.pop() + o;
d++;
b--;
}
while (b <= 0 && w.length > 0) {
if (fmt.group && d === 3) {
o = `,${o}`;
d = 0;
}
o = w.pop() + o;
d++;
b--;
}
}
else if (x === 'e' || x === 'E') {
o = `${x}-${pad(Math.abs(exp), fmt.exponent)}${o}`;
}
else {
o = x.slice(1) + o;
}
}
if (fmt.aMask.length > 0) {
let a = empty;
let digits = false;
for (const x of fmt.aMask) {
switch (x) {
case '0': {
a += f.shift();
digits = true;
break;
}
case '#': {
if (f.reduce((acc, val) => (val === '0' ? acc : true), false)) {
a += f.shift();
digits = true;
}
break;
}
case 'e':
case 'E': {
a =
a +
x +
(fmt.signExponent || exp < 0 ?
exp < 0 ?
'-'
: '+'
: empty) +
pad(Math.abs(exp), fmt.exponent);
break;
}
default: {
a += x.slice(1);
}
}
}
o += digits ? `.${a}` : a;
}
return o;
}
//#endregion
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LW51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mb3JtYXQtbnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXFGckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILFNBQVMsS0FBSyxDQUFDLElBQVk7SUFDekIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDekIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVsQixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFZixRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7WUFDMUIs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QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUVyQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO3FCQUMxQyxLQUFLLENBQUMsR0FBRyxDQUFDO3FCQUNWLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ2IsS0FBSyxFQUFFLENBQUM7WUFDYixDQUFDO1lBQ0QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEYsQ0FBQztZQUNELEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNULElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFFdEMsTUFB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