toolbox-x 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/index.cjs +73 -3
- package/dist/index.d.cts +46 -1
- package/dist/index.d.mts +46 -1
- package/dist/index.mjs +69 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to **toolbox-x** will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
> Auto-generated from git history using [changelog-maker](https://github.com/nodejs/changelog-maker).
|
|
6
6
|
|
|
7
|
+
## [v2.4.0](https://github.com/nazmul-nhb/toolbox-x/releases/tag/v2.4.0) — 2026-06-17
|
|
8
|
+
|
|
9
|
+
[Compare changes](https://github.com/nazmul-nhb/toolbox-x/compare/v2.3.0...v2.4.0)
|
|
10
|
+
|
|
11
|
+
* \[[`4d73725523`](https://github.com/nazmul-nhb/toolbox-x/commit/4d73725523)] - ✨ feat(number): added 2 new utils with docs: `safeAdd` and `getDecimalPlaces` (Nazmul Hassan)
|
|
12
|
+
* \[[`afdab94c08`](https://github.com/nazmul-nhb/toolbox-x/commit/afdab94c08)] - 🔧 update(docs): added docs for new hash utils (Nazmul Hassan)
|
|
13
|
+
* \[[`625265f93f`](https://github.com/nazmul-nhb/toolbox-x/commit/625265f93f)] - 📚 docs: updated CHANGELOG.md for v2.3.0 (github-actions\[bot])
|
|
14
|
+
|
|
7
15
|
## [v2.3.0](https://github.com/nazmul-nhb/toolbox-x/releases/tag/v2.3.0) — 2026-06-16
|
|
8
16
|
|
|
9
17
|
[Compare changes](https://github.com/nazmul-nhb/toolbox-x/compare/v2.2.5...v2.3.0)
|
package/dist/index.cjs
CHANGED
|
@@ -577,8 +577,8 @@ function getAverage(...numbers) {
|
|
|
577
577
|
let sum = 0;
|
|
578
578
|
let count = 0;
|
|
579
579
|
for (const n of numbers) {
|
|
580
|
-
const num =
|
|
581
|
-
if (require_primitives.
|
|
580
|
+
const num = require_utilities.normalizeNumber(n);
|
|
581
|
+
if (!require_primitives.isUndefined(num)) {
|
|
582
582
|
sum += num;
|
|
583
583
|
count++;
|
|
584
584
|
}
|
|
@@ -586,6 +586,72 @@ function getAverage(...numbers) {
|
|
|
586
586
|
return count === 0 ? NaN : Math.round(sum / count * 1e3) / 1e3;
|
|
587
587
|
}
|
|
588
588
|
/**
|
|
589
|
+
* * Returns the number of decimal places represented by a number.
|
|
590
|
+
*
|
|
591
|
+
* @param value - The number or numeric string for which to calculate the number of decimal places.
|
|
592
|
+
* @returns The number of decimal places.
|
|
593
|
+
*
|
|
594
|
+
* @throws - {@link TypeError} - If the input value cannot be converted to a number, e.g. `undefined`, `null`, `NaN`, `'11x'` etc..
|
|
595
|
+
*
|
|
596
|
+
* @remarks
|
|
597
|
+
* - If a numeric string in scientific notation (e.g., '1e-6') is provided, it will calculate the decimal places accordingly.
|
|
598
|
+
* - If a numeric string has trailing zeros (e.g., ''1.00'' or `'9.900'`),
|
|
599
|
+
* it will convert them as: `'1.00'` -> `1`, `'9.900'` -> `9.9` and return `0` and `1` respectively.
|
|
600
|
+
* - If a number is an integer, it will return `0`.
|
|
601
|
+
* - Internally uses {@link normalizeNumber} to normalize the input value.
|
|
602
|
+
*
|
|
603
|
+
* @example
|
|
604
|
+
* getDecimalPlaces(123.456); // 3
|
|
605
|
+
* getDecimalPlaces('123.45600'); // 3
|
|
606
|
+
* getDecimalPlaces(123); // 0
|
|
607
|
+
* getDecimalPlaces('1e-6'); // 6
|
|
608
|
+
* getDecimalPlaces('1.00'); // 0
|
|
609
|
+
* getDecimalPlaces('9.900'); // 1
|
|
610
|
+
*/
|
|
611
|
+
function getDecimalPlaces(value) {
|
|
612
|
+
const number = require_utilities.normalizeNumber(value);
|
|
613
|
+
if (require_primitives.isUndefined(number)) throw new TypeError(`Invalid numeric representation: ${value}`);
|
|
614
|
+
const str = String(number);
|
|
615
|
+
if (str.includes("e-")) {
|
|
616
|
+
const [, exponent] = str.split("e-");
|
|
617
|
+
return Number(exponent);
|
|
618
|
+
}
|
|
619
|
+
const [, decimal = ""] = str.split(".");
|
|
620
|
+
return decimal.length;
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* * Adds numbers safely, avoiding floating-point arithmetic issues.
|
|
624
|
+
*
|
|
625
|
+
* @param values - A list of numbers or numeric strings to add.
|
|
626
|
+
* @returns The sum of the provided numbers, with floating-point inaccuracies mitigated.
|
|
627
|
+
*
|
|
628
|
+
* @remarks
|
|
629
|
+
* - This function addresses common floating-point addition errors (e.g., `0.1 + 0.2 !== 0.3`)
|
|
630
|
+
* by temporarily scaling numbers to integers, performing the addition, and then scaling back.
|
|
631
|
+
* - Non-numeric values are safely ignored in the runtime.
|
|
632
|
+
* - Rounding is used to mitigate floating-point inaccuracies.
|
|
633
|
+
* - Intended for use cases where floating-point inaccuracies are a concern.
|
|
634
|
+
* - Internally uses {@link normalizeNumber}, {@link getDecimalPlaces}, {@link roundNumber}.
|
|
635
|
+
* - It does not handle numbers beyond {@link Number.MAX_SAFE_INTEGER} or {@link Number.MIN_SAFE_INTEGER}.
|
|
636
|
+
* May output incorrect results if the numbers are too large.
|
|
637
|
+
* @example
|
|
638
|
+
* safeAdd(0.1, 0.2); // → 0.3 (correctly handles floating-point error)
|
|
639
|
+
* safeAdd(1, '2', 3.456); // → 6.456
|
|
640
|
+
* safeAdd(0.1, 0.2, 0.3, 0.4); // → 1.0 (accurate sum)
|
|
641
|
+
*/
|
|
642
|
+
function safeAdd(...values) {
|
|
643
|
+
let scale = 1;
|
|
644
|
+
const nums = [];
|
|
645
|
+
for (const value of values) {
|
|
646
|
+
const num = require_utilities.normalizeNumber(value);
|
|
647
|
+
if (!require_primitives.isUndefined(num)) {
|
|
648
|
+
nums.push(num);
|
|
649
|
+
scale = Math.max(scale, 10 ** getDecimalPlaces(num));
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
return nums.reduce((total, value) => total + roundNumber(value * scale, 0), 0) / scale;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
589
655
|
* * Rounds a number to a specified number of decimal places.
|
|
590
656
|
*
|
|
591
657
|
* @param number - The number to round.
|
|
@@ -2176,7 +2242,9 @@ exports.Currency = Currency;
|
|
|
2176
2242
|
exports.Finder = Finder;
|
|
2177
2243
|
exports.Unit = Unit;
|
|
2178
2244
|
exports.UnitConverter = Unit;
|
|
2245
|
+
exports.add = safeAdd;
|
|
2179
2246
|
exports.arabicToRoman = convertToRomanNumerals;
|
|
2247
|
+
exports.average = getAverage;
|
|
2180
2248
|
exports.averageByField = averageByField;
|
|
2181
2249
|
exports.avgByField = averageByField;
|
|
2182
2250
|
exports.banglaToDigit = banglaToDigit;
|
|
@@ -2219,6 +2287,7 @@ exports.countWordsInString = countWords;
|
|
|
2219
2287
|
exports.createOptionsArray = createOptionsArray;
|
|
2220
2288
|
exports.createQueryParams = require_query.generateQueryParams;
|
|
2221
2289
|
exports.debounceAction = require_utils.debounceAction;
|
|
2290
|
+
exports.decimalPlaces = getDecimalPlaces;
|
|
2222
2291
|
exports.deepParsePrimitives = require_utils.deepParsePrimitives;
|
|
2223
2292
|
exports.definePrototypeMethod = require_utils.definePrototypeMethod;
|
|
2224
2293
|
exports.deleteFields = deleteFields;
|
|
@@ -2259,10 +2328,10 @@ exports.generateFibonacci = fibonacciGenerator;
|
|
|
2259
2328
|
exports.generateQueryParams = require_query.generateQueryParams;
|
|
2260
2329
|
exports.generateRandomID = require_utils.generateRandomID;
|
|
2261
2330
|
exports.getAverage = getAverage;
|
|
2262
|
-
exports.getAverageOfNumbers = getAverage;
|
|
2263
2331
|
exports.getCharacterDifferences = getCharacterDifferences;
|
|
2264
2332
|
exports.getClassDetails = require_utils.getClassDetails;
|
|
2265
2333
|
exports.getCountryByPhone = getCountryByPhone;
|
|
2334
|
+
exports.getDecimalPlaces = getDecimalPlaces;
|
|
2266
2335
|
exports.getDivisors = getFactors;
|
|
2267
2336
|
exports.getDuplicates = getDuplicates;
|
|
2268
2337
|
exports.getDuplicatesFromArray = getDuplicates;
|
|
@@ -2354,6 +2423,7 @@ exports.roundNumberToNearestInterval = require_utilities.roundToNearest;
|
|
|
2354
2423
|
exports.roundToDecimal = roundNumber;
|
|
2355
2424
|
exports.roundToNearest = require_utilities.roundToNearest;
|
|
2356
2425
|
exports.roundToNearestInterval = require_utilities.roundToNearest;
|
|
2426
|
+
exports.safeAdd = safeAdd;
|
|
2357
2427
|
exports.sanitizeData = require_query.sanitizeData;
|
|
2358
2428
|
exports.shuffleArray = require_basics.shuffleArray;
|
|
2359
2429
|
exports.slugifyString = require_basics.slugifyString;
|
package/dist/index.d.cts
CHANGED
|
@@ -292,6 +292,51 @@ declare function reverseNumber(num: Numeric): number;
|
|
|
292
292
|
* @returns The average of the provided numbers. Returns `NaN` if no numbers are valid.
|
|
293
293
|
*/
|
|
294
294
|
declare function getAverage(...numbers: Numeric[]): number;
|
|
295
|
+
/**
|
|
296
|
+
* * Returns the number of decimal places represented by a number.
|
|
297
|
+
*
|
|
298
|
+
* @param value - The number or numeric string for which to calculate the number of decimal places.
|
|
299
|
+
* @returns The number of decimal places.
|
|
300
|
+
*
|
|
301
|
+
* @throws - {@link TypeError} - If the input value cannot be converted to a number, e.g. `undefined`, `null`, `NaN`, `'11x'` etc..
|
|
302
|
+
*
|
|
303
|
+
* @remarks
|
|
304
|
+
* - If a numeric string in scientific notation (e.g., '1e-6') is provided, it will calculate the decimal places accordingly.
|
|
305
|
+
* - If a numeric string has trailing zeros (e.g., ''1.00'' or `'9.900'`),
|
|
306
|
+
* it will convert them as: `'1.00'` -> `1`, `'9.900'` -> `9.9` and return `0` and `1` respectively.
|
|
307
|
+
* - If a number is an integer, it will return `0`.
|
|
308
|
+
* - Internally uses {@link normalizeNumber} to normalize the input value.
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* getDecimalPlaces(123.456); // 3
|
|
312
|
+
* getDecimalPlaces('123.45600'); // 3
|
|
313
|
+
* getDecimalPlaces(123); // 0
|
|
314
|
+
* getDecimalPlaces('1e-6'); // 6
|
|
315
|
+
* getDecimalPlaces('1.00'); // 0
|
|
316
|
+
* getDecimalPlaces('9.900'); // 1
|
|
317
|
+
*/
|
|
318
|
+
declare function getDecimalPlaces(value: Numeric): number;
|
|
319
|
+
/**
|
|
320
|
+
* * Adds numbers safely, avoiding floating-point arithmetic issues.
|
|
321
|
+
*
|
|
322
|
+
* @param values - A list of numbers or numeric strings to add.
|
|
323
|
+
* @returns The sum of the provided numbers, with floating-point inaccuracies mitigated.
|
|
324
|
+
*
|
|
325
|
+
* @remarks
|
|
326
|
+
* - This function addresses common floating-point addition errors (e.g., `0.1 + 0.2 !== 0.3`)
|
|
327
|
+
* by temporarily scaling numbers to integers, performing the addition, and then scaling back.
|
|
328
|
+
* - Non-numeric values are safely ignored in the runtime.
|
|
329
|
+
* - Rounding is used to mitigate floating-point inaccuracies.
|
|
330
|
+
* - Intended for use cases where floating-point inaccuracies are a concern.
|
|
331
|
+
* - Internally uses {@link normalizeNumber}, {@link getDecimalPlaces}, {@link roundNumber}.
|
|
332
|
+
* - It does not handle numbers beyond {@link Number.MAX_SAFE_INTEGER} or {@link Number.MIN_SAFE_INTEGER}.
|
|
333
|
+
* May output incorrect results if the numbers are too large.
|
|
334
|
+
* @example
|
|
335
|
+
* safeAdd(0.1, 0.2); // → 0.3 (correctly handles floating-point error)
|
|
336
|
+
* safeAdd(1, '2', 3.456); // → 6.456
|
|
337
|
+
* safeAdd(0.1, 0.2, 0.3, 0.4); // → 1.0 (accurate sum)
|
|
338
|
+
*/
|
|
339
|
+
declare function safeAdd(...values: Numeric[]): number;
|
|
295
340
|
/**
|
|
296
341
|
* * Rounds a number to a specified number of decimal places.
|
|
297
342
|
*
|
|
@@ -1235,4 +1280,4 @@ declare function remapFields<Source extends GenericObject, Target extends Record
|
|
|
1235
1280
|
*/
|
|
1236
1281
|
declare function getCountryByPhone(phone: number | string): CountryDetails[];
|
|
1237
1282
|
//#endregion
|
|
1238
|
-
export { Currency, Finder, Unit, Unit as UnitConverter, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral,
|
|
1283
|
+
export { Currency, Finder, Unit, Unit as UnitConverter, safeAdd as add, safeAdd, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral, getAverage as average, getAverage as calculateAverage, getAverage, averageByField, averageByField as avgByField, banglaToDigit, factorial as calculateFactorial, factorial, factorial as getFactorial, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, calculatePercentage, capitalizeString, getOrdinal as cardinalToOrdinal, getOrdinal as convertNumberToOrdinal, getOrdinal as convertToOrdinal, getOrdinal, getOrdinal as getOrdinalNumber, getOrdinal as numberToOrdinal, numberToWordsOrdinal as cardinalWordsToOrdinal, numberToWordsOrdinal as convertNumberToWordsOrdinal, numberToWordsOrdinal, clampNumber, cloneObject, naturalSort as compareNaturally, naturalSort as compareSorter, naturalSort, naturalSort as naturalSortForString, computeTextDiff, convertArrayToString, convertArrayToString as joinArrayElements, formatCurrency as convertNumberToCurrency, formatCurrency, numberToWords as convertNumberToWords, numberToWords, convertObjectValues, romanToInteger as convertRomanToArabic, romanToInteger as convertRomanToInteger, romanToInteger as convertRomanToNumeric, romanToInteger as romanToArabic, romanToInteger, romanToInteger as romanToNumeric, convertStringCase, convertToDecimal, convertToDecimal as convertToFixed, wordsToNumber as convertWordToNumber, wordsToNumber as convertWordsToNumber, wordsToNumber as wordToNumber, wordsToNumber, countInstanceMethods, countInstanceMethods as getInstanceMethodsCount, countObjectFields, countStaticMethods, countStaticMethods as getStaticMethodsCount, countWords, countWords as countWordsInString, countWords as wordCount, createOptionsArray, generateQueryParams as createQueryParams, generateQueryParams as formatQueryParams, generateQueryParams, debounceAction, getDecimalPlaces as decimalPlaces, getDecimalPlaces, deepParsePrimitives, deepParsePrimitives as parsePrimitivesDeep, definePrototypeMethod, deleteFields, deleteFields as deleteObjectFields, deleteFields as omitFields, deleteFields as omitObjectFields, deleteFields as removeFields, deleteFields as removeObjectFields, digitToBangla, getDuplicates as extractDuplicates, getDuplicates as extractDuplicatesFromArray, getDuplicates, getDuplicates as getDuplicatesFromArray, extractEmails, extractObjectEntries as extractEntries, extractObjectEntries, extractObjectEntries as objectEntries, extractObjectKeys as extractKeys, extractObjectKeys, extractObjectKeysDeep as extractKeysDeep, extractObjectKeysDeep, findMissingElements as extractMissingElements, findMissingElements, findMissingElements as getMissingElements, extractNewFields, extractNumbersFromString as extractNumbers, extractNumbersFromString, extractNumbersFromString as parseNumbersFromText, extractURLs, extractUpdatedAndNewFields, extractUpdatedFields, getFactors as factorsOf, getFactors as getDivisors, getFactors, fibonacciGenerator, fibonacciGenerator as generateFibonacci, filterArrayOfObjects, findPrimeNumbers, findPrimeNumbers as getPrimeNumbers, flattenArray, flattenObjectDotNotation, flattenObjectKeyValue, formatUnitWithPlural as formatNumberWithPluralUnit, formatUnitWithPlural, formatUnitWithPlural as formatWithPlural, generateAnagrams, generateRandomID, getCharacterDifferences, getClassDetails, getCountryByPhone, getFibonacciSeries as getFibonacci, getFibonacciSeries as getFibonacciNumbers, getFibonacciSeries, getFibonacciSeriesMemo, getFibonacciSeriesMemo as getMemoizedFibonacci, getFibonacciSeriesMemo as getMemoizedFibonacciSeries, getInstanceGetterNames, getInstanceMethodNames, getLastArrayElement, getLevenshteinDistance, getLevenshteinDistance as levenshteinDistance, getNthFibonacci, getNumbersInRange, parseQueryString as getQueryStringAsObject, parseQueryString, parseQueryString as queryStringToObject, getRandomFloat as getRandomDecimal, getRandomFloat, getRandomNumber as getRandomInt, getRandomNumber, getStaticGetterNames, getStaticMethodNames, sumNumbers as getSumOfNumbers, sumNumbers, sumNumbers as sumOfNumbers, groupAndAverageByField, groupAndAverageByField as groupAndAvgByField, groupAndSumByField, splitArrayByProperty as groupArrayByProperty, splitArrayByProperty, isDeepEqual, isInvalidOrEmptyArray, isPrime, isPrime as isPrimeNumber, parseQueryStringLiteral as literalQueryStringToObject, parseQueryStringLiteral, maskString, mergeAndFlattenObjects, mergeObjects, moveArrayElement, normalizeNumber, normalizeString, parseJSON, parseJSON as parseJsonDeep, parseJsonToObject, parseObjectValues, parseObjectValues as parseStringifiedObjectValues, pickFields, pickFields as pickObjectFields, pickObjectFieldsByCondition as pickFieldsByCondition, pickObjectFieldsByCondition, remapFields, remapFields as remapObjectFields, removeDuplicatesFromArray as removeDuplicates, removeDuplicatesFromArray, replaceAllInString, reverseNumber, reverseString, rotateArray, roundNumber, roundNumber as roundToDecimal, roundToNearest as roundNumberToNearestInterval, roundToNearest, roundToNearest as roundToNearestInterval, sanitizeData, shuffleArray, slugifyString, sortAnArray, splitArray, stableStringify, stripJsonEdgeGarbage, sumByField, sumDigits, sumFieldDifference, sumFieldDifference as totalDeltaByField, throttleAction, trimString, truncateString };
|
package/dist/index.d.mts
CHANGED
|
@@ -292,6 +292,51 @@ declare function reverseNumber(num: Numeric): number;
|
|
|
292
292
|
* @returns The average of the provided numbers. Returns `NaN` if no numbers are valid.
|
|
293
293
|
*/
|
|
294
294
|
declare function getAverage(...numbers: Numeric[]): number;
|
|
295
|
+
/**
|
|
296
|
+
* * Returns the number of decimal places represented by a number.
|
|
297
|
+
*
|
|
298
|
+
* @param value - The number or numeric string for which to calculate the number of decimal places.
|
|
299
|
+
* @returns The number of decimal places.
|
|
300
|
+
*
|
|
301
|
+
* @throws - {@link TypeError} - If the input value cannot be converted to a number, e.g. `undefined`, `null`, `NaN`, `'11x'` etc..
|
|
302
|
+
*
|
|
303
|
+
* @remarks
|
|
304
|
+
* - If a numeric string in scientific notation (e.g., '1e-6') is provided, it will calculate the decimal places accordingly.
|
|
305
|
+
* - If a numeric string has trailing zeros (e.g., ''1.00'' or `'9.900'`),
|
|
306
|
+
* it will convert them as: `'1.00'` -> `1`, `'9.900'` -> `9.9` and return `0` and `1` respectively.
|
|
307
|
+
* - If a number is an integer, it will return `0`.
|
|
308
|
+
* - Internally uses {@link normalizeNumber} to normalize the input value.
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* getDecimalPlaces(123.456); // 3
|
|
312
|
+
* getDecimalPlaces('123.45600'); // 3
|
|
313
|
+
* getDecimalPlaces(123); // 0
|
|
314
|
+
* getDecimalPlaces('1e-6'); // 6
|
|
315
|
+
* getDecimalPlaces('1.00'); // 0
|
|
316
|
+
* getDecimalPlaces('9.900'); // 1
|
|
317
|
+
*/
|
|
318
|
+
declare function getDecimalPlaces(value: Numeric): number;
|
|
319
|
+
/**
|
|
320
|
+
* * Adds numbers safely, avoiding floating-point arithmetic issues.
|
|
321
|
+
*
|
|
322
|
+
* @param values - A list of numbers or numeric strings to add.
|
|
323
|
+
* @returns The sum of the provided numbers, with floating-point inaccuracies mitigated.
|
|
324
|
+
*
|
|
325
|
+
* @remarks
|
|
326
|
+
* - This function addresses common floating-point addition errors (e.g., `0.1 + 0.2 !== 0.3`)
|
|
327
|
+
* by temporarily scaling numbers to integers, performing the addition, and then scaling back.
|
|
328
|
+
* - Non-numeric values are safely ignored in the runtime.
|
|
329
|
+
* - Rounding is used to mitigate floating-point inaccuracies.
|
|
330
|
+
* - Intended for use cases where floating-point inaccuracies are a concern.
|
|
331
|
+
* - Internally uses {@link normalizeNumber}, {@link getDecimalPlaces}, {@link roundNumber}.
|
|
332
|
+
* - It does not handle numbers beyond {@link Number.MAX_SAFE_INTEGER} or {@link Number.MIN_SAFE_INTEGER}.
|
|
333
|
+
* May output incorrect results if the numbers are too large.
|
|
334
|
+
* @example
|
|
335
|
+
* safeAdd(0.1, 0.2); // → 0.3 (correctly handles floating-point error)
|
|
336
|
+
* safeAdd(1, '2', 3.456); // → 6.456
|
|
337
|
+
* safeAdd(0.1, 0.2, 0.3, 0.4); // → 1.0 (accurate sum)
|
|
338
|
+
*/
|
|
339
|
+
declare function safeAdd(...values: Numeric[]): number;
|
|
295
340
|
/**
|
|
296
341
|
* * Rounds a number to a specified number of decimal places.
|
|
297
342
|
*
|
|
@@ -1235,4 +1280,4 @@ declare function remapFields<Source extends GenericObject, Target extends Record
|
|
|
1235
1280
|
*/
|
|
1236
1281
|
declare function getCountryByPhone(phone: number | string): CountryDetails[];
|
|
1237
1282
|
//#endregion
|
|
1238
|
-
export { Currency, Finder, Unit, Unit as UnitConverter, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral,
|
|
1283
|
+
export { Currency, Finder, Unit, Unit as UnitConverter, safeAdd as add, safeAdd, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral, getAverage as average, getAverage as calculateAverage, getAverage, averageByField, averageByField as avgByField, banglaToDigit, factorial as calculateFactorial, factorial, factorial as getFactorial, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, calculatePercentage, capitalizeString, getOrdinal as cardinalToOrdinal, getOrdinal as convertNumberToOrdinal, getOrdinal as convertToOrdinal, getOrdinal, getOrdinal as getOrdinalNumber, getOrdinal as numberToOrdinal, numberToWordsOrdinal as cardinalWordsToOrdinal, numberToWordsOrdinal as convertNumberToWordsOrdinal, numberToWordsOrdinal, clampNumber, cloneObject, naturalSort as compareNaturally, naturalSort as compareSorter, naturalSort, naturalSort as naturalSortForString, computeTextDiff, convertArrayToString, convertArrayToString as joinArrayElements, formatCurrency as convertNumberToCurrency, formatCurrency, numberToWords as convertNumberToWords, numberToWords, convertObjectValues, romanToInteger as convertRomanToArabic, romanToInteger as convertRomanToInteger, romanToInteger as convertRomanToNumeric, romanToInteger as romanToArabic, romanToInteger, romanToInteger as romanToNumeric, convertStringCase, convertToDecimal, convertToDecimal as convertToFixed, wordsToNumber as convertWordToNumber, wordsToNumber as convertWordsToNumber, wordsToNumber as wordToNumber, wordsToNumber, countInstanceMethods, countInstanceMethods as getInstanceMethodsCount, countObjectFields, countStaticMethods, countStaticMethods as getStaticMethodsCount, countWords, countWords as countWordsInString, countWords as wordCount, createOptionsArray, generateQueryParams as createQueryParams, generateQueryParams as formatQueryParams, generateQueryParams, debounceAction, getDecimalPlaces as decimalPlaces, getDecimalPlaces, deepParsePrimitives, deepParsePrimitives as parsePrimitivesDeep, definePrototypeMethod, deleteFields, deleteFields as deleteObjectFields, deleteFields as omitFields, deleteFields as omitObjectFields, deleteFields as removeFields, deleteFields as removeObjectFields, digitToBangla, getDuplicates as extractDuplicates, getDuplicates as extractDuplicatesFromArray, getDuplicates, getDuplicates as getDuplicatesFromArray, extractEmails, extractObjectEntries as extractEntries, extractObjectEntries, extractObjectEntries as objectEntries, extractObjectKeys as extractKeys, extractObjectKeys, extractObjectKeysDeep as extractKeysDeep, extractObjectKeysDeep, findMissingElements as extractMissingElements, findMissingElements, findMissingElements as getMissingElements, extractNewFields, extractNumbersFromString as extractNumbers, extractNumbersFromString, extractNumbersFromString as parseNumbersFromText, extractURLs, extractUpdatedAndNewFields, extractUpdatedFields, getFactors as factorsOf, getFactors as getDivisors, getFactors, fibonacciGenerator, fibonacciGenerator as generateFibonacci, filterArrayOfObjects, findPrimeNumbers, findPrimeNumbers as getPrimeNumbers, flattenArray, flattenObjectDotNotation, flattenObjectKeyValue, formatUnitWithPlural as formatNumberWithPluralUnit, formatUnitWithPlural, formatUnitWithPlural as formatWithPlural, generateAnagrams, generateRandomID, getCharacterDifferences, getClassDetails, getCountryByPhone, getFibonacciSeries as getFibonacci, getFibonacciSeries as getFibonacciNumbers, getFibonacciSeries, getFibonacciSeriesMemo, getFibonacciSeriesMemo as getMemoizedFibonacci, getFibonacciSeriesMemo as getMemoizedFibonacciSeries, getInstanceGetterNames, getInstanceMethodNames, getLastArrayElement, getLevenshteinDistance, getLevenshteinDistance as levenshteinDistance, getNthFibonacci, getNumbersInRange, parseQueryString as getQueryStringAsObject, parseQueryString, parseQueryString as queryStringToObject, getRandomFloat as getRandomDecimal, getRandomFloat, getRandomNumber as getRandomInt, getRandomNumber, getStaticGetterNames, getStaticMethodNames, sumNumbers as getSumOfNumbers, sumNumbers, sumNumbers as sumOfNumbers, groupAndAverageByField, groupAndAverageByField as groupAndAvgByField, groupAndSumByField, splitArrayByProperty as groupArrayByProperty, splitArrayByProperty, isDeepEqual, isInvalidOrEmptyArray, isPrime, isPrime as isPrimeNumber, parseQueryStringLiteral as literalQueryStringToObject, parseQueryStringLiteral, maskString, mergeAndFlattenObjects, mergeObjects, moveArrayElement, normalizeNumber, normalizeString, parseJSON, parseJSON as parseJsonDeep, parseJsonToObject, parseObjectValues, parseObjectValues as parseStringifiedObjectValues, pickFields, pickFields as pickObjectFields, pickObjectFieldsByCondition as pickFieldsByCondition, pickObjectFieldsByCondition, remapFields, remapFields as remapObjectFields, removeDuplicatesFromArray as removeDuplicates, removeDuplicatesFromArray, replaceAllInString, reverseNumber, reverseString, rotateArray, roundNumber, roundNumber as roundToDecimal, roundToNearest as roundNumberToNearestInterval, roundToNearest, roundToNearest as roundToNearestInterval, sanitizeData, shuffleArray, slugifyString, sortAnArray, splitArray, stableStringify, stripJsonEdgeGarbage, sumByField, sumDigits, sumFieldDifference, sumFieldDifference as totalDeltaByField, throttleAction, trimString, truncateString };
|
package/dist/index.mjs
CHANGED
|
@@ -576,8 +576,8 @@ function getAverage(...numbers) {
|
|
|
576
576
|
let sum = 0;
|
|
577
577
|
let count = 0;
|
|
578
578
|
for (const n of numbers) {
|
|
579
|
-
const num =
|
|
580
|
-
if (
|
|
579
|
+
const num = normalizeNumber(n);
|
|
580
|
+
if (!isUndefined(num)) {
|
|
581
581
|
sum += num;
|
|
582
582
|
count++;
|
|
583
583
|
}
|
|
@@ -585,6 +585,72 @@ function getAverage(...numbers) {
|
|
|
585
585
|
return count === 0 ? NaN : Math.round(sum / count * 1e3) / 1e3;
|
|
586
586
|
}
|
|
587
587
|
/**
|
|
588
|
+
* * Returns the number of decimal places represented by a number.
|
|
589
|
+
*
|
|
590
|
+
* @param value - The number or numeric string for which to calculate the number of decimal places.
|
|
591
|
+
* @returns The number of decimal places.
|
|
592
|
+
*
|
|
593
|
+
* @throws - {@link TypeError} - If the input value cannot be converted to a number, e.g. `undefined`, `null`, `NaN`, `'11x'` etc..
|
|
594
|
+
*
|
|
595
|
+
* @remarks
|
|
596
|
+
* - If a numeric string in scientific notation (e.g., '1e-6') is provided, it will calculate the decimal places accordingly.
|
|
597
|
+
* - If a numeric string has trailing zeros (e.g., ''1.00'' or `'9.900'`),
|
|
598
|
+
* it will convert them as: `'1.00'` -> `1`, `'9.900'` -> `9.9` and return `0` and `1` respectively.
|
|
599
|
+
* - If a number is an integer, it will return `0`.
|
|
600
|
+
* - Internally uses {@link normalizeNumber} to normalize the input value.
|
|
601
|
+
*
|
|
602
|
+
* @example
|
|
603
|
+
* getDecimalPlaces(123.456); // 3
|
|
604
|
+
* getDecimalPlaces('123.45600'); // 3
|
|
605
|
+
* getDecimalPlaces(123); // 0
|
|
606
|
+
* getDecimalPlaces('1e-6'); // 6
|
|
607
|
+
* getDecimalPlaces('1.00'); // 0
|
|
608
|
+
* getDecimalPlaces('9.900'); // 1
|
|
609
|
+
*/
|
|
610
|
+
function getDecimalPlaces(value) {
|
|
611
|
+
const number = normalizeNumber(value);
|
|
612
|
+
if (isUndefined(number)) throw new TypeError(`Invalid numeric representation: ${value}`);
|
|
613
|
+
const str = String(number);
|
|
614
|
+
if (str.includes("e-")) {
|
|
615
|
+
const [, exponent] = str.split("e-");
|
|
616
|
+
return Number(exponent);
|
|
617
|
+
}
|
|
618
|
+
const [, decimal = ""] = str.split(".");
|
|
619
|
+
return decimal.length;
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* * Adds numbers safely, avoiding floating-point arithmetic issues.
|
|
623
|
+
*
|
|
624
|
+
* @param values - A list of numbers or numeric strings to add.
|
|
625
|
+
* @returns The sum of the provided numbers, with floating-point inaccuracies mitigated.
|
|
626
|
+
*
|
|
627
|
+
* @remarks
|
|
628
|
+
* - This function addresses common floating-point addition errors (e.g., `0.1 + 0.2 !== 0.3`)
|
|
629
|
+
* by temporarily scaling numbers to integers, performing the addition, and then scaling back.
|
|
630
|
+
* - Non-numeric values are safely ignored in the runtime.
|
|
631
|
+
* - Rounding is used to mitigate floating-point inaccuracies.
|
|
632
|
+
* - Intended for use cases where floating-point inaccuracies are a concern.
|
|
633
|
+
* - Internally uses {@link normalizeNumber}, {@link getDecimalPlaces}, {@link roundNumber}.
|
|
634
|
+
* - It does not handle numbers beyond {@link Number.MAX_SAFE_INTEGER} or {@link Number.MIN_SAFE_INTEGER}.
|
|
635
|
+
* May output incorrect results if the numbers are too large.
|
|
636
|
+
* @example
|
|
637
|
+
* safeAdd(0.1, 0.2); // → 0.3 (correctly handles floating-point error)
|
|
638
|
+
* safeAdd(1, '2', 3.456); // → 6.456
|
|
639
|
+
* safeAdd(0.1, 0.2, 0.3, 0.4); // → 1.0 (accurate sum)
|
|
640
|
+
*/
|
|
641
|
+
function safeAdd(...values) {
|
|
642
|
+
let scale = 1;
|
|
643
|
+
const nums = [];
|
|
644
|
+
for (const value of values) {
|
|
645
|
+
const num = normalizeNumber(value);
|
|
646
|
+
if (!isUndefined(num)) {
|
|
647
|
+
nums.push(num);
|
|
648
|
+
scale = Math.max(scale, 10 ** getDecimalPlaces(num));
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return nums.reduce((total, value) => total + roundNumber(value * scale, 0), 0) / scale;
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
588
654
|
* * Rounds a number to a specified number of decimal places.
|
|
589
655
|
*
|
|
590
656
|
* @param number - The number to round.
|
|
@@ -2171,4 +2237,4 @@ function getCountryByPhone(phone) {
|
|
|
2171
2237
|
}
|
|
2172
2238
|
|
|
2173
2239
|
//#endregion
|
|
2174
|
-
export { Currency, Finder, Unit, Unit as UnitConverter, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral,
|
|
2240
|
+
export { Currency, Finder, Unit, Unit as UnitConverter, safeAdd as add, safeAdd, convertToRomanNumerals as arabicToRoman, convertToRomanNumerals, convertToRomanNumerals as integerToRoman, convertToRomanNumerals as numberToRoman, convertToRomanNumerals as numericToRoman, convertToRomanNumerals as toRoman, convertToRomanNumerals as toRomanNumeral, getAverage as average, getAverage as calculateAverage, getAverage, averageByField, averageByField as avgByField, banglaToDigit, factorial as calculateFactorial, factorial, factorial as getFactorial, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, calculatePercentage, capitalizeString, getOrdinal as cardinalToOrdinal, getOrdinal as convertNumberToOrdinal, getOrdinal as convertToOrdinal, getOrdinal, getOrdinal as getOrdinalNumber, getOrdinal as numberToOrdinal, numberToWordsOrdinal as cardinalWordsToOrdinal, numberToWordsOrdinal as convertNumberToWordsOrdinal, numberToWordsOrdinal, clampNumber, cloneObject, naturalSort as compareNaturally, naturalSort as compareSorter, naturalSort, naturalSort as naturalSortForString, computeTextDiff, convertArrayToString, convertArrayToString as joinArrayElements, formatCurrency as convertNumberToCurrency, formatCurrency, numberToWords as convertNumberToWords, numberToWords, convertObjectValues, romanToInteger as convertRomanToArabic, romanToInteger as convertRomanToInteger, romanToInteger as convertRomanToNumeric, romanToInteger as romanToArabic, romanToInteger, romanToInteger as romanToNumeric, convertStringCase, convertToDecimal, convertToDecimal as convertToFixed, wordsToNumber as convertWordToNumber, wordsToNumber as convertWordsToNumber, wordsToNumber as wordToNumber, wordsToNumber, countInstanceMethods, countInstanceMethods as getInstanceMethodsCount, countObjectFields, countStaticMethods, countStaticMethods as getStaticMethodsCount, countWords, countWords as countWordsInString, countWords as wordCount, createOptionsArray, generateQueryParams as createQueryParams, generateQueryParams as formatQueryParams, generateQueryParams, debounceAction, getDecimalPlaces as decimalPlaces, getDecimalPlaces, deepParsePrimitives, deepParsePrimitives as parsePrimitivesDeep, definePrototypeMethod, deleteFields, deleteFields as deleteObjectFields, deleteFields as omitFields, deleteFields as omitObjectFields, deleteFields as removeFields, deleteFields as removeObjectFields, digitToBangla, getDuplicates as extractDuplicates, getDuplicates as extractDuplicatesFromArray, getDuplicates, getDuplicates as getDuplicatesFromArray, extractEmails, extractObjectEntries as extractEntries, extractObjectEntries, extractObjectEntries as objectEntries, extractObjectKeys as extractKeys, extractObjectKeys, extractObjectKeysDeep as extractKeysDeep, extractObjectKeysDeep, findMissingElements as extractMissingElements, findMissingElements, findMissingElements as getMissingElements, extractNewFields, extractNumbersFromString as extractNumbers, extractNumbersFromString, extractNumbersFromString as parseNumbersFromText, extractURLs, extractUpdatedAndNewFields, extractUpdatedFields, getFactors as factorsOf, getFactors as getDivisors, getFactors, fibonacciGenerator, fibonacciGenerator as generateFibonacci, filterArrayOfObjects, findPrimeNumbers, findPrimeNumbers as getPrimeNumbers, flattenArray, flattenObjectDotNotation, flattenObjectKeyValue, formatUnitWithPlural as formatNumberWithPluralUnit, formatUnitWithPlural, formatUnitWithPlural as formatWithPlural, generateAnagrams, generateRandomID, getCharacterDifferences, getClassDetails, getCountryByPhone, getFibonacciSeries as getFibonacci, getFibonacciSeries as getFibonacciNumbers, getFibonacciSeries, getFibonacciSeriesMemo, getFibonacciSeriesMemo as getMemoizedFibonacci, getFibonacciSeriesMemo as getMemoizedFibonacciSeries, getInstanceGetterNames, getInstanceMethodNames, getLastArrayElement, getLevenshteinDistance, getLevenshteinDistance as levenshteinDistance, getNthFibonacci, getNumbersInRange, parseQueryString as getQueryStringAsObject, parseQueryString, parseQueryString as queryStringToObject, getRandomFloat as getRandomDecimal, getRandomFloat, getRandomNumber as getRandomInt, getRandomNumber, getStaticGetterNames, getStaticMethodNames, sumNumbers as getSumOfNumbers, sumNumbers, sumNumbers as sumOfNumbers, groupAndAverageByField, groupAndAverageByField as groupAndAvgByField, groupAndSumByField, splitArrayByProperty as groupArrayByProperty, splitArrayByProperty, isDeepEqual, isInvalidOrEmptyArray, isPrime, isPrime as isPrimeNumber, parseQueryStringLiteral as literalQueryStringToObject, parseQueryStringLiteral, maskString, mergeAndFlattenObjects, mergeObjects, moveArrayElement, normalizeNumber, normalizeString, parseJSON, parseJSON as parseJsonDeep, parseJsonToObject, parseObjectValues, parseObjectValues as parseStringifiedObjectValues, pickFields, pickFields as pickObjectFields, pickObjectFieldsByCondition as pickFieldsByCondition, pickObjectFieldsByCondition, remapFields, remapFields as remapObjectFields, removeDuplicatesFromArray as removeDuplicates, removeDuplicatesFromArray, replaceAllInString, reverseNumber, reverseString, rotateArray, roundNumber, roundNumber as roundToDecimal, roundToNearest as roundNumberToNearestInterval, roundToNearest, roundToNearest as roundToNearestInterval, sanitizeData, shuffleArray, slugifyString, sortAnArray, splitArray, stableStringify, stripJsonEdgeGarbage, sumByField, sumDigits, sumFieldDifference, sumFieldDifference as totalDeltaByField, throttleAction, trimString, truncateString };
|
package/package.json
CHANGED