toss / es-hangul

A modern JavaScript library for handling Hangul characters.
https://es-hangul.slash.page/
MIT License
1.24k stars 83 forks source link

[Feature]: 숫자를 순우리말 수사로 표현하는 함수 #169

Closed BO-LIKE-CHICKEN closed 1 month ago

BO-LIKE-CHICKEN commented 2 months ago

Description

안녕하세요 아래와 같은 함수가 es-hangul의 목적성에 맞고, 필요하다면 구현해 보고싶습니다.

숫자를 받아서 순우리말 수사 바꿔주거나 수 관형사를 붙여주는 함수 convertToNumeral을 제안드립니다.

Possible Solution

/**
 * 숫자를 순 우리말 수사로 변환합니다.
 * @param num 변환하고자 하는 숫자
 * @param space 단위 사이에 공백 필요 여부
 *  @param classifier 단위(명, 개 등) 사용 여부
 * @returns 순 우리말 수사로 변환된 텍스트
 */
function convertToNumeral(num: number, space: ?: booelean, classifier?:  string,  ): string {
    return "순 우리말 수사 혹은 관형사"; 
}
test('숫자를 순 우리말 수사로 바꿔야 한다.', () => {
    expect(convertToNumeral(1)).toEqual('하나');
});

test('숫자를 순 우리말 수 관형사로 바꿔야 한다.', () => {
    expect(convertToNumeral(12, true, " 번 째")).toEqual('열 두 번째');
});

test('1부터 99까지 숫자가 아니라면 에러를 발생시켜야 한다.', () => {
    expect(() => convertToNumeral(0)).toThrowError();
    expect(() => convertToNumeral(100)).toThrowError();
});

test('단위 사이에 공백이 있어야 한다.', () => {
    expect(convertToNumeral(99, true)).toEqual('아흔 아홉');
});

함수 시그니쳐는 조금 변경이 생길 수 있을 것 같아요

etc.

예상 사용 사례

const age = 20;
console.log(`${convertToNumeral(age, true, '살')}의 고객님에게 추천드리는 상품이 있어요.`);
// 출력: 스무살의 고객님에게 추천드리는 상품이 있어요
const visitCount = 92;
const restCount = 100 - visitCount;
console.log(`${convertToNumeral(visitCount, true, ' 번째')} 방문하신 고객님 감사합니다! ${convertToNumeral(restCount, true, ' 번')}만` 더 방문하면 큰 상품을 드려요);
// 출력: 아흔 두 번째 방문하신 고객님 감사합니다! 여덟 번만 더 방문하면 큰 상품을 드려요
okinawaa commented 1 month ago

classifier 단위(명, 개.. ) 이것에 따라 수사가 변하는 경우가 있나요?

예를들어, A라는 숫자를 넣었을때 단위가 명 이라면, B명 단위가 개 라면 , C개 처럼 B !== C 인 경우가 있을까요?

BO-LIKE-CHICKEN commented 1 month ago

classifier 단위(명, 개.. ) 이것에 따라 수사가 변하는 경우가 있나요?

예를들어, A라는 숫자를 넣었을때 단위가 명 이라면, B명 단위가 개 라면 , C개 처럼 B !== C 인 경우가 있을까요?

조금 더 조사해 봐야겠지만 그런 경우는 없을 것 같아요!

function convertToNumeral(num: number, space?: boolean, classifier?: boolean): string {
    return "순 우리말 수사 혹은 관형사"; 
}

위와 같은 형태로 시그니처를 작성하고 suffix는 함수를 사용하는 곳에서 붙여줘도 괜찮겠네요 🙂 작성하다보니 그렇게 되면 space도 필요없어지고 함수가 더 깔끔해지겠어요.

function convertToNumeral(num: number, classifier?: boolean): string {
    return "순 우리말 수사 혹은 관형사"; 
}

다만, 이런 경우는 헷갈릴 법해서 예외처리가 필요함을 테스트 코드를 통해 사용자에게 알려줘야 겠네요.

test('숫자를 순 우리말 수사로 바꿔야 한다.', () => {
    expect(convertToNumeral(1)).toEqual('하나');
});

test('숫자를 순 우리말 수 관형사로 바꿔야 한다.', () => {
    expect(convertToNumeral(1, true)).toEqual('한');
});

// 서수사에 대한 엣지케이스
test('서수사로 바뀌지 않는다', () => {
    expect(convertToNumeral(1, true)).not.toEqual('첫');
});