0

我有一个设置的基本计算器,所以当按下相等按钮时,JTextField 以字符串形式保存,这就是问题所在,它是字符串形式,所以我不知道如何求解方程。我尝试过使用 JavaScript 引擎,但无法弄清楚。有什么帮助吗?

//actionListener
@Override
public void actionPerformed(ActionEvent e) {

    if(e.getSource().equals(oneButton)){
        input1 = 1;
        text.setText(text.getText()+input1);}
    else if (e.getSource().equals(twoButton)){
        input2 = 2;
        text.setText(text.getText()+input2);}
    else if(e.getSource().equals(threeButton)){
        input3 = 3; 
        text.setText(text.getText()+input3);}
    else if(e.getSource().equals(fourButton)){
        input4 = 4; 
        text.setText(text.getText()+input4);}
    else if(e.getSource().equals(fiveButton)){
        input5 = 5;
        text.setText(text.getText()+input5);}
    else if(e.getSource().equals(sixButton)){
        input6 = 6;
        text.setText(text.getText()+input6);}
    else if(e.getSource().equals(sevenButton)){
        input7 = 7;
        text.setText(text.getText()+input7);}
    else if(e.getSource().equals(eightButton)){
        input8 = 8;
        text.setText(text.getText()+input8);}
    else if(e.getSource().equals(nineButton)){
        input9 = 9;
        text.setText(text.getText()+input9);}
    else if(e.getSource().equals(zeroButton)){
        input0 = 0;
        text.setText(text.getText()+input0);}
    else if(e.getSource().equals(plusButton)){
        text.setText(text.getText()+" + ");}
    else if(e.getSource().equals(minusButton)){
        text.setText(text.getText()+" - ");}
    else if(e.getSource().equals(timesButton)){
        text.setText(text.getText()+" * ");}
    else if(e.getSource().equals(dividButton)){
        text.setText(text.getText()+" / ");}
    else if(e.getSource().equals(clrButton)){
        text.setText("");}
    else if(e.getSource().equals(enterButton)){
        eq = text.getText();
//trying the javascript     ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");

            try {
                text.setText((String) engine.eval(eq));
            } catch (ScriptException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

    }
4

3 回答 3

2

如果操作顺序很重要,您将不得不使用堆栈。如果你只是从左到右计算,你应该没问题。

正如@Ericson Willians 回答的那样,您可以通过以下方式将 String 转换为 int 或 double :

    String str = text.getText();
    Integer.parseInt(str);
    Double.parseDouble(str);

但是,您可能会在这里遇到麻烦,因为当您按下回车按钮时,您会得到放置在文本元素中的整个等式,也就是说,如果您按下回车并且您将等式存储为“2 + 3” ,您的 text.getText() 将为您提供“2 + 3”,并且您将无法使用以下内容而不给您错误。

    Integer.parseInt(text.getText()); //NumberFormatException For input string: "2 + 3"
    Double.parseDouble(text.getText()); //NumberFormatException for "2 + 3"

在将字符串转换为整数或双精度之前,您必须以特定方式分解字符串。分解字符串的一个好方法是使用类似的东西:

String st = text.getText();
//Example: String st = "2 + 3";
//remove white space
st = st.replaceAll("\\s","");
//might have to change to allow for negative numbers
String[] splitStrings = (st.split("((?<=[+-/*])|(?=[+-/*]))")); 
//Example: splitStrings is now -> ["2","+","3"]

这打破了操作之间的字符串。然后,您可以获得所需的元素并将它们解析为整数。例如:

int result;
int left = Integer.parseInt(splitStrings[0]);
String op = splitStrings[1];
int right = Integer.parseInt(splitStrings[2]);
if(op.equals("+")){
    result = left + right;
}
text.setText("" + result);

但是,由于等式可能很大,您可能应该创建一个执行类似操作的循环,并且您将需要一个 if 语句或一个 switch 语句来执行所有操作。

于 2013-06-25T21:52:08.177 回答
0

您可以编写一个使用 antlr 解析字符串的计算器:http ://www.antlr.org/

于 2013-06-25T20:23:12.767 回答
0

为什么不直接使用 Integer 和 Double 类的 parse 方法呢?

int integerNumber = Integer.parseInt(text.getText());
double doubleNumber = Double.parseDouble(text.getText());

如您所见,Integer 类中的方法 parseInt() 将字符串转换为 Integer,Double 也是如此。完成此操作后,您可以完美地使用您的字符串进行任何数学运算。

于 2013-06-25T20:31:20.677 回答