69

コンバーターアプリケーションを作成しています。EditText を設定して、ユーザーが変換する数値を入力するときに、千、百万、十億などの 3 桁ずつ増加すると、リアルタイムで千の区切り文字 ( ),が数値に自動的に追加されるようにします。
4 桁以下になると数値は正常に戻ります。
何か助けはありますか?

4

15 に答える 15

56

最後に問題を解決しました

とはいえ、答えが遅すぎます。適切な結果を得るためにタスクを達成するために多くのことを調査しましたが、できませんでした。それで、私たちが検索していた問題を最終的に解決し、検索にかかる時間を節約するためにこの回答をGoogle検索者に提供しました.

以下のコードの特徴

  1. EditTextテキストの変更に合わせて桁区切り記号を挿入します。

  2. 0.最初にピリオド (.) を押すと自動的に追加されます。

  3. 0開始時の入力を無視します。

次の名前のクラスをコピーするだけです

TextWatcher実装する NumberTextWatcherForThousand

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.StringTokenizer;

/**
 * Created by skb on 12/14/2015.
 */
public class NumberTextWatcherForThousand implements TextWatcher {

    EditText editText;


    public NumberTextWatcherForThousand(EditText editText) {
        this.editText = editText;


    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        try
        {
            editText.removeTextChangedListener(this);
            String value = editText.getText().toString();


            if (value != null && !value.equals(""))
            {

                if(value.startsWith(".")){
                    editText.setText("0.");
                }
                if(value.startsWith("0") && !value.startsWith("0.")){
                    editText.setText("");

                }


                String str = editText.getText().toString().replaceAll(",", "");
                if (!value.equals(""))
                editText.setText(getDecimalFormattedString(str));
                editText.setSelection(editText.getText().toString().length());
            }
            editText.addTextChangedListener(this);
            return;
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            editText.addTextChangedListener(this);
        }

    }

    public static String getDecimalFormattedString(String value)
    {
        StringTokenizer lst = new StringTokenizer(value, ".");
        String str1 = value;
        String str2 = "";
        if (lst.countTokens() > 1)
        {
            str1 = lst.nextToken();
            str2 = lst.nextToken();
        }
        String str3 = "";
        int i = 0;
        int j = -1 + str1.length();
        if (str1.charAt( -1 + str1.length()) == '.')
        {
            j--;
            str3 = ".";
        }
        for (int k = j;; k--)
        {
            if (k < 0)
            {
                if (str2.length() > 0)
                    str3 = str3 + "." + str2;
                return str3;
            }
            if (i == 3)
            {
                str3 = "," + str3;
                i = 0;
            }
            str3 = str1.charAt(k) + str3;
            i++;
        }

    }

    public static String trimCommaOfString(String string) {
//        String returnString;
        if(string.contains(",")){
            return string.replace(",","");}
        else {
            return string;
        }

    }
}

このクラスを次のように使用しEditTextます

editText.addTextChangedListener(new NumberTextWatcherForThousand(editText));

入力をプレーンな Double Text として取得するには

trimCommaOfStringこのように同じクラスのメソッドを使用します

NumberTextWatcherForThousand.trimCommaOfString(editText.getText().toString())

ギット

于 2015-12-14T11:04:41.290 に答える
52

String.format()で使用できますTextWatcherフォーマット指定子のコンマはそのトリックを行います。

これは、浮動小数点入力では機能しません。また、TextWatcher で無限ループを設定しないように注意してください。

public void afterTextChanged(Editable view) {
    String s = null;
    try {
        // The comma in the format specifier does the trick
        s = String.format("%,d", Long.parseLong(view.toString()));
    } catch (NumberFormatException e) {
    }
    // Set s back to the view after temporarily removing the text change listener
}
于 2012-09-09T11:53:28.097 に答える
9

このサンプル アプリは、数値の書式設定を明確に分解します。

上記のリンクを要約するには、次のロジックを使用TextWatcherしてafterTextChanged()メソッド形式のビューで and を使用します。EditText

@Override
public void afterTextChanged(Editable s) {
    editText.removeTextChangedListener(this);

    try {
        String originalString = s.toString();

        Long longval;
        if (originalString.contains(",")) {
            originalString = originalString.replaceAll(",", "");
        }
        longval = Long.parseLong(originalString);

        DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
        formatter.applyPattern("#,###,###,###");
        String formattedString = formatter.format(longval);

        //setting text after format to EditText
        editText.setText(formattedString);
        editText.setSelection(editText.getText().length());
    } catch (NumberFormatException nfe) {
        nfe.printStackTrace();
    }

    editText.addTextChangedListener(this);
}
于 2016-08-06T08:39:31.140 に答える
1

私は同じ問題を抱えていたので、解決策を見つけることにしました

以下の私の機能を見つけてください。人々が解決策を見つけるのに役立つことを願っています

securityDeposit.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                if (s.toString().trim().length() > 0) {
                    int rentValue = Integer.parseInt(s.toString()
                            .replaceAll(",", ""));
                    StringBuffer rentVal = new StringBuffer();
                    if (rentValue > 10000000) {
                        s.clear();
                        s.append("10,000,000");
                    } else {

                        if (s.length() == 4) {
                            char x[] = s.toString().toCharArray();

                            char y[] = new char[x.length + 1];
                            for (int z = 0; z < y.length; z++) {

                                if (z == 1) {
                                    y[1] = ',';

                                } else {
                                    if (z == 0)
                                        y[z] = x[z];
                                    else {
                                        y[z] = x[z - 1];
                                    }
                                }

                            }

                            for (int z = 0; z < y.length; z++) {
                                rentVal = rentVal.append(y[z]);
                            }

                            s.clear();
                            s.append(rentVal);

                        }

                    }
                }

            }
        });
于 2013-08-16T12:08:34.073 に答える