0

現在、ncalc ライブラリを使用していくつかの評価を行い、結果を取得しています。

現在、価格が「1,234.01」の形式の場合、式の評価に失敗するという問題が見つかりました。

私が使用した現在の回避策はを削除することでしたが、たとえば,を削除せずに通貨を評価する方法があるかどうか疑問に思っていました:,

decimal price = 0;
if (!decimal.TryParse(iPrice.Text, out price))
{
    MessageBox.Show("Price is not formatted correctly...");
    return;
}

decimal currency = 0;
if (!decimal.TryParse(iCurrency.Text, out currency))
{
    MessageBox.Show("Currency is not formatted correctly...");
    return;
}

string formula = iFormula.Text.Replace("Price", price.ToString("n2")).Replace("Currency", currency.ToString("n2"));
Expression exp = new Expression(formula);
exp.Evaluate();

価格が原因で評価が失敗し,、それを削除すると問題なく機能します。

式のサンプル:

(((Price+12,9)+((Price+12,9)*0,05)+(((Price+12,9)+((Price+12,9)*0,05))*0,029)+0,45)*Currency)

要求されたスタックトレース:

NCalc.EvaluationException was unhandled
  Message=mismatched input ',' expecting ')' at line 1:4
mismatched input ',' expecting ')' at line 1:20
mismatched input ',' expecting ')' at line 1:43
mismatched input ',' expecting ')' at line 1:59
missing EOF at ')' at line 1:77
  Source=NCalc
  StackTrace:
       at NCalc.Expression.Evaluate()
4

2 に答える 2

2

あなたの質問はまだはっきりしていませんが、置き換えるときに使用している形式を変更するだけでこれを修正できると思いますこれを変える:

string formula = iFormula.Text.Replace("Price", price.ToString("n2")) 
                              .Replace("Currency", currency.ToString("n2"));

これに:

string formula = iFormula.Text.Replace("Price", price.ToString("f2")) 
                              .Replace("Currency", currency.ToString("f2"));

これは、「数値」形式ではなく「固定小数点」形式を使用します。グループ化されません。グループ化は数値自体の一部ではないことに注意してください。数値のフォーマット方法の一部です。

ちなみに、インバリアント カルチャを明示的に指定したくなることもあります。

余談ですが、私は NCalc を自分で使用したことはありませんが、式の数値をtextとして指定することを本当に強制している場合、それはかなり貧弱に聞こえます。私は、これをすべてなくすはずの何らかのパラメータ化 (たとえば、ほとんどの SQL プロバイダのように) を期待しています。

于 2012-07-02T06:21:23.687 に答える
0

いいえ、10 進数リテラルに区切り文字を含めることはできません。コンパイラは、次のように同じ型で複数の変数を宣言することと混同します。

decimal price = 1m, tax = 234m; 

ただし、文字列の場合は、次のように解析できます。

decimal price = Decimal.Parse("1,234.0", CultureInfo.InvariantCulture); 

編集:上記の私の答えは、質問の最初のバージョンのコードサンプルに向けられました。質問が編集されたので:

Decimal.ToString(string format, IFormatProvider provider)メソッドのオーバーロードを使用して、10 進数値の文字列表現を制御できます。これにより、標準またはカスタムのフォーマット文字列を指定できます。あなたの場合、ドットを使用して 2 桁の 10 進数を区切る必要があり、グループ区切り文字 (カンマなし) は必要ないようです。したがって、次のように言えます。

price.ToString("F2", CultureInfo.InvariantCulture) // ex. result: "1234.56"

CultureInfo.InvariantCulture現在のカルチャに関係なくドット区切りが必要な場合は重要です。これを指定しない場合、出力は現在のカルチャに応じて "1234,56" になる可能性があります (たとえば、de-DE や fr-FR などのヨーロッパのカルチャの場合)。

于 2012-07-02T05:53:43.893 に答える