[안드로이드] EditText 화폐 단위 표시 (세자리 콤마)


사용자에게 화폐를 입력 받아 표시해줄 경우가 종종 있습니다.

이럴 때 입력 받은 숫자를 원화 단위 (1,000,000 과 같이 ) 로 바로 바꿔주는 방법입니다.


1. Result


2. Step by Step

2-1 Layout 구성

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.charlie.wontest.MainActivity">
    <EditText
        android:id="@+id/wonEt"
        android:hint="금액을 입력해주세요."
        android:paddingLeft="8dp"
        android:textSize="18sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:layout_centerInParent="true"
        android:inputType="number"
        android:gravity="end"
        />
</RelativeLayout>
  • Layout 은 최대한 간단하게 구성해봤습니다. inputType 은 숫자만 입력 받게 설정해 주었고, 금액은 오른쪽에서부터 작성되도록 gravity 는 end 로 설정하였습니다.


2-2 화폐 단위 표시하기

  • 화폐 단위 표시를 위해 DecimalFormatTextWatcher 를 사용합니다.

    private DecimalFormat decimalFormat = new DecimalFormat("#,###");
    private EditText wonEt;
    private String result="";
    
  • 먼저 멤버 변수로 EditText와 DecimalFormat 를 선언해줍니다. 여기서 new DecimalFormat("#,###"); 이 부분이 원화 단위로 글자를 변경시켜주는 부분입니다. 소수점이나 다른 단위 표시가 필요하신 분들은 저 부분을 변경해주시면 됩니다.

    TextWatcher watcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
    }
    
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if(!TextUtils.isEmpty(charSequence.toString()) && !charSequence.toString().equals(result)){
            result = decimalFormat.format(Double.parseDouble(charSequence.toString().replaceAll(",","")));
            wonEt.setText(result);
            wonEt.setSelection(result.length());
        }
    }
    
    @Override
    public void afterTextChanged(Editable editable) {
    
    }
    };
    
  • EditText 의 글자 변경을 감지해주는 TextWatcher 입니다. onTextChanged 메소드에서 앞서 설정한 포맷으로 문자를 변경해줍니다.

  • if 문 안에 !TextUtils.isEmpty(charSequence.toString()) 이 부분은 EditText 가 비어있지 않을 때만 실행한다는 구문입니다.

  • 다음 조건인 !charSequence.toString().equals(result) 부분은 TextWatcher 는 계속해서 EditText 를 검사하게 되는데 그 때마다 메소드를 반복 실행합니다. 아직 변경된 부분이 없는데 반복적으로 포맷 변경을 하고 setText를 하는 동작은 불필요 하기 때문에 이 전의 결과 값과 동일하면 실행시키지 않는 구문입니다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    wonEt = (EditText) findViewById(R.id.wonEt);
    wonEt.addTextChangedListener(watcher);
    }
    


  • 마지막으로 EditTextView 에 리스너를 설정해주면 끝입니다.