2015-09-24 1 views
0

Код ниже создает ошибку stackoverflow. Идея состоит в том, чтобы отформатировать сумму, когда или после того, как пользователь наберет сумму.EditText CurrencyFormat без символа Android

500 -> 500,00

1000 -> 1 000,00

29999.55-> 29 999,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; 
    } 

ответ

0

Ваш код не потому что, когда вы вызываете edit_amount.setText(...), тогда запускается afterTextChanged(Editable s), а затем edit_amount.setText(...) запускается d так далее. Вам нужно изменить свою логику, чтобы сделать то, что вы хотите, и избежать переполнения стека.

Например, вы можете отменить регистрацию TextWatcher, setText, а затем зарегистрировать его еще раз.

В качестве альтернативы вы можете установить флаг, чтобы ваш TextWatcher знал, когда вы сами меняете текст, а затем инструктируете TextWatcher игнорировать его.

0

Чтобы избежать рекурсивного вызова обратного вызова afterTextChanged, вы можете настроить дополнительный chek. Smth как этот

@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())); 
     } 
    } 
} 
0

Try ниже код: java.lang.NumberFormatException сообщение

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); 
    } 
} 
+0

ошибка: Invalid двойной: "000 € 8" – Dimitri

+0

Причина заключается в том, что "" не является допустимым в два раза. Вам нужно протестировать строку до или уловить такие исключения. – KishuDroid

+0

Если этот ответ поможет вам или решит вашу проблему, пожалуйста, примите его как ответ и поддержите его. – KishuDroid