android - 如何转换完整的字符串 10 + 20 - 25;像文本一样,从 EditText 获得,加倍?
问题描述
我如何转换包含数学算术运算的"10 + 20 - 25"
字符串,我从 EditText 获取字符串,我想转换得到操作的结果。
解决方案
这是我的代码来解决您的问题:
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
(如果有任何语法错误)。
推荐阅读
- listview - Flutter - ListView.builder:初始滚动位置
- javascript - 我试图在谁赢谁输的答案弹出之前延迟(石头剪刀布游戏)
- ruby-on-rails - Rails 嵌套路由未按预期工作
- r - 闪亮的应用程序在所有浏览器上关闭,但资源管理器
- kubernetes - Calico:Kubernetes pod 使用集群 IP 无法互相 ping
- c++ - How to move cursor to end of text output after cin.clear() and cin.ignore()?
- node.js - 猫鼬 findByIdAndUpdate
- bash - awk 变量在 bash 中打印为选项
- json - 将 JSON-Patch 转换为 MarkLogic JSON 补丁规范?
- php - 关联数组更改键值