Skip to content

Commit

Permalink
fix: formatNumberWithCommas 로직 수정으로 인터페이스 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
ssi02014 committed Jan 8, 2025
1 parent 929bfb0 commit 0e0a1d7
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 77 deletions.
19 changes: 5 additions & 14 deletions docs/docs/utils/formatter/formatNumberWithCommas.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# formatNumberWithCommas

`문자열` 또는 `숫자`를 입력하면 숫자를 천 단위로 `(,)comma`를 추가한 문자열을 반환하는 함수입니다.
`숫자로 이루어진 문자열` 또는 `숫자`를 입력하면 천 단위로 `(,)comma`를 추가한 문자열을 반환하는 함수입니다.

<br />

Expand All @@ -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
Expand All @@ -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'
```
formatNumberWithCommas('123456.12345'); // '123,456.12345'
```
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { describe, it, expect } from 'vitest';
import { formatNumberWithCommas } from '.';

const ERROR_MESSAGE = 'value는 숫자 혹은 숫자로 이뤄진 문자열이여야 합니다.';

describe('formatNumberWithCommas', () => {
it('숫자에 천 단위마다 ","를 추가하고 문자열로 반환해야 합니다.', () => {
expect(formatNumberWithCommas(200)).toBe('200');
expect(formatNumberWithCommas(3000)).toBe('3,000');
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('숫자로 이뤄진 문자열에도 ","를 추가해 반환해야 합니다.', () => {
Expand All @@ -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('[email protected]')).toThrow();
expect(() => formatNumberWithCommas('123d')).toThrow(ERROR_MESSAGE);
expect(() => formatNumberWithCommas('1.2.3')).toThrow(ERROR_MESSAGE);
expect(() => formatNumberWithCommas('d1.2.3')).toThrow(ERROR_MESSAGE);
});
});
57 changes: 11 additions & 46 deletions packages/utils/src/formatter/formatNumberWithCommas/index.ts
Original file line number Diff line number Diff line change
@@ -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(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ',');
}

0 comments on commit 0e0a1d7

Please sign in to comment.