2016-09-09 10 views
1

テキストフィールドに数式を入力し、それをDBにStringとして保存するオプションをユーザーに与える必要があります。それは十分に簡単ですが、私はそれを取得し、計算に使用する必要があります。MS SQL Server DBに数式を格納してJAVAを使って解釈する方法は?

たとえば、DBに文字列形式で保存する必要がある従業員の給与計算式を他の人が指定できるようにします。

GROSS_PAY = BASIC_SALARY - NO_PAY + TOTAL_OT + ALLOWANCE_TOTAL 

GROSS_PAY、BASIC_SALARYなどの用語がわかっており、評価する内容を確認することができます。実際の問題は、そのような用語(GROSS_PAYなど)と他の数学的演算子の組み合わせ(+、 - 、×だけでなく、根本的な一言を示す根)を予測することができないということです。パワー等)。では、この式をDBから取得した文字列形式でどのように解釈するのでしょうか。そのため、式の構成に基づいて計算を行うことができます。

+0

@a_horse_with_no_name私はそれを試みたが、うまくいかなかった。 Thnx – Miy

+0

正規表現(またはsth。else(すべてを抽出する解析メソッドを作成するメソッドを書く)を試して、すべての演算子を選び出して、それを使ってやることができます。"文字列をオペレータに変換"する可能性がないためです。 –

答えて

1

Evaluating a math expression given in string form JavaのJavaScriptエンジンがあり、演算子で文字列機能を実行できます。

これが役に立ちます。

+0

エクスプレッションエバリュエーターを取得するために、間接化する必要はほとんどありません。あなたはJavaでそのような式の評価を直接行うことができます.. –

+0

ちょっとIra、確かにそれはまたjavaで可能です。私はMarkusとして、正規表現を念頭に置いています。あなたの提案は何でどのようになりますか? – kism3t

+0

正規表現は解析に際して常に間違った答えです。ネストされたかっこは処理できません。私が提供した答えを見てください。 –

1

実際には、エクスプレッションエバリュエーターを構築するのはかなり簡単です。

my SO answer on how to write a parserを参照してください。正確に必要な式演算子とオペランドの範囲に対応するBNFを使用すると、このプロセスに従って、正確にそれらの式用のパーサをJavaで直接構築できます。

答えは、解析する際に式を評価する方法について説明する2番目の回答にリンクしています。

したがって、データベースから文字列を読み取り、式で発生する可能性のある変数の集合を収集し、文字列を解析/評価します。変数をあらかじめ知っていなければ(必要であるように思えます)、初めて変数名を取得するために、式を2回解析することができます。

0

式を効果的にラップし、システムを使用してコンパイルするクラスの文字列表現を作成できます。JavaCompiler —ファイルシステムが必要です。 javaScriptまたはgroovyを使用して文字列を直接評価することができます。どちらの場合も、変数をバインドする方法を理解する必要があります。一つのアプローチは見つけると結合関数の呼び出しで知られている変数名を置き換えるためにregexを使用することです:

getValue("BASIC_SALARY") - getValue("NO_PAY") + getValue("TOTAL_OT") + getValue("ALLOWANCE_TOTAL") 

または

getBASIC_SALARY() - getNO_PAY() + getTOTAL_OT() + getALLOWANCE_TOTAL() 

このアプローチは、しかし、注入型のすべての種類にあなたを公開しますセキュリティバグ。したがって、セキュリティが必要な場合は適切ではありません。このアプローチは、エラー診断に関しても弱いです。彼らの表現が壊れている理由をユーザーにどのように伝えますか?

代わりに、ANTLRのようなものを使用して、javaでパーサを生成します。あまりにも難しくないし、多くの例があります。このアプローチは、セキュリティ(ユーザーが解析しないために悪質なコードを挿入することはできません)と診断の両方を提供します。

関連する問題