안드로이드 EditText Number Format 숫자 3자리 마다 콤마 나타내기

프로그래밍/Android 관련2018. 2. 22. 16:25

안녕하세요. 개발자 드리머즈입니다.

이 포스트에서 안드로이드 EditText에 숫자를 입력하면 3자리마다 콤마가 자동으로 찍히게 하는 방법을 알아보겠습니다.


백문이 불여일견이라고 위의 gif를 보시면 뭘 만들고자 하는지 바로 감이 올 것입니다. 다행히 스택오버플로우에 좋은 예제가 있어 이를 참고했습니다.

(링크 : https://stackoverflow.com/questions/26533347/format-currency-string-using-edittext-in-android)


NumberTextWatcher.java

이 예제의 핵심이 되는 코드입니다. 제가 아래의 포스트에서 TextView에 콤마를 표시하기 위해 DecimalFormat("###,###")를 사용했었는데 EditText에서도 사용되네요.


[안드로이드/자바] 숫자 콤마 표시하기


소스가 조금 복잡하긴 하지만 저도 자세히 보지는 않았습니다. EditText의 Callback을 통해 콤마를 추가하는 과정을 하나보다 라고 생각하고 있네요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
import java.text.DecimalFormat;
import java.text.ParseException;
 
class NumberTextWatcher implements TextWatcher {
 
    private DecimalFormat df;
    private DecimalFormat dfnd;
    private boolean hasFractionalPart;
 
    private EditText et;
 
    public NumberTextWatcher(EditText et)
    {
        df = new DecimalFormat("#,###.##");
        df.setDecimalSeparatorAlwaysShown(true);
        dfnd = new DecimalFormat("#,###");
        this.et = et;
        hasFractionalPart = false;
    }
 
    @SuppressWarnings("unused")
    private static final String TAG = "NumberTextWatcher";
 
    public void afterTextChanged(Editable s)
    {
        et.removeTextChangedListener(this);
 
        try {
            int inilen, endlen;
            inilen = et.getText().length();
 
            String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "");
            Number n = df.parse(v);
            int cp = et.getSelectionStart();
            if (hasFractionalPart) {
                et.setText(df.format(n));
            } else {
                et.setText(dfnd.format(n));
            }
            endlen = et.getText().length();
            int sel = (cp + (endlen - inilen));
            if (sel > && sel <= et.getText().length()) {
                et.setSelection(sel);
            } else {
                // place cursor at the end?
                et.setSelection(et.getText().length() - 1);
            }
        } catch (NumberFormatException nfe) {
            // do nothing?
        } catch (ParseException e) {
            // do nothing?
        }
 
        et.addTextChangedListener(this);
    }
 
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {
    }
 
    public void onTextChanged(CharSequence s, int start, int before, int count)
    {
        if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
        {
            hasFractionalPart = true;
        } else {
            hasFractionalPart = false;
        }
    }
}
cs


activity_main.xml

콤마 테스트할 EditText만 하나 있습니다. 13번째 라인에 소수점 입력이 안되도록 number inputType으로 설정되어 있습니다. 만약 소수점 입력을 원하시면 inputType을 numberDecimal로 변경하시면 됩니다.
그리고 EditText의 최대 입력 글자수를 25로 제한을 뒀습니다. 이 숫자를 넘어가면 오버플로우? 문제가 생기는 것 같더라구요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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.dreamaz.edittextformattest.MainActivity">
 
    <EditText
        android:id="@+id/et"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:gravity="end"
        android:maxLength="25"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
</android.support.constraint.ConstraintLayout>
 
cs


MainActivity.java

11번째 라인의 코드를 통해 TextWatcher를 등록합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends AppCompatActivity {
 
    EditText et;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        et = findViewById(R.id.et);
        et.addTextChangedListener(new NumberTextWatcher(et));
    }
}
 
cs

위의 세 소스파일을 참고해서 본인의 코드에 적용시키면 문제없이 동작할 것입니다~


작성자

Posted by 드리머즈

관련 글

댓글 영역