2015-09-24 21 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等等。你需要改變你的邏輯來做你想做的事情,並避免堆棧溢出。

例如,您可以取消註冊TextWatchersetText然後重新註冊。

或者,您可以設置一個標誌,以便TextWatcher知道您何時自己更改文本,然後指示TextWatcher忽略它。

0

爲了避免afterTextChanged回調的遞歸調用,您可以設置額外的chek。水木清華這樣

@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

試試下面的代碼:

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

錯誤信息java.lang.NumberFormatException:無效的雙: 「000€8」 – Dimitri

+0

的原因是,認爲 「」 是不是有效的兩倍。您需要先測試字符串或者發現異常 – KishuDroid

+0

如果此答案可以幫助您或解決您的問題,那麼請接受它作爲答案並加註。 – KishuDroid