From 55d87e3a733923b21afc24ca3e6ef67793d726c0 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Fri, 20 Sep 2024 22:47:56 -0400 Subject: [PATCH] feat: add formatNumber (#39) --- src/js/format-number.js | 22 ++++++++++++++++++++++ tests/format-number.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/js/format-number.js create mode 100644 tests/format-number.test.js diff --git a/src/js/format-number.js b/src/js/format-number.js new file mode 100644 index 0000000..3bea97d --- /dev/null +++ b/src/js/format-number.js @@ -0,0 +1,22 @@ +/** + * Format a number to a human-readable string + * @param num The number to format + * @param decimalPlaces The number of decimal places to include in the formatted string + * @returns {string} + */ +function formatNumber(num, decimalPlaces = 1) { + if (num >= 1000000) { + return (num / 1000000).toFixed(decimalPlaces) + 'M'; + } else if (num >= 1000) { + return (num / 1000).toFixed(decimalPlaces) + 'k'; + } else { + return num.toFixed(decimalPlaces); + } +} + +// Expose to the global scope +if (typeof window !== 'undefined') { + window.formatNumber = formatNumber; +} + +module.exports = formatNumber; diff --git a/tests/format-number.test.js b/tests/format-number.test.js new file mode 100644 index 0000000..4e2104e --- /dev/null +++ b/tests/format-number.test.js @@ -0,0 +1,26 @@ +import { + describe, + expect, + test, +} from '@jest/globals'; + +const formatNumber = require('../src/js/format-number'); + +describe('formatNumber function', () => { + test.each([ + [1234567, 1, '1.2M'], // 1.2 million + [1234567, 2, '1.23M'], // 1.23 million + [1234, 1, '1.2k'], // 1.2 thousand + [1234, 2, '1.23k'], // 1.23 thousand + [123, 1, '123.0'], // 123 with 1 decimal place + [123, 2, '123.00'], // 123 with 2 decimal places + ])('formats %i with %i decimal places as %s', (num, decimalPlaces, expected) => { + expect(formatNumber(num, decimalPlaces)).toBe(expected); + }); + + test('defaults to 1 decimal place if not provided', () => { + expect(formatNumber(1234567)).toBe('1.2M'); + expect(formatNumber(1234)).toBe('1.2k'); + expect(formatNumber(123)).toBe('123.0'); + }); +});