以下是类的实现代码,可以使用工具生成一个dll文件到时候加入引用就可以了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Drawing;
using System.Data.Common;
using System.Web.UI;
using System.IO;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Configuration.Internal;
using System.Configuration;
namespace HR.Common.Common
{
public class sszone_StringToFloat
{
//计算公式的相关函数
/// <summary>
/// 把单个字符“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”转化为数字0、1、2、3、4、5、6、7、8、9
/// </summary>
/// <param name="nChart"></param>
/// <returns></returns>
public int ChartToInt(string nChart)
{
int Intd = Int32.Parse(nChart.ToString());
return Intd;
}
/// <summary>
/// 把字符串“123.456”转化为数字123.456
/// </summary>
/// <param name="nCharts"></param>
/// <returns></returns>
public float ChartsToFloat(string nCharts)
{
float realInt = 0;
int chartslenght = 0;
chartslenght = nCharts.Length;
int DotAtIndex = 0;
DotAtIndex = nCharts.IndexOf('.');
if (DotAtIndex == -1)//没有小数点,是整数
{
for (int i = 0; i < chartslenght; i++)
{
int tempint = 0;
tempint = ChartToInt(nCharts.ElementAt(i).ToString());
for (int j = chartslenght - 1 - i; j > 0; j--)
{
tempint = tempint * 10;
}
realInt += tempint;
}
}
else//有小数点,是小数
{
for (int i = 0; i < DotAtIndex; i++)//整数部分
{
int tempint = 0;
tempint = ChartToInt(nCharts.ElementAt(i).ToString());
for (int j = DotAtIndex - 1 - i; j > 0; j--)
{
tempint = tempint * 10;
}
realInt += tempint;
}
for (int i = DotAtIndex + 1; i < chartslenght; i++)//小数部分
{
float tempint = 0;
tempint = ChartToInt(nCharts.ElementAt(i).ToString());
for (int j = chartslenght - i; j > 0; j--)
{
tempint = (float)(tempint * 0.1);
}
realInt += tempint;
}
}
return realInt;
}
/// <summary>
/// 计算两个数,浮点数,包括加减乘除运算
/// </summary>
/// <param name="nFirstNumber">第一个数</param>
/// <param name="nSecondNumber">第二个数</param>
/// <param name="nCharater">运算符号</param>
/// <returns></returns>
public float CaculateTwoNumber(float nFirstNumber, float nSecondNumber, string nCharater)
{
float nResult = 0;
if (nCharater == "+")
{
nResult = nFirstNumber + nSecondNumber;
}
if (nCharater == "-")
{
nResult = nFirstNumber - nSecondNumber;
}
if (nCharater == "*")
{
nResult = nFirstNumber * nSecondNumber;
}
if (nCharater == "/")
{
nResult = nFirstNumber * nSecondNumber;
}
return nResult;
}
/// <summary>
/// 根据传递进来的字符串,只含有数字和“*”或“/”符号,计算出结果
/// </summary>
/// <param name="nnumberstr">只含有数字和“*”或“/”符号的字符串</param>
/// <returns></returns>
public double ReturnMultAndDevResult(string nnumberstr)
{
double realResult = 0;
///查找运算符
int nMultorDev = 0;//代表是乘法还是除法,0是乘法,1是除法
nMultorDev = nnumberstr.IndexOf('*');
if (nMultorDev <= 0)
{
nMultorDev = 1;//没有找到“*”,是除法
}
else
{
nMultorDev = 0;//找到“*”,是乘法
}
///分割运算符和数字
double FirstNumber = 0;
double SecondNumber = 0;
string FirstNumberString = "";
string SecondNumberString = "";
//int FirstNumberStringLength = 0;
//int SecondNumberStringLength = 0;
if (nMultorDev == 0)//乘法
{
string[] numberstringlistMult = nnumberstr.Split('*');
FirstNumberString = numberstringlistMult[0].ToString();
SecondNumberString = numberstringlistMult[1].ToString();
//FirstNumberStringLength = FirstNumberString.Length;
//SecondNumberStringLength = SecondNumberString.Length;
///转化为数字
FirstNumber = ChartsToFloat(FirstNumberString);
//FirstNumber = Double.Parse(FirstNumber.ToString());
SecondNumber = ChartsToFloat(SecondNumberString);
//SecondNumber = Double.Parse(SecondNumber.ToString());
FirstNumber = Math.Round(FirstNumber, 2);
SecondNumber = Math.Round(SecondNumber, 2);
///计算两个数字的运算结果
realResult = FirstNumber * SecondNumber;
realResult = Math.Round(realResult, 2);
}
else
{
string[] numberstringlistDev = nnumberstr.Split('/');
FirstNumberString = numberstringlistDev[0].ToString();
SecondNumberString = numberstringlistDev[1].ToString();
///转化为数字
FirstNumber = ChartsToFloat(FirstNumberString);
SecondNumber = ChartsToFloat(SecondNumberString);
FirstNumber = Math.Round(FirstNumber, 2);
SecondNumber = Math.Round(SecondNumber, 2);
///计算两个数字的运算结果
realResult = FirstNumber / SecondNumber;
realResult = Math.Round(realResult, 2);
}
return realResult;
}
/// <summary>
/// 根据传递进来的字符串,只含有数字和“+”或“-”符号,计算出结果
/// </summary>
/// <param name="nnumberstr">只含有数字和“+”或“-”符号的字符串</param>
/// <returns></returns>
public float ReturnPlusAndCutResult(string nnumberstr)
{
float realResult = 0;
///查找运算符
int nPlusAndCut = 0;//代表是加法还是减法,0是加法,1是减法
nPlusAndCut = nnumberstr.IndexOf('+');
if (nPlusAndCut <= 0)
{
nPlusAndCut = 1;//没有找到“-”,是减法
}
else
{
nPlusAndCut = 0;//找到“+”,是加法
}
///分割运算符和数字
float FirstNumber = 0;
float SecondNumber = 0;
string FirstNumberString = "";
string SecondNumberString = "";
//int FirstNumberStringLength = 0;
//int SecondNumberStringLength = 0;
if (nPlusAndCut == 0)//加法
{
string[] numberstringlistMult = nnumberstr.Split('+');
FirstNumberString = numberstringlistMult[0].ToString();
SecondNumberString = numberstringlistMult[1].ToString();
//FirstNumberStringLength = FirstNumberString.Length;
//SecondNumberStringLength = SecondNumberString.Length;
///转化为数字
FirstNumber = ChartsToFloat(FirstNumberString);
SecondNumber = ChartsToFloat(SecondNumberString);
///计算两个数字的运算结果
realResult = FirstNumber + SecondNumber;
}
else
{
string[] numberstringlistDev = nnumberstr.Split('-');
FirstNumberString = numberstringlistDev[0].ToString();
SecondNumberString = numberstringlistDev[1].ToString();
///转化为数字
FirstNumber = ChartsToFloat(FirstNumberString);
SecondNumber = ChartsToFloat(SecondNumberString);
///计算两个数字的运算结果
realResult = FirstNumber - SecondNumber;
}
return realResult;
}
/// <summary>
/// 返回括号里面的内容,可能含有加法、减法、乘法和除法,但是没有括号
/// </summary>
/// <param name="nCharaterString"></param>
/// <returns></returns>
public string FindOutsideStringInBrackets(string nCharaterString)
{
string ResultString = "";
int startindex = 0;
int endindex = 0;
int substartindex = 0;
int subendindex = 0;
int countBrackets = 0;
int exitid = 0;
int strlenght = 0;
strlenght = nCharaterString.Length;
exitid = nCharaterString.IndexOf('(');
if (exitid != -1)//有括号在字符串里
{
startindex = nCharaterString.IndexOf('(');
endindex = nCharaterString.IndexOf(')');
string subCharaterstring = nCharaterString.Substring(startindex, endindex - startindex);
strlenght = subCharaterstring.Length;
for (int curindex = 0; curindex < strlenght; )//得到左括号的个数
{
subCharaterstring = subCharaterstring.Substring(curindex);
strlenght = subCharaterstring.Length;
substartindex = subCharaterstring.IndexOf('(');
if (substartindex != -1)
{
countBrackets++;
curindex = substartindex + 1;
}
else
{
curindex++;
}
}
subCharaterstring = nCharaterString.Substring(endindex);
strlenght = subCharaterstring.Length;
//while (countBrackets > 0)//根据左括号的个数查找到对应的右括号的序号
//{
for (int curindex = 0; curindex < strlenght && countBrackets > 0; )
{
subCharaterstring = subCharaterstring.Substring(curindex);
strlenght = subCharaterstring.Length;
subendindex = subCharaterstring.IndexOf(')');
if (subendindex != -1)
{
countBrackets--;
curindex = subendindex + 1;
endindex += subendindex + 1;//找到右括号,跳转增加
}
else
{
curindex++;
endindex++;//没有找到括号,逐个增加
}
}
//}
ResultString = nCharaterString.Substring(startindex + 1, endindex - 1 - startindex - 1);
ResultString = FindOutsideStringInBrackets(ResultString);//递归调用函数
return ResultString;
}
else //没有括号在字符串里
{
ResultString = nCharaterString;
return ResultString;
}
}
/// <summary>
/// 返回括号里的字符串的结果的字符串
/// </summary>
/// <param name="nstrBrackets"></param>
/// <returns></returns>
public string ReturnStringInBrackets(string nstrBrackets)
{
char[] FourArr = { '+', '-', '*', '/' };
int Fourcount = 0;
Fourcount = nstrBrackets.IndexOfAny(FourArr);
if (Fourcount < 0)
{
return nstrBrackets;
}
string[] stroutPandC = nstrBrackets.Split('+', '-');
int stritemcount = stroutPandC.Length;//记录有多少个加减号+1
string strCharatersIndexList = "";
int strlength = nstrBrackets.Length;
string tempstr = "";
tempstr = nstrBrackets.ToString();
char[] strchars = { '+', '-' };
for (int indexid = 0; indexid < strlength; )//找出+号和-号的位置,记录+号和-号的顺序
{
int tempid = 0;
tempid = tempstr.IndexOfAny(strchars);
if (tempid > 0)
{
if (strCharatersIndexList == "")
{
strCharatersIndexList += tempstr.ElementAt(tempid).ToString();//记录下符号是哪个符号
}
else
{
strCharatersIndexList += "|";
strCharatersIndexList += tempstr.ElementAt(tempid).ToString();
}
tempstr = tempstr.Substring(tempid + 1);
indexid = tempid;
}
else
{
break;
}
}
int strChartatersIndexListLength = 0;
strChartatersIndexListLength = (strCharatersIndexList.Length + 1) / 2;//运算符的个数
string[] strChartatersIndexListArry = strCharatersIndexList.Split('|');
string tempMDresultstr = "";//保存最后的结果,运算过程中也会用到
for (int indexid = 0; indexid < stritemcount; indexid++)// 替换含有*、/号的字符串
{
if (stroutPandC[indexid].ToString().IndexOf('*') > 0 || stroutPandC[indexid].ToString().IndexOf('/') > 0)//存在乘除运算
{
char[] MDcharArr = { '*', '/' };
int strMDlength = stroutPandC[indexid].Length;
//分割*、/符号,保存数字
string[] strMDlist = stroutPandC[indexid].ToString().Split(MDcharArr);
//记录数字个数
int strMDListLength = (strMDlist.Length + 1) / 2;
//记录*、/符号的位置
string strMDindexlist = "";
string tempMDstr = "";
tempMDstr = stroutPandC[indexid].ToString();
for (int mdindexid = 0; mdindexid < strMDlength; )//找出*、/的位置
{
int mdtempid = 0;
mdtempid = tempMDstr.IndexOfAny(MDcharArr);
if (mdtempid > 0)
{
if (strMDindexlist == "")
{
strMDindexlist += tempMDstr.ElementAt(mdtempid).ToString();//顺序记录下符号是哪个符号
}
else
{
strMDindexlist += "|";
strMDindexlist += tempMDstr.ElementAt(mdtempid).ToString();
}
tempMDstr = tempMDstr.Substring(mdtempid + 1);
mdindexid = mdtempid;
}
else
{
break;
}
}
//根据数字和*、/符号的顺序位置,计算出结果
tempMDresultstr = "";
string tempMDresultinstr = "";
double tempMDresult = 0;
int strMDindexlistLength = (strMDindexlist.Length + 1) / 2;
string[] strMDindexlistArry = strMDindexlist.Split('|');
for (int strMDindexlistid = 0; strMDindexlistid < strMDindexlistLength; strMDindexlistid++)
{
if (strMDindexlistid == 0)
{
tempMDresultstr = strMDlist[0].ToString();
}
else
{
//tempMDresultstr = strMDlist[strMDindexlistid + 1].ToString();
}
tempMDresultinstr = tempMDresultstr + strMDindexlistArry[strMDindexlistid].ToString() + strMDlist[strMDindexlistid + 1].ToString();
tempMDresult = ReturnMultAndDevResult(tempMDresultinstr);
tempMDresultstr = tempMDresult.ToString();//运算结果
}
stroutPandC[indexid] = tempMDresultstr;
if (stritemcount <= 0)
{
return tempMDresultstr.ToString();//运算结果
}
}
else//没有乘除,只有加减运算
{
}
}
//根据数字和+、-符号的顺序位置,计算出结果
string tempPCresultinstr = "";
float tempPCresult = 0;
//int strPCindexlistLength = strCharatersIndexList.Length;
for (int strPCindexlistid = 0; strPCindexlistid < strChartatersIndexListLength; strPCindexlistid++)
{
if (strPCindexlistid == 0)
{
tempMDresultstr = stroutPandC[0].ToString();
}
else
{
//tempMDresultstr = strMDlist[strMDindexlistid + 1].ToString();
}
tempPCresultinstr = tempMDresultstr + strChartatersIndexListArry[strPCindexlistid].ToString() + stroutPandC[strPCindexlistid + 1].ToString();
tempPCresult = ReturnPlusAndCutResult(tempPCresultinstr);
tempMDresultstr = tempPCresult.ToString();//运算结果
}
return tempMDresultstr.ToString();//运算结果
}
/// <summary>
/// 返回添加括号后的公式字符串
/// </summary>
/// <param name="nInString"></param>
/// <returns></returns>
public string ReturnAddBracketsString(string nInString)
{
//nInString = "(" + nInString + ")";
string OutString = "";
char[] BracketsArr = { '(', ')' };
char[] FourCharatersArr = { '+', '-', '*', '/' };
char[] TowCharatersArr = { '+', '-' };
char[] NFourCharatersArr = { '+', '-', '(', ')' };
char[] MDTowCharatersArr = { '*', '/' };
int InStringLength = nInString.Length;
//int FirstNFIndex = 0;
//int SecondNFIndex = 0;
//int IsExistNFIndex = -2;
string[] InStringSplitNFourArr = nInString.Split(NFourCharatersArr);
int InStringSplitNFourArrLength = InStringSplitNFourArr.Length;
string InStringSplitNFourArrCharaters = "";
string tempInStringSplitNFourArrCharaters = nInString;
for (int tempindstringsplitid = 0; tempindstringsplitid < InStringLength; )//保存分割的符号
{
tempInStringSplitNFourArrCharaters = tempInStringSplitNFourArrCharaters.Substring(tempindstringsplitid);
int elementid = tempInStringSplitNFourArrCharaters.IndexOfAny(NFourCharatersArr);
if (elementid >= 0)
{
if (InStringSplitNFourArrCharaters == "")
{
InStringSplitNFourArrCharaters = tempInStringSplitNFourArrCharaters.ElementAt(elementid).ToString();
}
else
{
InStringSplitNFourArrCharaters += "|" + tempInStringSplitNFourArrCharaters.ElementAt(elementid).ToString();
}
tempindstringsplitid = elementid + 1;
}
else
{
tempindstringsplitid = InStringLength;
}
}
string[] InStringSplitNFourArrCharatersArr = InStringSplitNFourArrCharaters.Split('|');
int InStringSplitNFourArrCharatersLength = InStringSplitNFourArrCharatersArr.Length;
for (int CKindexid = 0; CKindexid < InStringSplitNFourArrLength; CKindexid++)//添加括号
{
if (InStringSplitNFourArr[CKindexid].ToString().Length <= 0)
{
continue;
}
char Mult;
Mult = InStringSplitNFourArr[CKindexid].ToString().ElementAt(0);
if (Mult == '*' || Mult == '/')
{
int rightcout = 0;
//int leftindexid = -1;
int firstleftindexid = -1;
string pertempstring = "";
for (int perid = CKindexid - 1; perid >= 0; perid--)
{
int tempindexid = InStringSplitNFourArr[perid].IndexOf(')');
if (tempindexid > 0)
{
rightcout++;
}
int templeftindexid = InStringSplitNFourArr[perid].IndexOf('(');
if (templeftindexid >= 0)
{
rightcout--;
if (rightcout == 0)
{
firstleftindexid = perid;
break;
}
}
}
if ((firstleftindexid - rightcout) >= 0)
{
int MDcount = InStringSplitNFourArr[CKindexid].ToString().Split(MDTowCharatersArr).Length;
//插入第一个“(”
pertempstring = InStringSplitNFourArr[firstleftindexid - rightcout].ToString();
pertempstring = pertempstring.Insert(0, "(");
InStringSplitNFourArr[firstleftindexid - rightcout] = pertempstring;
//插入最后“)”
pertempstring = InStringSplitNFourArr[CKindexid].ToString();
int nextlength = InStringSplitNFourArr[CKindexid].ToString().Length;
pertempstring = pertempstring.Insert(nextlength, ")");
InStringSplitNFourArr[CKindexid] = pertempstring;
string tempbackstring = "";
int perid = InStringSplitNFourArr[CKindexid].ToString().Length - 1;
for (int indexid = 0; indexid < MDcount - 1; indexid++)
{
//循环插入“(”
pertempstring = InStringSplitNFourArr[firstleftindexid - rightcout].ToString();
pertempstring = pertempstring.Insert(0, "(");
InStringSplitNFourArr[firstleftindexid - rightcout] = pertempstring;
//循环插入“)”
tempbackstring = InStringSplitNFourArr[CKindexid].ToString().Substring(0, perid);
perid = tempbackstring.LastIndexOfAny(MDTowCharatersArr);
tempbackstring = InStringSplitNFourArr[CKindexid].ToString();
tempbackstring = tempbackstring.Insert(perid, ")");
InStringSplitNFourArr[CKindexid] = tempbackstring;
}
}
}
else
{
if (InStringSplitNFourArr[CKindexid].ToString().Length >= 3)//至少有5个元素,3个数字和2个符号
{
string[] tempCKArr = InStringSplitNFourArr[CKindexid].ToString().Split(MDTowCharatersArr);
int tempCKArrLength = tempCKArr.Length;
string savetempstring = InStringSplitNFourArr[CKindexid].ToString();
if (tempCKArrLength >= 2)//至少有3个元素,3个数字
{
int addcount = 0;
for (int addindexid = 2; addindexid < tempCKArrLength; addindexid++)
{
int insertindexlength = 0;
for (int addcountid = 0; addcountid < addindexid; addcountid++)
{
insertindexlength += tempCKArr[addcountid].ToString().Length;
insertindexlength += 1;
}
savetempstring = savetempstring.Insert(0, "(");
savetempstring = savetempstring.Insert(insertindexlength + addcount, ")");
addcount += 2;
}
savetempstring = savetempstring.Insert(0, "(");
int savetempstringlength = savetempstring.Length;
savetempstring = savetempstring.Insert(savetempstringlength, ")");
InStringSplitNFourArr[CKindexid] = savetempstring;
}
}
}
}
string resultstr = "";
string tempresult = "";
for (int addindexid = 0; addindexid < InStringSplitNFourArrCharatersLength; addindexid++)
{
if (addindexid == 0)
{
if (InStringSplitNFourArrLength <= 1)
{
tempresult = InStringSplitNFourArr[0].ToString();
}
else
{
tempresult = InStringSplitNFourArr[0].ToString() + InStringSplitNFourArrCharatersArr[addindexid].ToString() + InStringSplitNFourArr[1].ToString();
}
continue;
}
else
{
resultstr = tempresult + InStringSplitNFourArrCharatersArr[addindexid].ToString() + InStringSplitNFourArr[addindexid + 1].ToString();
tempresult = resultstr;
continue;
}
//resultstr = tempresult + InStringSplitNFourArrCharatersArr[addindexid].ToString() + InStringSplitNFourArr[addindexid + 1].ToString();
//tempresult = resultstr;
}
//resultstr = resultstr.Insert(0, "(");
//int resultstrlength = resultstr.Length;
//resultstr = resultstr.Insert(resultstrlength, ")");
//OutString = resultstr;
tempresult = tempresult.Insert(0, "(");
int tempresultstrlength = tempresult.Length;
tempresult = tempresult.Insert(tempresultstrlength, ")");
OutString = tempresult;
return OutString;
}
/// <summary>
/// 循环调用该函数,传入括号的内容,返回所有运算的最总结果字符串
/// </summary>
/// <param name="nInString">括号内的内容,包括最外围的括号</param>
/// <param name="nStartIndex">开始位置</param>
/// <param name="nEndIndex">结束位置</param>
/// <returns></returns>
public string ReturnFinalResultString(string nInString, int nStartIndex, int nEndIndex)
{
string TempResultString = "";
int StartIndexLeft = 0;
int EndIndexRight = 0;
//int TempIndex = 0;
char LeftBracket = '(';
char RightBracket = ')';
char[] FourCharArr = { '+', '-', '*', '/' };
int InStringLength = 0;
string SubLeftInString = "";
//int SubLeftInStringLength = 0;
string tempString = "";
//float TempResult = 0;
string TempSubString = "";
InStringLength = nInString.Length;
SubLeftInString = nInString.Substring(0, InStringLength);
EndIndexRight = SubLeftInString.IndexOf(RightBracket);
tempString = SubLeftInString.Substring(0, EndIndexRight);
StartIndexLeft = tempString.LastIndexOf(LeftBracket);
if (StartIndexLeft >= 0 || EndIndexRight >= 0)
{
if (StartIndexLeft >= 0)
{
TempSubString = nInString.Substring(StartIndexLeft + 1, EndIndexRight - StartIndexLeft - 1);//取出括号内的内容
TempResultString = ReturnStringInBrackets(TempSubString);//返回括号内的结果
TempSubString = nInString.Remove(StartIndexLeft, EndIndexRight - StartIndexLeft + 1);
TempSubString = TempSubString.Insert(StartIndexLeft, TempResultString);
char[] TowBracketsArr = { '(', ')' };
int count = TempSubString.IndexOfAny(TowBracketsArr);
if (count >= 0)
{
TempSubString = ReturnFinalResultString(TempSubString, 0, 0);//递归调用
}
}
}
TempResultString = TempSubString;
//for (int indexid = 0; indexid < InStringLength; indexid++)
//{
//}
return TempResultString;
}
//公式的计算算法结束//
}
}