-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: formatNumberWithCommas 로직 수정으로 인터페이스 개선
- Loading branch information
Showing
3 changed files
with
23 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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('숫자로 이뤄진 문자열에도 ","를 추가해 반환해야 합니다.', () => { | ||
|
@@ -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
57
packages/utils/src/formatter/formatNumberWithCommas/index.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, ','); | ||
} |