Применить денежную маску двойного значения - PullRequest
0 голосов
/ 04 октября 2019

У меня проблемы с применением денежной маски, результат суммы неверен, и если я ввожу другое значение в другое поле, приложение закрывается, в основном я хочу вычислить значения 4 полей, но я могу толькорассчитать значения полей 1 и 2, или 3 и 4 и т. д. (https://i.ibb.co/6tfSZHs/Screenshot-20191003-213827-teste-Double.jpg)

public class MainActivity extends AppCompatActivity {

    EditText edtOne, edtTwo, edtThree, edtFour;
    TextView tvResult;

    DecimalFormat currency = new DecimalFormat("$###,###.##");


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Locale mLocale = new Locale("pt", "BR");


        edtOne = findViewById(R.id.v1);
        edtTwo = findViewById(R.id.v2);
        edtThree = findViewById(R.id.v3);
        edtFour = findViewById(R.id.v4);

        tvResult = findViewById(R.id.resultado);

        edtOne.addTextChangedListener(new MoneyTextWatcher(edtOne, mLocale));
        edtOne.addTextChangedListener(new MoneyTextWatcher(edtOne, mLocale));
        edtTwo.addTextChangedListener(new MoneyTextWatcher(edtTwo, mLocale));
        edtThree.addTextChangedListener(new MoneyTextWatcher(edtThree, mLocale));
        edtFour.addTextChangedListener(new MoneyTextWatcher(edtFour, mLocale));


    }


    public class MoneyTextWatcher implements TextWatcher {
        private final WeakReference<EditText> editTextWeakReference;
        private final Locale locale;


        public MoneyTextWatcher(EditText editText, Locale locale) {
            this.editTextWeakReference = new WeakReference<EditText>(editText);
            this.locale = locale != null ? locale : Locale.getDefault();
        }

        public MoneyTextWatcher(EditText editText) {
            this.editTextWeakReference = new WeakReference<EditText>(editText);
            this.locale = Locale.getDefault();
        }

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

        }

        @Override
        public void onTextChanged(CharSequence s, int i, int i1, int i2) {

            if (!TextUtils.isEmpty(edtOne.getText().toString().trim())
                    || !TextUtils.isEmpty(edtTwo.getText().toString().trim())
                    || !TextUtils.isEmpty(edtThree.getText().toString().trim())
                    || !TextUtils.isEmpty(edtFour.getText().toString().trim())
            ) {


                Double firtValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtOne.getText().toString().trim()) ? 0 : (edtOne.getText().toString().trim())));
                Double secondValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtTwo.getText().toString().trim()) ? 0 : (edtTwo.getText().toString().trim())));
                Double thirdValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtThree.getText().toString().trim()) ? 0 : edtThree.getText().toString().trim()));
                Double forthValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtFour.getText().toString().trim()) ? 0 : (edtFour.getText().toString().trim())));


                double answer = firtValue + secondValue + thirdValue + forthValue;

                Log.e("RESULT", String.valueOf(answer));
                tvResult.setText(String.format("Total: $" + "%,.2f", (answer)));
            } else {
                tvResult.setText("");
            }
        }


        @Override
        public void afterTextChanged(Editable editable) {


            EditText editText = editTextWeakReference.get();
            if (editText == null) return;
            editText.removeTextChangedListener(this);

            BigDecimal parsed = parseToBigDecimal(editable.toString(), locale);
            String formatted = NumberFormat.getCurrencyInstance(locale).format(parsed);

            editText.setText(formatted);
            editText.setSelection(formatted.length());
            editText.addTextChangedListener(this);
        }

        public BigDecimal parseToBigDecimal(String value, Locale locale) {
            String replaceable = String.format("[%s,.\\s]", NumberFormat.getCurrencyInstance(locale).getCurrency().getSymbol());

            String cleanString = value.replaceAll(replaceable, "");

            return new BigDecimal(cleanString).setScale(
                    2, BigDecimal.ROUND_FLOOR).divide(new BigDecimal(100), BigDecimal.ROUND_FLOOR
            );
        }
    }
}

Я бы хотел, чтобы конечный результат был точно суммой полей.

...