2012-07-02 50 views
0

我目前使用ncalc庫來做幾次評估,並從中得出結果。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() 
+0

聽起來像文化問題,或者ncalc不支持默認不變文化。 – leppie

+0

leppie good call我會檢查不變... – Guapo

+0

鑑於堆棧跟蹤。這肯定是一個文化問題。 – leppie

回答

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,但是如果它真的迫使你在表達式中指定數值作爲文本,那聽起來很差。我期望某種參數化(例如,按照大多數SQL提供者),這應該使所有這些都消失。

+0

是的,它使用'f2'來解決它...現在我明白你想告訴我的另一個答案的評論;) – Guapo

0

不,你不能在你的小數文字分隔符。編譯器將宣佈多個變量與同類型喜歡混淆:

decimal price = 1m, tax = 234m; 

如果它是一個字符串,但是,你可以分析它想:

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

編輯:我的回答以上是指向問題第一版中的代碼示例。現在該問題已被編輯:

您可以使用Decimal.ToString(string format, IFormatProvider provider)方法重載控制十進制值的字符串表示形式。這允許您指定standardcustom格式字符串。在你的情況下,這聽起來像你需要有兩個十進制數字分隔點,沒有組分隔符(沒有逗號)。所以,你可以說:

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

CultureInfo.InvariantCulture是很重要的,如果你需要一個圓點分隔不管當前的文化。如果您沒有指定,那麼根據當前的文化,輸出可能是「1234,56」(例如歐洲文化如de-DE或fr-FR)。

+0

價格和貨幣是由用戶在文本框中設置的,我使用decimal.TryParse轉換爲十進制,上述小數值僅僅是樣本來揭露我的問題。 – Guapo

+0

@leppie您是否看到以下聲明:「小數點價格= 1,123.01m;'? –

+1

@Guapo您在Q中沒有提到這一點。您當前的代碼示例試圖使用包含逗號的文字來指定小數。而你說「它在我刪除逗號時起作用」。我的回答是針對你的問題_as is_。如果你編輯你的問題,我會編輯我的答案。 –