13

入力をお金の形式のみでフォーマットする編集テキストエントリをどのように作成しますか?ユーザーが5を入力すると、入力は「$ 0.05」のようになり、3を入力すると、入力は「$ 0.53」のようになり、最後に6を入力すると、入力は「$5.36」のようになります。

4

7 に答える 7

8

ninjasense の完全なソリューションは基本的に機能しますが、いくつかの問題があります。

  1. 「onTextChanged」ハンドラーでフィールドのデータが変更されるたびに、カーソル位置がフィールドのインデックス 0 にリセットされます。これは、金額を入力するときに発生するのが少し面倒です。
  2. 通貨の値をフォーマットするためにフロートを使用しますが、これは逆効果になる可能性があります。

最初の問題についてはまだ解決策がありません.2番目の問題については、次のようなコードが機能します:

    @Override
    public void onTextChanged(CharSequence s, int start,
            int before, int count) {
        if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
        {
            String userInput= ""+s.toString().replaceAll("[^\\d]", "");
            StringBuilder cashAmountBuilder = new StringBuilder(userInput);

            while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
                cashAmountBuilder.deleteCharAt(0);
            }
            while (cashAmountBuilder.length() < 3) {
                cashAmountBuilder.insert(0, '0');
            }
            cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
            cashAmountBuilder.insert(0, '$');

            cashAmountEdit.setText(cashAmountBuilder.toString());
        }

    }
于 2011-03-04T09:23:49.587 に答える
3

Zds からの構築。

カーソルをフィールドの最後に配置したままにするには、これを使用します。

cashAmountEdit.setTextKeepState(cashAmountBuilder.toString());
Selection.setSelection(cashAmountEdit.getText(), cashAmountBuilder.toString().length());
于 2011-03-23T22:13:12.510 に答える
1

これが私の完全な解決策です:

                tvValue.setRawInputType(Configuration.KEYBOARD_12KEY);

            tvValue.addTextChangedListener(new TextWatcher(){


                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub

                }

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

                }

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

                    // here i converted to string
                    if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
                    {
                        String userInput= ""+s.toString().replaceAll("[^\\d]", "");
                        Float in=Float.parseFloat(userInput);
                        float percen = in/100;
                        tvValue.setText("$"+percen);
                    }

                }

            });
于 2011-02-21T21:20:36.263 に答える
1

TextWatcher は少し扱いに​​くいことがわかりました。代わりに、キー リスナーを設定できます。

setKeyListener(new CalculatorKeyListener());
// Must be called after setKeyListener(), otherwise is overridden
setRawInputType(Configuration.KEYBOARD_12KEY);

次に、NumberKeyListener を拡張する KeyListener を作成します。

class CalculatorKeyListener extends NumberKeyListener {
    @Override
    public int getInputType() {
        return InputType.TYPE_CLASS_NUMBER;
    }

    @Override
    public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
        if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
            digitPressed(keyCode - KeyEvent.KEYCODE_0);
        } else if (keyCode == KeyEvent.KEYCODE_DEL) {                                         
            deletePressed();
        }
        return true;
    }

    @Override
    protected char[] getAcceptedChars() {
        return new char[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    }
}

次に、文字を正しく表示する必要がありますが、それは難しくありません。セントを追跡し、10 で除算または乗算し、NumberFormat を使用して正しい書式設定を取得します。

于 2010-12-30T16:49:26.290 に答える
1

TextWatcher を使用して、そのようなことを行うことができます。

TextWatcher の拡張: http://d.android.com/reference/android/text/TextWatcher.html

public class MyTextWatcher implements TextWatcher {

    public void afterTextChanged(Editable arg0) { 

    }

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

    }

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

    }

}

次に、それを editText に追加します

myEditText.addTextChangedListener(new MyTextWatcher());
于 2010-06-10T11:26:38.000 に答える