본문 바로가기

안드로이드/팁

[Android] Edittext 천단위 콤마(,) 설정 - 소수점 포함

반응형

Edittext에 숫자를 입력할때 TextWatcher를 이용해 천단위 콤마를 찍을수 있습니다. 관련 예제는 많지만 소수점을 사용할 경우에대한 내용은 없어서 작성했습니다.

 

| 예제 소스 

선 예제소스 후 설명 

class PriceEditText(context: Context, attrs: AttributeSet?) : AppCompatEditText(context, attrs) {

    private var inputText = ""

    init {

        addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                var text = s?.toString() ?: ""
                if (!TextUtils.isEmpty(text) && !TextUtils.equals(
                        inputText,
                        text
                    )
                ) {

                    var strNumber: String   // 정수부
                    var strDecimal = ""     // 소수부 

                    if (text.contains(".")) {
                        strNumber = text.substring(0, text.indexOf("."))
                        strDecimal = text.substring(text.indexOf("."), text.length)
                    } else {
                        strNumber = text
                    }

                    strNumber = strNumber.replace(",", "")
                    var doubleText = strNumber.toDoubleOrNull() ?: 0.0
                    var decimalFormat = DecimalFormat("#,###")

                    inputText = decimalFormat.format(doubleText) + strDecimal
                    setText(inputText)
                    setSelection(inputText.length)

                }
            }

        })
    }
}

| 원리

TextWatcher로 editText의 텍스트가 변경될때마다를 체크해서 포맷팅 해주는 방식으로, 먼저 사용자가 입력한 텍스트에 소수점이 들어가는지 체크합니다. ( if( text.contains(".") 부분 ) 

소수점을 기준으로 정수부와 소수부로 나누고 정수부 부분만 'DecimalFormat'을 사용해 천단위로 점을 찍은 후 , 포맷이 변경된 정수부와 소수부를 합쳐서 editText 변경합니다.

변경시 'onTextChanged'가 또 호출되니깐 중복 호출로 무한 루프 도는 경우를 방지하기 위해 'inputText'란 변수를 생성해 일치 할 경우 별도 처리를 하지 않도록 했습니다. ( 제일 처음 비교하는 부분 ) 

 

 

저는 앱내 많은 부분에 쓰이기 때문에 커스텀뷰를 만들어서 xml에 바로 사용했습니다. 필요에 의해 저처럼 하시거나, edittext에 따로 추가해서 사용하시면 됩니다. 

 

궁금하신 사항은 댓글로 남겨주시면 확인하는데로 답변 남기겠습니다.

 

 

반응형