首先,先来看看在eclipse中,怎么通过用 js 中的 eval() 函数 实现字符串表达式的运算 ?
package test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class T {
static ScriptEngine j = new ScriptEngineManager().getEngineByName("js");
/**
* @param args
* @throws ScriptException
*/
public static void main(String[] args) {
try {
System.out.println(j.eval("1+2*3-8"));//表达式应输出-1
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
接下来,在 Andriod studio 中实现简易计算器功能:
一 : 在 build.gradle 中的 dependencies 添加依赖:
(不导入的话无法使用 javax.script 的那几个包)
implementation 'io.apisense:rhino-android:1.1.1'
二 : activity_main.xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android ="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="6"
android:columnCount="4"
tools:context=".MainActivity">
<TextView
android:id="@+id/input"
android:layout_width="352dp"
android:layout_height="58dp"
android:layout_row="0"
android:layout_columnSpan="4"
android:text="0"
android:textSize="20dp" />
<Button
android:id="@+id/buttoneliminate"
android:layout_width="348dp"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="0"
android:layout_columnSpan="4"
android:text="清除"
android:textSize="24sp" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="0"
android:textSize="18sp"
android:text="1"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="1"
android:textSize="18sp"
android:text="2"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="2"
android:textSize="18sp"
android:text="3"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttonadd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="3"
android:textSize="18sp"
android:text="+"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="3"
android:layout_column="0"
android:textSize="18sp"
android:text="4"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="3"
android:layout_column="1"
android:textSize="18sp"
android:text="5"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="3"
android:layout_column="2"
android:textSize="18sp"
android:text="6"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttonsub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="3"
android:layout_column="3"
android:textSize="18sp"
android:text="-"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="4"
android:layout_column="0"
android:textSize="18sp"
android:text="7"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="4"
android:layout_column="1"
android:textSize="18sp"
android:text="8"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="4"
android:layout_column="2"
android:textSize="18sp"
android:text="9"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttonmul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="4"
android:layout_column="3"
android:textSize="18sp"
android:text="*"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttonpoint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="5"
android:layout_column="0"
android:textSize="18sp"
android:text="."
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="5"
android:layout_column="1"
android:textSize="18sp"
android:text="0"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttonequal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="5"
android:layout_column="2"
android:textSize="18sp"
android:text="="
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/buttondiv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="5"
android:layout_column="3"
android:textSize="18sp"
android:text="/"
tools:layout_editor_absoluteX="276dp"
tools:layout_editor_absoluteY="130dp" />
</GridLayout>
三 :MainActivity.java 代码
(这份java代码适合正常的运算,如果输入“1 - + 2 +”之类的非正常表达式可能会闪退,需要稍微修改代码)
package com.example.cal;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class MainActivity extends AppCompatActivity {
private Button btnlim,btn0,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btnp,btnadd,btnsub,btnmul,btndiv,btnequ;
private TextView in;
private String s="",result="";
ScriptEngine j = new ScriptEngineManager().getEngineByName("javascript");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
in=(TextView) findViewById(R.id.input);
btnlim = (Button) findViewById(R.id.buttoneliminate);
btn0 = (Button) findViewById(R.id.button0);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn3 = (Button) findViewById(R.id.button3);
btn4 = (Button) findViewById(R.id.button4);
btn5 = (Button) findViewById(R.id.button5);
btn6 = (Button) findViewById(R.id.button6);
btn7 = (Button) findViewById(R.id.button7);
btn8 = (Button) findViewById(R.id.button8);
btn9 = (Button) findViewById(R.id.button9);
btnp = (Button) findViewById(R.id.buttonpoint);
btnadd = (Button) findViewById(R.id.buttonadd);
btnsub = (Button) findViewById(R.id.buttonsub);
btnmul = (Button) findViewById(R.id.buttonmul);
btndiv = (Button) findViewById(R.id.buttondiv);
btnequ = (Button) findViewById(R.id.buttonequal);
btnlim.setOnClickListener(new mclick());
btn0.setOnClickListener(new mclick());
btn1.setOnClickListener(new mclick());
btn2.setOnClickListener(new mclick());
btn3.setOnClickListener(new mclick());
btn4.setOnClickListener(new mclick());
btn5.setOnClickListener(new mclick());
btn6.setOnClickListener(new mclick());
btn7.setOnClickListener(new mclick());
btn8.setOnClickListener(new mclick());
btn9.setOnClickListener(new mclick());
btnp.setOnClickListener(new mclick());
btnadd.setOnClickListener(new mclick());
btnsub.setOnClickListener(new mclick());
btnmul.setOnClickListener(new mclick());
btndiv.setOnClickListener(new mclick());
btnequ.setOnClickListener(new mclick());
}
class mclick implements OnClickListener {
public void onClick(View v)
{
if(v==btnlim){
//清除
s = "";
}
else if(v==btnequ){
//按 = 求值
try {
String t=s;
result=j.eval(t).toString(); //求出当前表达式的值并转换成string类型,存入ss中
s += '='; //加入= 和 结果 (没求表达式前,不能加=,否则为表达式无法计算)
s += result;
} catch (ScriptException e) {
e.printStackTrace();
}
}
else {
//其他按钮,直接加入表达式即可
if(v==btn0) s+='0';
if(v==btn1) s+='1';
if(v==btn2) s+='2';
if(v==btn3) s+='3';
if(v==btn4) s+='4';
if(v==btn5) s+='5';
if(v==btn6) s+='6';
if(v==btn7) s+='7';
if(v==btn8) s+='8';
if(v==btn9) s+='9';
if(v==btnp) s+='.';
if(v==btnadd) s+='+';
if(v==btnsub) s+='-';
if(v==btnmul) s+='*';
if(v==btndiv) s+='/';
}
in.setText(s);
if(v==btnequ) s=result; //展示完结果后,把result的值赋给s,方便继续运算
}
}
}
运行结果: