计算字符串值
本文关键字:字符串 计算 | 更新日期: 2023-09-27 18:05:51
我正在用c#编写一个程序,该程序从用户输入中获取一个方程并对其进行评估。目前,我有一种计算用户输入的方法,也可以从存储的变量(如x)中获取值。将输入的方程将类似于2.0 * 78 * 4X / 3
。
此刻,我可以用与其相关联的值替换X
。然而,我需要一种搜索字符串并找到X
的方法,然后如果X
在它之前有一个数字,将X * X
乘以该数字。在上面的例子中,这将是4倍。
是否最好使用IndexOf
方法或将字符串分割成子字符串?
所有我想要的是能够找到X
之前有一个数字;如果没有,则只输出X
的值,否则如果X
之前有一个数字,则将X*X
相乘。
这是我找到X
传递的数据的代码,。理想情况下,我想包含以下任何代码:
if (name == "x" || name == "X")
{
args.Result = x; // Returns value of x
}
这是所有剩下的代码
var e = new Expression(input);
// Set up a custom delegate so NCalc will ask you for a parameter's value
// when it first comes across a variable
e.EvaluateParameter += delegate(string name, ParameterArgs args)
{
if (name == "x" || name == "X")
{
args.Result = x; // Returns value of x
}
else if (name == "y" || name == "Y")
{
//....
}
else if (name == "z" || name == "Z")
{
//....
}
// Or if the names match up you might be able to something like:
// args.Result = dataRow[name];
};
//var result =
return e.Evaluate();
我认为你应该做一个"真正的"解析器,它创建一个表达式树。
您可以手动执行此操作,例如:http://www.codeproject.com/Articles/88435/Simple-Guide-to-Mathematical-Expression-Parsing
或者您可以使用现成的解析器生成器(如ANTLR)来提供简单的语法,参见示例。http://www.codeproject.com/Articles/18880/State-of-the-Art-Expression-Evaluation
无论哪种方式,对于变量值,您可能应该将它们保存在Dictionary<string, double>
public double GetVariableValue(string varName)
{
double val;
if (!variables.TryGetValue(varName, out val))
throw new InvalidOperationException("Undefined variable "+varName);
return val;
}
您可以使用RegEx完成此操作。一个简单的例子:
class MainClass
{
private static int X = 3, Z = 5, Y = 10;
public static void Main (string[] args)
{
string eqn = "2.5Y * 78Z * 4X / 3 + H * 3N";
string regex = "(?<var>[a-z])|(?<int>(''d+(''.''d+))|(''d+))(?<var>[a-z])";
Regex r = new Regex (regex, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
MatchCollection m = r.Matches (eqn);
if (m.Count > 0)
{
foreach (Match ma in m) {
MatchVar (ma);
}
}
}
private static void MatchVar (Match m)
{
string stringValue = string.IsNullOrEmpty (m.Groups ["int"].ToString ()) ? "1" : m.Groups ["int"].ToString ();
double value = double.Parse (stringValue);
string var = m.Groups ["var"].ToString ();
switch (m.Groups ["var"].ToString ())
{
case "X":
Console.WriteLine ("Result for {0}: {1}", var, value * X);
break;
case "Z":
Console.WriteLine ("Result for {0}: {1}", var, value * Z);
break;
case "Y":
Console.WriteLine ("Result for {0}: {1}", var, value * Y);
break;
default:
Console.WriteLine ("No value defined for {0}", var);
break;
}
}
}