2012-07-02 21 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_。如果你编辑你的问题,我会编辑我的答案。 –