9876543210
을 입력받으면 98억 7,654만 3,210원
을 리턴하는 함수를 만들어 보자
기본적으로 원화는 만 단위로 쪼개어진다. 원화 단위(만, 억)가 삽입되는 기준점이 바로 4자리수이기 때문에 4자리씩 쪼개어 이중배열을 만든다.
돈은 뒷자리수부터 세기 때문이다. 앞자리수를 기준으로 삼는다면 전체 돈의 사이즈를 가늠하기가 어렵기 때문에 배열을 뒤집는다.
문자열로 변환한 numberToStr
를 numberToStr
의 length에서 4를 뺀 숫자가 0이 될 때까지 4만큼의 간격으로 반복문을 돌려 한 바퀴 돌 때마다 i 만큼 잘린 숫자를 빈 배열에 삽입
예) 987654321의 경우 [3, 2, 1, 0], [7, 6, 5, 4] 순으로 들어가고 [9, 8]은 spliceArray
남아있음
이후 네자리를 충족하지 못한 나머지 배열(spliceArray
)을 추가
const numToNuArray = num => {
const numberToStr = num + '';
let nuArray = [];
const spliceArray = [...numberToStr];
for (let i = numberToStr.length - 4; i > 0; i -= 4) {
nuArray.push(spliceArray.splice(i));
}
nuArray.push(spliceArray);
return nuArray;
};
주어진 숫자가 1000000일 때 100만으로 표기하기 위한 나머지 0 네 자리 또는 주어진 숫자가 1000001일 때 100만 1원으로 표기하듯 1 앞에 있는 0 세 자리를 뜻한다.
배열 전체가 0일 때 그 배열을 아예 날릴 수도 있지만 그렇게 되면 중간에 0이 들어갔을 때를 구현할 수 없다. 따라서 다음 두 가지 경우에 해당된다.
이 두 가지 조건에 따라 빈 문자열을 삽입한다.
이 조건에 따르면 배열 전체가 0인 경우와 앞자리가 비어있고 현재 인덱스의 값이 0인 경우 두 가지를 모두 정리할 수 있다.
여기에서 제외되는 케이스는 두 가지다.
1. 현재 인덱스 값이 0이라고 하더라도 바로 앞자리가 빈 문자열이 아닌 경우(다른 숫자인 경우)
2. 현재 인덱스 - 1의 인덱스가 빈 문자열이라고 해도 현재 인덱스 값이 0이 아닌 경우
const isZeroControl = koreanArray => {
koreanArray.map(zeroControl =>
zeroControl.map(
(zero, idx) =>
(zeroControl[idx] = (idx === 0 || zeroControl[idx - 1] === '') && zero === '0' ? '' : zero),
),
);
};
천 단위에 콤마를 찍을 때 이미 삭제되어야 할 0이 삭제된 후이므로 무조건 콤마를 찍으면 안 된다. 0이 삭제되어 123이라는 숫자만 남아있는 배열이 있을 경우 ,123 이라는 형태로 리턴될 것이기 때문이다. 때문에 콤마를 찍을 때 다음과 같은 조건에 따라야 한다.
const isInsetComma = koreanArray => {
koreanArray.map(insertComma =>
insertComma.map((num, idx) =>
insertComma.length === 4 && insertComma[idx - 1] !== '' && idx === 1
? insertComma.splice(idx, 0, ',')
: num,
),
);
};
const monetaryUnit = ['', '만', '억'];
const isInsertUnit = (koreanArray, monetaryUnit) =>
koreanArray.map((unitArray, idx) => unitArray.push(monetaryUnit[idx]));
const reArrange = koreanArray => {
return koreanArray
.reverse()
.flat()
.filter(blank => blank !== '');
};
여기까지 구현하면 리턴되는 모습은 ['1','억','2',',','3','4','5','천' ...] 형태로 되어있다. 마지막으로 배열을 풀기 전에 억, 만, 단위에 따라 빈 칸을 삽입해줘야 한다.
const isInsertBlank = (monetaryUnit, koreanArray) => {
monetaryUnit.map(unit =>
koreanArray.map(
(korean, idx) =>
(koreanArray[idx] =
unit === korean && koreanArray[idx + 1] !== undefined ? `${korean} ` : `${korean}`),
),
);
};
이렇게 만든 함수를 모두 호출하는 함수 하나를 만들면 다음과 같은 모습이 된다.