int b=Convert.ToInt16(10)*Convert.ToInt16(10)-Convert.ToInt16(1)
int b=Convert.ToInt16("10")*Convert.ToInt16("10")-Convert.ToInt16("1")
这个应该可以 Compute的第二个参数应该是布尔值吧?
2楼方法很强,经测试,在加入 using System.Data; 之后可以得到结果
if (!Page.IsPostBack) { string a = "10*10-1"; int b = Convert.ToInt32(new DataTable().Compute(a, "")); Response.Write(b); }
下面的是MSSQl的写法declare @i varchar(200) set @i='10*10-1' select cast(left(@i,charindex('*',@i)-1) as int)*cast(left(stuff(@i,1,charindex('*',@i),''),charindex('-',stuff(@i,1,charindex('*',@i),''))-1) as int)-cast(right(@i,len(@i)-charindex('-',@i)) as int)--结果 99
int b = Convert.ToInt32(new DataTable().Compute(a,""));
using System.Collections.Generic;
using System.Text;namespace ExpressionParse
{
//定义文法表示:
//expr->statement{+statement}{-statement}
//statement->operand{*operand}{/operand}
//operand->num|(expr) public class Parser
{
#region 私有成员 /// <summary>
/// 需要解析的表达式
/// </summary>
private string expression = null; /// <summary>
/// 表达式的当前索引
/// </summary>
private int index = 0; /// <summary>
/// 用于保存解析出来的符号
/// </summary>
private string token = string.Empty; /// <summary>
/// 解析出来的单词符号类型
/// </summary>
private TokenType type = TokenType.Empty; #endregion #region 构造函数
public Parser(string expression)
{
this.expression = expression;
}
#endregion #region 公有方法 /// <summary>
/// 提供给外部调用的解析方法
/// </summary>
/// <returns>表达式的计算结果 </returns>
public double Parse()
{
if (expression == null || expression.Trim().Length == 0)
throw new Exception("没有输入字符串!");
GetToken();
if (type == TokenType.Empty)
{
throw new Exception("没有输入表达式");
} double result = ParseExpression();
if (type != TokenType.Empty)
{
throw new Exception("表达式出现语法错误");
}
return result;
} #endregion #region 解析表达式expr->statement{+statement}{-statement} /// <summary>
/// 解析表达式expr->statement{+statement}{-statement}
/// </summary>
/// <returns>表达式的计算值 </returns>
private double ParseExpression()
{
//op是记录操作符号(+-*/>)的字符,下同
string op;
double result = ParseStatement();
if (type == TokenType.Empty)
return result; //循环计算statement的值
while ((op = token) == "+" || op == "-")
{
GetToken();
if (op == "+")
{
result = result + ParseStatement();
}
else if (op == "-")
{
result = result - ParseStatement();
}
if (type == TokenType.Empty)
break;
}
return result;
} #endregion #region 解析statement->operand{*operand}{/operand} /// <summary>
/// 解析表达式中的项,statement->operand{*operand}{/operand}
/// </summary>
/// <returns>项statement的计算值 </returns>
private double ParseStatement()
{
double result = ParseOperand();
string op = token;
if (type == TokenType.Empty)
return result; //循环计算operand的值
while ((op = token) == "*" || op == "/")
{
GetToken();
if (op == "*")
result = result * ParseOperand();
else if (op == "/")
{
//处理除0,默认除0的话返回0
double partialResult = ParseOperand();
if (partialResult != 0)
{
result = result / partialResult;
}
else
{
return 0;
}
}
if (type == TokenType.Empty)
break;
}
return result;
}
#endregion #region 解析operand->num|(expr) /// <summary>
/// 解析表达式中的项,operand->num|(expr)
/// </summary>
/// <returns>项operand的计算值 </returns>
private double ParseOperand()
{
double result = 0; if (type == TokenType.Num)
{
result = double.Parse(token);
GetToken();
} //如果type为左括号,递归调用ParseExpression
else if (type == TokenType.LeftParentheses)
{
GetToken();
result = ParseExpression();
CheckRightParentheses();
GetToken();
} //如果是单独的+-号,需要进行一些处理
else if (token == "+" || token == "-")
{
string op = token;
GetToken();
result = ParseStatement();
if (op == "-")
result = -result;
}
return result;
} #endregion
/// 每次得到下一个词。
/// </summary>
private void GetToken()
{
token = "";
type = TokenType.Empty;
while (index < expression.Length && expression[index] == ' ')
index++;
if (index == expression.Length)
{
return;
}
//判断是否为操作符
if (IsDelim(expression[index]))
{
token += expression[index];
index++;
type = TokenType.Operators;
}
//判断是否为左括号
else if (expression[index] == '(')
{
token += expression[index];
index++;
type = TokenType.LeftParentheses;
}
//判断是否为右括号
else if (expression[index] == ')')
{
token += expression[index];
index++;
type = TokenType.RightParentheses;
}
//判断是否为数字
else if (char.IsNumber(expression[index]))
{
while (char.IsNumber(expression[index]))
{
token += expression[index];
index++;
if (index >= expression.Length)
break;
}
if (index < expression.Length && expression[index] == '.')
{
token += expression[index];
index++;
while (char.IsNumber(expression[index]))
{
token += expression[index];
index++;
if (index >= expression.Length)
break;
}
}
type = TokenType.Num;
}
else
{
throw new Exception("输入错误");
}
}
#endregion #region 私有方法
/// <summary>
/// 判断一个字符是否为操作符。
/// </summary>
/// <param name="c"> </param>
/// <returns> </returns>
private bool IsDelim(char c)
{
//s代表需要支持的操作符。
string s = "+-*/";
return s.IndexOf(c) != -1;
}
/// <summary>
/// 检查是否有右边括号')'。
/// </summary>
private void CheckRightParentheses()
{
if (type != TokenType.RightParentheses)
{
throw new Exception("解析出现错误,缺少一个')'!");
}
} #endregion
} /// <summary>
/// 定义单词符号的类型。
/// </summary>
internal enum TokenType
{
/// <summary>
/// 操作符
/// </summary>
Operators, /// <summary>
/// 数字
/// </summary>
Num, /// <summary>
/// 左括号'('
/// </summary>
LeftParentheses, /// <summary>
/// 右括号')'
/// </summary>
RightParentheses,
/// <summary>
/// 空
/// </summary>
Empty
}
}
double result=p.Parse();
int b=Convert.ToInt16(10)*Convert.ToInt16(10)-Convert.ToInt16(1)
int b=Convert.ToInt16("10")*Convert.ToInt16("10")-Convert.ToInt16("1")
using System.Data;
之后可以得到结果
{
string a = "10*10-1";
int b = Convert.ToInt32(new DataTable().Compute(a, ""));
Response.Write(b);
}
set @i='10*10-1'
select cast(left(@i,charindex('*',@i)-1) as int)*cast(left(stuff(@i,1,charindex('*',@i),''),charindex('-',stuff(@i,1,charindex('*',@i),''))-1) as int)-cast(right(@i,len(@i)-charindex('-',@i)) as int)--结果
99