我目前正在使用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()
答案 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)
方法重载来控制小数值的字符串表示形式。这允许您指定standard或custom格式字符串。在您的情况下,听起来您需要使用点分隔2个十进制数字,并且没有组分隔符(没有逗号)。所以你可以说:
price.ToString("F2", CultureInfo.InvariantCulture) // ex. result: "1234.56"
如果您需要点分隔符, CultureInfo.InvariantCulture
很重要,无论当前的文化如何。如果您没有指定,输出可能是“1234,56”,具体取决于当前的文化(例如,在de-DE或fr-FR等欧洲文化的情况下)。