【问题标题】:EditText CurrencyFormat without symbol Android无符号 Android 的 EditText CurrencyFormat
【发布时间】:2015-09-24 10:58:19
【问题描述】:

下面的代码会产生 stackoverflow 错误。这个想法是在用户输入金额时或之后格式化金额。

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;
    }

【问题讨论】:

    标签: java android android-edittext decimalformat


    【解决方案1】:

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

    例如,您可以取消注册TextWatchersetText,然后重新注册。

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

    【讨论】:

      【解决方案2】:

      为了避免 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()));
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        试试下面的代码:

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

        【讨论】:

        • 错误信息 java.lang.NumberFormatException: Invalid double: "000 €8"
        • 原因是,"" 不是有效的双精度。您需要在之前测试字符串或捕获此类异常
        • 如果此答案对您有帮助或解决了您的问题,请接受它作为答案并点赞。
        • 用这个替换 ("\\P{L}", " ")
        • 反正什么也没发生,谢谢,我会找到替代方案
        猜你喜欢
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多