*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: xxjzx
*/ 时间: 2007-10-23 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
//先引入要用到科学计算的类集
using System.Xml;
using System.Xml.XPath;
//声明三个类成员变量传值
string jg="0.00";
double myhjg=0;
double zzjg=0;
/*以下为在一个文本框内输入包括文字、数字、计算符号等内容的字符串,然后抛去文字只对数字按输入的操作符进行计算的方法*/
private void text1_TextChanged(object sender, System.EventArgs e)
{
dhx2=text1.Lines.Length;
//以下声明一个变量为text1中的行位
int hw=0;
//行位是总行数减一
hw=dhx2-1;
//以下声明一个字符串数组记录每一行原始的字符串
string[] mhsj;
mhsj=new string[dhx2];
//以下声明两个字符串数组分别记录每行去掉字符只有数字和计算符号的字符串及将"/"换成"div"可做除法的结果
string[] mhszfhzf=new string[dhx2];
string[] mhszfhzf1=new string[dhx2];
//第一步先将文本框中每行文本中的数字和符号取出,赋给一个新的字符串数组mhszfhzf,这样mhszfhzf每个元素即代表文本框中每行文本中的数字和符号;
try
{
for(int i=0;i<dhx2;i++)
{
mhsj[i]=text1.Lines[i];
//取出每行字符串中的所有的数字和符号并赋给新的字符串//
string[] dgzf;
dgzf=new string[mhsj[i].Length];
int j,h;
for(j=0;j<mhsj[i].Length;j++)
{
dgzf[j]=mhsj[i].Substring(j,1);
//转换%号为乘0.01的数
if(dgzf[j].Equals("%")==true)
{
dgzf[j]="*0.01";
}
}
//判断/符号是单位符号还是除法符号
for(int k=0;k<mhsj[i].Length;k++)
{
if(dgzf[k].Equals("/")==true)
{
if (char.IsNumber(dgzf[k+1],0)==true)
{
dgzf[k]=dgzf[k];
}
else
{
dgzf[k]="每";
}
}
}
for(h=0;h<j;h++)
{
if(char.IsNumber(dgzf[h],0)==true ||char.IsPunctuation(dgzf[h],0)==true ||char.IsSymbol(dgzf[h],0)==true)
{
mhszfhzf[i]=mhszfhzf[i]+dgzf[h];
}
}
}
}
catch(Exception)
{
}
//第二步再对mhszfhzf中每个字符串元素按数学公式进行计算;
try
{
//将“/”号换成" div "这样就可以做除法;
mhszfhzf1[hw]=mhszfhzf[hw].Replace("/"," div ");
//调用按公式计算的函数Evaluate按输入的公式逐行进行计算,将结果值赋给一个表示每行结果的变量
XmlDocument xd=new XmlDocument();
XPathNavigator jszhs=xd.CreateNavigator();
myhjg=(double)jszhs.Evaluate(mhszfhzf1[hw]);
}
catch(Exception)
{
}
}
/*计算后以回车作结束,每一行得一个结果,最后将每行结果进行累加*/
private void text1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
System.EventArgs z;
z=new EventArgs();
if(e.KeyChar==13)
{
//按下回车键后将单位数量单价中的结果进行累加
zzjg+=myhjg;
jg=zzjg.ToString();
}
}
//计算的最终结果赋给了类成员变量jg,这样可以将结果值以字符串的形式得到!
[此贴子已经被作者于2007-10-23 16:27:10编辑过]