EditText CurrencyFormat without symbol Android



下面的代码产生一个stackoverflow错误。其思想是在用户键入金额时或之后对金额进行格式化。

500 -> 500.00

1000 -> 1000.00

29999.55-> 29999.55

. .... .

   edit_amount.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub
        }
        @Override
        public void afterTextChanged(Editable s) {

            if (edit_amount.getText().toString().length()>0){

                edit_amount.setText(
                        currencyFormat(edit_amount.getText().toString()));
            }else {}

        }
    });

  public String currencyFormat(String number){
        String credits="";
        try {
            //en, us
            if (TextUtils.isEmpty(MyApplication.pref.GetPreferences("AppCurrency"))){
                credits = NumberFormat.getCurrencyInstance(new Locale("fr", "FR")).format(Double.valueOf(number));
            }else {
                if (MyApplication.pref.GetPreferences("AppCurrency").equals("Euro")) {
                    credits = NumberFormat.getCurrencyInstance(new Locale("fr", "FR")).format(Double.valueOf(number));
                } else {
                    credits = NumberFormat.getCurrencyInstance(new Locale("en", "US")).format(Double.valueOf(number));
                }
            }
        }catch(Exception ex){
            credits = "mCredits";
        }

        return credits;
    }

你的代码不起作用,因为当你调用edit_amount.setText(...)时,afterTextChanged(Editable s)被触发,然后edit_amount.setText(...)被触发,等等。你需要改变你的逻辑来做你想做的,并避免堆栈溢出。

例如,您可以注销TextWatcher, setText,然后重新注册。

或者,您可以设置一个标志,以便您的TextWatcher知道何时您自己更改文本,然后指示TextWatcher忽略它。

为了避免递归调用afterTextChanged回调,您可以设置额外的检查。像这样的东西

@Override
public void afterTextChanged(Editable s) {
    if (et.getText().toString().length() > 0) {
        String src = et.getText().toString();
        String origin = currencyFormat(src);
        if(!src.equals(origin)) {
            et.setText(currencyFormat(et.getText().toString()));
        }
    }
}

试试下面的代码:

private String current = "";
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if(!s.toString().equals(current)){
       [your_edittext].removeTextChangedListener(this);
       String cleanString = s.toString().replaceAll("[$,.]", "");
       double parsed = Double.parseDouble(cleanString);
       String formatted = NumberFormat.getCurrencyInstance().format((parsed/100));
       current = formatted;
       [your_edittext].setText(formatted);
       [your_edittext].setSelection(formatted.length());
       [your_edittext].addTextChangedListener(this);
    }
}

相关内容

最新更新