diff --git a/docs/docs/utils/formatter/formatNumberWithCommas.md b/docs/docs/utils/formatter/formatNumberWithCommas.md index da44d8ee3..9ae5e3c3d 100644 --- a/docs/docs/utils/formatter/formatNumberWithCommas.md +++ b/docs/docs/utils/formatter/formatNumberWithCommas.md @@ -1,6 +1,6 @@ # formatNumberWithCommas -`문자열` 또는 `숫자`를 입력하면 숫자를 천 단위로 `(,)comma`를 추가한 문자열을 반환하는 함수입니다. +`숫자로 이루어진 문자열` 또는 `숫자`를 입력하면 천 단위로 `(,)comma`를 추가한 문자열을 반환하는 함수입니다.
@@ -9,16 +9,7 @@ ## Interface ```ts title="typescript" -interface FormatNumberWithCommasOptions { - maximumDecimalDigits?: Intl.NumberFormatOptions['maximumFractionDigits']; - minimumDecimalDigits?: Intl.NumberFormatOptions['minimumFractionDigits']; -} -``` -```ts title="typescript" -function formatNumberWithCommas( - value: number | string, - options?: FormatNumberWithCommasOptions -): string; +function formatNumberWithCommas(value: number | string): string ``` ## Usage @@ -28,10 +19,10 @@ import { formatNumberWithCommas } from '@modern-kit/utils'; formatNumberWithCommas(200); // '200' formatNumberWithCommas(3000); // '3,000' formatNumberWithCommas(-123123123); // '-123,123,123' -formatNumberWithCommas(123456.123); // '123,456.123' +formatNumberWithCommas(123456.12345); // '123,456.12345' formatNumberWithCommas('200'); // '200' formatNumberWithCommas('3000'); // '3,000' formatNumberWithCommas('-123123123'); // '-123,123,123' -formatNumberWithCommas('123456.123'); // '123,456.123' -``` \ No newline at end of file +formatNumberWithCommas('123456.12345'); // '123,456.12345' +``` diff --git a/packages/utils/src/formatter/formatNumberWithCommas/formatNumberWithCommas.spec.ts b/packages/utils/src/formatter/formatNumberWithCommas/formatNumberWithCommas.spec.ts index feab31143..6dcc95ec6 100644 --- a/packages/utils/src/formatter/formatNumberWithCommas/formatNumberWithCommas.spec.ts +++ b/packages/utils/src/formatter/formatNumberWithCommas/formatNumberWithCommas.spec.ts @@ -1,6 +1,8 @@ import { describe, it, expect } from 'vitest'; import { formatNumberWithCommas } from '.'; +const ERROR_MESSAGE = 'value는 숫자 혹은 숫자로 이뤄진 문자열이여야 합니다.'; + describe('formatNumberWithCommas', () => { it('숫자에 천 단위마다 ","를 추가하고 문자열로 반환해야 합니다.', () => { expect(formatNumberWithCommas(200)).toBe('200'); @@ -8,7 +10,7 @@ describe('formatNumberWithCommas', () => { expect(formatNumberWithCommas(50000)).toBe('50,000'); expect(formatNumberWithCommas(-50000)).toBe('-50,000'); expect(formatNumberWithCommas(123123123)).toBe('123,123,123'); - expect(formatNumberWithCommas(123456.123)).toBe('123,456.123'); + expect(formatNumberWithCommas(123456.12345)).toBe('123,456.12345'); }); it('숫자로 이뤄진 문자열에도 ","를 추가해 반환해야 합니다.', () => { @@ -17,24 +19,12 @@ describe('formatNumberWithCommas', () => { expect(formatNumberWithCommas('50000')).toBe('50,000'); expect(formatNumberWithCommas('-50000')).toBe('-50,000'); expect(formatNumberWithCommas('123123123')).toBe('123,123,123'); - expect(formatNumberWithCommas('123456.123')).toBe('123,456.123'); - }); - - it('옵션으로 소수점 최대/최소 자리를 설정할 수 있어야 합니다.', () => { - expect( - formatNumberWithCommas(123.123456, { maximumDecimalDigits: 3 }) - ).toBe('123.123'); - expect( - formatNumberWithCommas(123.123456, { maximumDecimalDigits: 6 }) - ).toBe('123.123456'); - - expect( - formatNumberWithCommas(123.123456, { minimumDecimalDigits: 8 }) - ).toBe('123.12345600'); + expect(formatNumberWithCommas('123456.12345')).toBe('123,456.12345'); }); it('숫자로만 구성되어 있지 않은 문자열의 경우 에러를 던져야 합니다.', () => { - expect(() => formatNumberWithCommas('123d')).toThrow(); - expect(() => formatNumberWithCommas('1@2.3')).toThrow(); + expect(() => formatNumberWithCommas('123d')).toThrow(ERROR_MESSAGE); + expect(() => formatNumberWithCommas('1.2.3')).toThrow(ERROR_MESSAGE); + expect(() => formatNumberWithCommas('d1.2.3')).toThrow(ERROR_MESSAGE); }); }); diff --git a/packages/utils/src/formatter/formatNumberWithCommas/index.ts b/packages/utils/src/formatter/formatNumberWithCommas/index.ts index 5a60af1c3..bb3a0908b 100644 --- a/packages/utils/src/formatter/formatNumberWithCommas/index.ts +++ b/packages/utils/src/formatter/formatNumberWithCommas/index.ts @@ -1,61 +1,26 @@ import { isNumber } from '../../validator'; -interface FormatNumberWithCommasOptions { - maximumDecimalDigits?: Intl.NumberFormatOptions['maximumFractionDigits']; - minimumDecimalDigits?: Intl.NumberFormatOptions['minimumFractionDigits']; -} - -/** - * @description 최대 소수점 자릿수를 가져오는 함수입니다. - */ -const getMaximumDecimalDigits = ( - maximumDecimalDigits: number, - minimumDecimalDigits: number -) => { - return maximumDecimalDigits < minimumDecimalDigits - ? minimumDecimalDigits - : maximumDecimalDigits; -}; +const ERROR_MESSAGE = 'value는 숫자 혹은 숫자로 이뤄진 문자열이여야 합니다.'; /** - * @description 숫자에 천 단위 콤마를 추가하고, 소수점 자릿수를 지정하여 포맷팅하는 함수입니다. - * - * @param {number} value - 포맷팅할 숫자 값. - * @param {FormatNumberWithCommasOptions} options - 숫자 포맷팅 옵션. - * @param {number} [options.maximumDecimalDigits=3] - 표시할 소수점 이하 최대 자릿수. 기본값은 3입니다. - * @param {number} [options.minimumDecimalDigits=0] - 표시할 소수점 이하 최소 자릿수. 기본값은 0입니다. + * @description `숫자로 이루어진 문자열` 또는 `숫자`를 입력하면 천 단위로 `(,)comma`를 추가한 문자열을 반환하는 함수입니다. * + * @param {number | string} value - 포맷팅할 숫자 값. * @returns {string} 포맷팅된 숫자 문자열. * - * @example - * formatNumberWithCommas(5300); // 5,300 - * formatNumberWithCommas(1234567.891); - * // '1,234,567.891' - * - * formatNumberWithCommas("5300"); // 5,300 - * formatNumberWithCommas("1234567.891"); - * // '1,234,567.891' - * * @example - * formatNumberWithCommas(1234567.891, { maximumDigits: 2 }); - * // '1,234,567.89' + * formatNumberWithCommas(1234567.89112); + * // '1,234,567.89112' + * + * formatNumberWithCommas('1234567.89112'); + * // '1,234,567.89112' */ -export function formatNumberWithCommas( - value: number | string, - options: FormatNumberWithCommasOptions = {} -): string { - const { maximumDecimalDigits = 3, minimumDecimalDigits = 0 } = options; +export function formatNumberWithCommas(value: number | string): string { const valueToUse = isNumber(value) ? value : Number(value); if (isNaN(valueToUse)) { - throw new Error('value는 숫자 혹은 숫자로만 이뤄진 문자열이여야 합니다.'); + throw new Error(ERROR_MESSAGE); } - return valueToUse.toLocaleString('en-US', { - maximumFractionDigits: getMaximumDecimalDigits( - maximumDecimalDigits, - minimumDecimalDigits - ), - minimumFractionDigits: minimumDecimalDigits, - }); + return String(valueToUse).replace(/\B(?