我正在学习使用 android studio 制作一个应用程序,所以我正在制作一个简单的计算器,但我 运行 遇到了一个问题,无法获得正确答案
I am learning to use android studio to make an app, so I am making a simple calculator, but I have run into a problem getting the correct answer
我已经尝试了几种方法来让它工作,但是它返回的答案是非常错误的。例如,它 returns 1+2 = 99.0 和 1*2 = 2450.0 等等。我认为所有的按钮都有效,主要方法也很好。下面是我在单击等号按钮时将 TextView 中的 CharSequence 转换为字符串的方式。
Button btnEquals = (Button)findViewById(R.id.btnEquals);
btnEquals.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String problem = textDisplay.getText().toString();
double intermediate = evalProblem(problem);
String answer = "" + intermediate;
textDisplay.setText(answer);
}
});
这就是我调用的方法来计算方程。
public static Double evalProblem(String s) {
double output;
double mult = 0.0;
double add = 0.0;
double sub = 0.0;
double div = 0.0;
if (s.contains("*")) {
int x = s.indexOf("*");
mult = s.charAt(x-1)*s.charAt(x+1);
}
if (s.contains("/")) {
int x = s.indexOf("/");
div = s.charAt(x - 1) / s.charAt(x + 1);
}
if (s.contains("+")) {
int x = s.indexOf(("+"));
add = s.charAt(x-1) + s.charAt(x+1);
}
if (s.contains("-")) {
int x = s.indexOf("-");
sub = s.charAt(x - 1) - s.charAt(x + 1);
}
output = mult + add + sub + div;
return output;
}
.charAt()
returns 一个字符,不是整数。例如,“8*8”有 3 个字符——“8”、“*”和“8”。当您对字符执行数学运算时,它使用字符的 ASCII 值,例如:'A'
的 ASCII 值为 65。'0'
的值为 48。
因此,'1' + '2' = 49 + 50 = 99
你需要把'*'前面的String部分转成数字对吧? Java 有一个简单的解决方案:Double.parseDouble()
方法:
String text = "567";
int number = Double.parseDouble(text);
要解决您的特定问题,您应该试试这个:
int x = s.indexOf('*');
mult = Double.parseDouble(s.substring(0, x)) * Double.parseDouble(s.substring(x+1));
此解决方案的最佳部分是您可以使用多于一位的数字,因为代码会提取 s
中“*”前后的所有内容,并将它们转换为数字。
编辑: 正如 u/markspace 在下面的评论中提到的,您应该考虑使用 Java 中的内置解析库,如下所示: Algebra equation parser for java
编辑 2: 我建议使用 Integer.parseInt()
将字符串转换为数字,但正如 u/MartinZeitler 在下面的评论中指出的那样,使用 Double.parseDouble()
转换为双精度值会更好。
我已经尝试了几种方法来让它工作,但是它返回的答案是非常错误的。例如,它 returns 1+2 = 99.0 和 1*2 = 2450.0 等等。我认为所有的按钮都有效,主要方法也很好。下面是我在单击等号按钮时将 TextView 中的 CharSequence 转换为字符串的方式。
Button btnEquals = (Button)findViewById(R.id.btnEquals);
btnEquals.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String problem = textDisplay.getText().toString();
double intermediate = evalProblem(problem);
String answer = "" + intermediate;
textDisplay.setText(answer);
}
});
这就是我调用的方法来计算方程。
public static Double evalProblem(String s) {
double output;
double mult = 0.0;
double add = 0.0;
double sub = 0.0;
double div = 0.0;
if (s.contains("*")) {
int x = s.indexOf("*");
mult = s.charAt(x-1)*s.charAt(x+1);
}
if (s.contains("/")) {
int x = s.indexOf("/");
div = s.charAt(x - 1) / s.charAt(x + 1);
}
if (s.contains("+")) {
int x = s.indexOf(("+"));
add = s.charAt(x-1) + s.charAt(x+1);
}
if (s.contains("-")) {
int x = s.indexOf("-");
sub = s.charAt(x - 1) - s.charAt(x + 1);
}
output = mult + add + sub + div;
return output;
}
.charAt()
returns 一个字符,不是整数。例如,“8*8”有 3 个字符——“8”、“*”和“8”。当您对字符执行数学运算时,它使用字符的 ASCII 值,例如:'A'
的 ASCII 值为 65。'0'
的值为 48。
因此,'1' + '2' = 49 + 50 = 99
你需要把'*'前面的String部分转成数字对吧? Java 有一个简单的解决方案:Double.parseDouble()
方法:
String text = "567";
int number = Double.parseDouble(text);
要解决您的特定问题,您应该试试这个:
int x = s.indexOf('*');
mult = Double.parseDouble(s.substring(0, x)) * Double.parseDouble(s.substring(x+1));
此解决方案的最佳部分是您可以使用多于一位的数字,因为代码会提取 s
中“*”前后的所有内容,并将它们转换为数字。
编辑: 正如 u/markspace 在下面的评论中提到的,您应该考虑使用 Java 中的内置解析库,如下所示: Algebra equation parser for java
编辑 2: 我建议使用 Integer.parseInt()
将字符串转换为数字,但正如 u/MartinZeitler 在下面的评论中指出的那样,使用 Double.parseDouble()
转换为双精度值会更好。