Front End/Javascript

금액 입력 시 자동 콤마 ( 천단위 ) 입력 - toLocaleString()

YJ_SW 2022. 7. 31. 16:32
728x90

toLocaleString() 사용하여 금액 입력 시 자동 콤마 ( 천단위 ) 입력하기

사용시 주의사항

1.  <input/> type은 "text"여야 함

2. toLocaleString()은 number타입에 적용가능

3. number로 변환하기 전에 , 를 제거하고 변환해야 함

오류 나는 코드

const [money, setMoney] = useState<string>('');

<input type="text" value ={money} onChange={e=>setMoney(parseInt(e.target.value).toLocaleString())}/>

onChange에 바로 string을 number타입으로 변환하고 toLocaleString()을 적용해주었다.

이 경우에 1000이 넘어가게 입력을 하면 1,000으로 변환되기 때문에 paseInt('1,000') 값은 1 이되고 1을 toLocaleString() 하면 1이다.

1000이상 입력 시 비정상적인 값을 리턴하는 오류가 발생한다.

1000입력 후 0을 더 입력하면 1로 변환된다.

백스페이스로 입력을 지우면 NaN이 되는 오류도 존재한다.

정상 동작 코드

const [money,setMoney] = useState<string>('');

const setCommaMoney = (value:string) => {
    
    let removeComma: string = value.replace(/[^0-9.]/g, '').replaceAll(",", "");
    // 숫자가 아닌 모든 문자 삭제 후 콤마(,)삭제
    setMoney(removeComma && parseInt(removeComma).toLocaleString())
    // removeComman 값이 있을 때만 변환 ( 안해주면 NaN 반환 )
}
    
<input type="text" value ={money} onChange={e=>setCommaMoney(e.target.value)}/>

setCommanMoney라고 함수를 따로 빼내어 콤마를 보여주는 함수를 작성하였다.

받은 입력에서 정규식을 통해 /[^0-9.]/g (숫자가 아닌 문자) 를 ''로 변환하고 ,를 ''로 변환하는 작업을 해준 후

변환한 값을 number타입으로 변환 후 toLocalString()을 적용해준다.

이 때 removeComma 값이 있는지 없는지 체크를 안하면 parseInt()가 NaN을 반환하기 때문에 removeComma&&로 값이 있을 때만 parseInt()를 적용해주자.

 

 

728x90