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の回答として、次の方法で文字列をintまたはdoubleに変換します。

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

ただし、Enter ボタンを押すと、テキスト要素に配置した方程式全体が取得されるため、ここで問題が発生する可能性があります。 、あなたの text.getText() は「2 + 3」を返し、エラーを出さずに次を使用することはできません。

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

文字列を整数または double に変換する前に、特定の方法で文字列を分割する必要があります。文字列を分割する良い方法は、次のようなものを使用することです。

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 に答える