2

JavaScriptで基本的な計算を実行できる簡単なオンライン計算機を作成しようとしています。

数字と演算子がフォームフィールドに保存されるように、インターフェイスを作成することができました。

私ができるようにしたいのは、フォームフィールド内の値を、フォームフィールドの合計を計算する関数に渡すことです。

フォームフィールドには、"10 + 10"角かっこを使用した単純な方程式からより複雑な方程式まで、あらゆるものを含めることができます。+使用中-の演算子は、、、、、*および/です。

フォームフィールドのテキスト(文字列)を、演算子を認識して値に対して操作の機能を実行できるJavaScript関数に渡すことはできますか?

テキストフィールドで可能な値は次のとおりです。

120/4+130/5

次に、関数は答えとして56を返す必要があります。私は次のような値を知っているときにJavaScriptでこれを行いました:

function WorkThisOut(a,b,c,d) {

var total = a/b+c/d;

alert (total);
}

WorkThisOut(120,4,130,5);

私がやりたいのは"120/4+130/5"、関数に完全な値を渡し、数値と演算子を抽出して合計を作成できるようにすることです。

誰かがこれをどのように行うことができるか、あるいはそれが可能であるかどうかについて何かアイデアを持っていますか?これは、括弧内に値を渡す必要がある場合、より複雑になる可能性があります"(120/4)+(130/5)"

4

5 に答える 5

7

私はこれのために爆破されるかもしれません。しかし、ここではとにかく行きます。

これについて私が考えることができる3つの解決策があります:

  1. 独自のパーサー、レクサーを実装し、コードを解析します。それは簡単なことではありませんが、素晴らしい学習体験になるかもしれません。
  2. evalスクリプトがサイトに悪意を持ってアクセスできないように、そのためだけのサブドメインの下で実行します
  3. 入力をサニタイズして、12345678790+-/*().

 eval(input.replace(/[^0-9\(\)\+\-\*\/\.]/g, ""));

この解決策を回避するためのトリックを吹き飛ばしてください

于 2012-06-01T22:10:32.690 に答える
5

math.jsライブラリに含まれている式パーサーを使用できます。

http://mathjs.org

使用例:

math.eval('1.2 / (2.3 + 0.7)');   // 0.4
math.eval('5.08 cm in inch');     // 2 inch
math.eval('sin(45 deg) ^ 2');     // 0.5
math.eval('9 / 3 + 2i');          // 3 + 2i
math.eval('det([-1, 2; 3, 1])');  // -7
于 2013-04-28T12:53:13.377 に答える
2

識別子を許可しない場合、evalで多くのダメージを与えることはかなり困難です。

function reval(string){
    var answer='';
    if(/^[\d()\/*.+-]+$/.test(str)){
        try{
            answer= eval(str);
        }
        catch(er){
            answer= er.name+', '+er.message;
        }

    }
    return answer;
}
于 2012-06-01T22:05:58.350 に答える
1

どうevalですか?

calcテキストフィールドのIDと見なします。それから

$('#calc').change(function(e){                
    alert(eval($(this).val()));
})

ただし、処理する前に入力を検証することを忘れないでください。

于 2012-06-01T22:02:36.727 に答える
1

これはかなり古いトピックですが、同様の問題を抱えている新しい訪問者のために:string-mathパッケージは、上記のサンプルのように[String]方程式を計算します120/4+130/5。また、括弧も認識します。

于 2018-02-01T20:38:55.120 に答える