如何转换完整的字符串10 + 20-25;像是从EditText获得的文本一样,要加倍?

时间:2018-12-21 06:36:29

标签: android string android-edittext double

我如何转换包含"10 + 20 - 25"之类的数学运算的字符串,我从EditText获取字符串,我想转换以获取运算结果。

1 个答案:

答案 0 :(得分:0)

这是我的代码来解决您的问题:

public class ExecuteHandler {
    private static Character[] OPERATORS = { '/', '*', '+', '-' };

    private static final String REGEXOPERATORS = "[/+,-,/*,//,-]";
    private static final String REGEXDIGITS = "(\\d+)";

    private ArrayList<Character> operators = new ArrayList<>();
    private ArrayList<Integer> digits = new ArrayList<>();

    public String execute(String math) {
        StringBuilder result = new StringBuilder();
        try {
            getDigits(math);
            getOperators(math);
            getNextOperator(operators);

            for (Integer digit : digits) {
                result.append(String.valueOf(digit));
            }
        } catch (ArithmeticException | IndexOutOfBoundsException e) {
            return "ERROR";
        }

        return result.toString().isEmpty() ? "ERROR" : result.toString();
    }

    public void clear() {
        operators.clear();
        digits.clear();
    }

    private void getNextOperator(ArrayList<Character> operators) {
        for (Character op : OPERATORS) {
            for (int i = 0; i < operators.size(); i++) {

                if (operators.get(i) == '/') {
                    operators.remove(i);
                    digits.set(i, (digits.get(i) / digits.get(i + 1)));
                    digits.remove(i + 1);
                    i -= 1;
                }
            }

            for (int i = 0; i < operators.size(); i++) {

                if (operators.get(i) == '*') {
                    operators.remove(i);
                    digits.set(i, (digits.get(i) * digits.get(i + 1)));
                    digits.remove(i + 1);
                    i -= 1;
                }
            }

            for (int i = 0; i < operators.size(); i++) {

                if (operators.get(i) == '+') {
                    operators.remove(i);
                    digits.set(i, (digits.get(i) + digits.get(i + 1)));
                    digits.remove(i + 1);
                    i -= 1;
                }
            }
            for (int i = 0; i < operators.size(); i++) {
                if (operators.get(i) == '-') {
                    operators.remove(i);
                    digits.set(i, (digits.get(i) - digits.get(i + 1)));
                    digits.remove(i + 1);
                    i -= 1;
                }
            }
        }
    }

    private void getDigits(String math) {
        Pattern r = Pattern.compile(REGEXDIGITS);
        Matcher m = r.matcher(math);
        while (m.find()) {
            int t = Integer.parseInt(math.substring(m.start(), m.end()));
            digits.add(t);
        }
    }

    private void getOperators(String math) {
        Pattern r = Pattern.compile(REGEXOPERATORS);
        Matcher m = r.matcher(math);
        while (m.find()) {
            operators.add(math.charAt(m.start()));
        }
    }
}

输入为execute的调用方法string"10 + 20 - 25:"一样,结果将是一个字符串值(如果成功)或ERROR(如果出现语法错误)。