반응형
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에 따로 추가해서 사용하시면 됩니다.
궁금하신 사항은 댓글로 남겨주시면 확인하는데로 답변 남기겠습니다.
반응형
'안드로이드 > 팁' 카테고리의 다른 글
[AOS] 카메라로 촬영한 이미지 경로 가져오기 ( targetSdk 30 대응 ) (0) | 2021.12.13 |
---|---|
[AOS] adb pair로 빌드 간편하게 하기 (0) | 2021.11.12 |
[And] 백그라운드 위치 권한 사용하기 ( Android9,10 대응 ) (0) | 2021.04.29 |
[And]출시 예약으로 배포 시점 조정하기! (0) | 2021.03.24 |
[Android] Recyclerview 속 Edittext 데이터 유실 해결하기 (3) | 2021.03.04 |