ncalc千位逗号格式化无法评估?

时间:2012-07-02 05:45:28

标签: c# .net-4.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)

按要求进行Stacktrace:

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()

2 个答案:

答案 0 :(得分: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提供商),这应该会使所有这些都消失。

答案 1 :(得分:0)

不,您的十进制文字中不能有分隔符。编译器会将它与声明具有相同类型的多个变量混淆,如:

decimal price = 1m, tax = 234m; 

如果它是一个字符串,你可以解析它:

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

编辑:我上面的回答是针对问题第一版中的代码示例。现在问题已被编辑:

您可以使用Decimal.ToString(string format, IFormatProvider provider)方法重载来控制小数值的字符串表示形式。这允许您指定standardcustom格式字符串。在您的情况下,听起来您需要使用点分隔2个十进制数字,并且没有组分隔符(没有逗号)。所以你可以说:

price.ToString("F2", CultureInfo.InvariantCulture) // ex. result: "1234.56"
如果您需要点分隔符,

CultureInfo.InvariantCulture很重要,无论当前的文化如何。如果您没有指定,输出可能是“1234,56”,具体取决于当前的文化(例如,在de-DE或fr-FR等欧洲文化的情况下)。