seriesForm의 가격 입력 input의 값을 1000단위로 ','가 찍히도록 포맷팅되는 기능을 구현했다
1000단위로 ,를 찍으려면 뒤에서부터 숫자를 3개씩 세면서 ,를 찍어야한다
onChange가 될 때마다 input값을 가져와서 조건에 맞게 조작한 후 리턴해준다
// SeriesForm.jsx
export const formatPrice = input => {
const formatedValue = input
.split('')
.reverse()
.map((str, index) => (index > 0 && index % 3 === 0 ? `${str},` : str))
.reverse()
.join('');
return formatedValue;
};
// SeriesForm.jsx
<PayInput
width="50%"
type="text"
value={formatPrice(values.price)}
name="price"
onChange={handleChange}
min={0}
disabled={edit}
/>
const handleChange = e => {
const { name, value } = e.target;
if (name === 'price') {
const filteredValue = value.replace(/[^0-9]/g, '').replace(/(^0+)/g, '');
setValues({ ...values, [name]: filteredValue });
return;
}
setValues({ ...values, [name]: value });
};
const changeNumberToText = value => {
switch (value) {
case '1':
return '일';
case '2':
return '이';
case '3':
return '삼';
case '4':
return '사';
case '5':
return '오';
case '6':
return '육';
case '7':
return '칠';
case '8':
return '팔';
case '9':
return '구';
default:
return '';
}
};
export const formatPriceToText = input => {
const formatedValue = input
.split('')
.reverse()
.map((str, index) => {
const formattedValue = changeNumberToText(str);
if (str === '0') {
return '';
}
switch (index % 4) {
case 1:
return `${formattedValue}십`;
case 2:
return `${formattedValue}백`;
case 3:
return `${formattedValue}천`;
case 0:
return index === 0 ? formattedValue : `${formattedValue}만`;
default:
return formattedValue;
}
})
.reverse()
.join('');
return formatedValue;
};
천 단위가 넘어 갔을 때 '만'이 안 붙는다
const addNumberUnit = (str, index) => {
const formattedValue = changeNumberToText(str);
if (str === '0') {
return '';
}
switch (index % 4) {
case 1:
return `${formattedValue}십`;
case 2:
return `${formattedValue}백`;
case 3:
return `${formattedValue}천`;
default:
return formattedValue;
}
};
export const formatPriceToText = value => {
const reversedValueArr = value.split('').reverse();
const thousandUnitValue = reversedValueArr
.slice(0, 4)
.map((str, index) => addNumberUnit(str, index))
.reverse()
.join('');
const tenThousandUnitValue =
value.length <= 4
? ''
: reversedValueArr
.slice(4)
.map((str, index) => addNumberUnit(str, index))
.reverse()
.join('')
.concat('만');
return tenThousandUnitValue + thousandUnitValue;
};