<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>suanshu</title>
<!-- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> -->
<script type="text/javascript">
var pattBrackets = /\([^\(\)]*\)/gm;
function main () {
var testStr = '1+4+(22+33)*((4+7)/6)+(3*4+(4+5))+100';
//console.log('source:',testStr)
var tempArrBrackes = [];
var temp3MArr = [];
var subArr = [];
var regExpShow = document.getElementById('regExp');
regExpShow.innerHTML = regExpShow.innerHTML + '<br>算式: ' +testStr;
//解析出 括号中的内容
while(subArr = testStr.match(pattBrackets)) {
for (var i = 0;i < subArr.length ; i++)
{
var name = getName();
tempArrBrackes.push({name:name, formula:subArr[i].substring(1,subArr[i].length - 1)});
testStr = testStr.replace(subArr[i], name);
}
}
tempArrBrackes.push({name:getName(), formula:testStr});
//把没有括号的 算式的 数组 解析成 a+b=n的树
for (var i = 0; i < tempArrBrackes.length ; i++)
{
var mArr = getStrByParrt(tempArrBrackes[i].formula, tempArrBrackes[i].name);
if (mArr)
{
temp3MArr = temp3MArr.concat(mArr);
}
}
//计算 并 将结果树打印到页面
var tree = getValue(temp3MArr);
for (var key in tree)
{
regExpShow.innerHTML = regExpShow.innerHTML + '<br>'+key+': ' + tree[key].formula + ' = ' +tree[key].value;
}
}
//解析最简单的 计算式 a + b = n
var pattArr = [/n{0,1}\d+\*{1}n{0,1}\d+/
,/n{0,1}\d+\/{1}n{0,1}\d+/
,/n{0,1}\d+\+{1}n{0,1}\d+/
,/n{0,1}\d+\-{1}n{0,1}\d+/];
var pattD = /[\+\-\*\/]/gm;
function getStrByParrt (iStr, iName) {
//console.log('----------------------------:',iStr);
var ret = [];
var subStr = [];
for (var i = 0; i < pattArr.length; i++)
{
while(subStr = iStr.match(pattArr[i])) {
if (iStr.match(pattD).length == 1)
{
ret.push({name:iName, formula:subStr[0]});
break;
}
var name = getName();
ret.push({name:name, formula:subStr[0]});
iStr = iStr.replace(subStr, name);
}
}
//console.log('pattD',ret.toString())
return ret;
}
// 计算式 算值
function getValue (m3Arr) {
var retTree = {};
for (var i = 0; i < m3Arr.length ; i++)
{
var formula = m3Arr[i].formula;
var name = m3Arr[i].name;
var sign = formula.match(pattD)[0];
var params = formula.split(sign);
retTree[name] = {
formula : formula
,value : ''
};
switch(sign){
case '+' : retTree[name].value = getValueFromTree(retTree, params[0]) + getValueFromTree(retTree, params[1]); break;
case '-' : retTree[name].value = getValueFromTree(retTree, params[0]) - getValueFromTree(retTree, params[1]); break;
case '*' : retTree[name].value = getValueFromTree(retTree, params[0]) * getValueFromTree(retTree, params[1]); break;
case '/' : retTree[name].value = getValueFromTree(retTree, params[0]) / getValueFromTree(retTree, params[1]); break;
}
}
return retTree;
}
// 字符串 转数字 变量不转
function getValueFromTree(tree, name) {
var value = '';
if (name.indexOf('n') >=0)
{
value = parseFloat(tree[name].value);
} else {
value = parseFloat(name);
}
return value;
}
//取变量名
var nameIndex = 0;
function getName () {
return 'n' + nameIndex++;
}
</script>
</head>
<body onload=''>
<div id='show' style='height:30px'>'1+4+(22+33)*((4+7)/6)+(3*4+(4+5))+100'</div>
<input type='button' value='jisuan' onclick='main()'>
<div id='regExp'></div>
</body>
</html>
相关推荐
NULL 博文链接:https://fbj203.iteye.com/blog/657091
使用逆波兰表达式实现的四则运算解析库、计算器
在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析。 一、熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, ...
1、原码、反码、补码,正数减法转补码加法 js 在进行二进制运算时,使用 32 位二进制整数,由于 js 的整数都是有符号数,最高位0表示正数,1表示负数,因此,js 二进制运算中使用的整数表达范围是 代码如下: -Math....
jsep:微小JavaScript表达式解析器是一个用JavaScript编写的简单表达式解析器。 它可以解析JavaScript表达式,但不能解析操作。 表达式和运算之间的差异类似于Excel电子表格中的单元格与适当JavaScript程序之间的...
主要介绍了JavaScript常用进制转换及位运算实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
演示进行复杂表达式的解析,支持赋值操作,支持部分表达式运算,能解析自定义函数,显示表达式元素间的层次关系.
可解析带括号的四则运算。 解析算术表达式的时候,准备调用Webkit通过Js来解析的。 但是2.3.3存在Bug,Js调用Java会导致程序崩溃, 所以没办法,最后是用 BeanShell来解析的。 不过,因为需要每个参与计算的数字...
则直线的一般式方程AX+BY+C=0中,A B C分别等于: A = Y2 – Y1 B = X1 – X2 C = X2*Y1 – X1*Y2 2、向量旋转的计算公式 对于任意点A(x,y),A非原点,绕原点旋转θ角后点的坐标为:(x*cosθ- y * sinθ, y*cos...
主要介绍了JavaScript布尔运算符原理使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
下面我就个人观点猜测一下,并行运算将会怎样支持前端javascript的. 1 不太可能的进化 显示线程的支持 如果在Javascript中支持显示线程,那么可能是一种灾难,目前的浏览器解析Javascript并执行都是在浏览器的ui线程中...
语法 var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg]) 参数 callback:生成新数组元素的函数,使用三个参数: ...
因用发条js1.9,中文会出现乱码,用鬼鬼的就可以,发现本坛上只有7.0,其他地方找到了7.5的,给...4.全面兼容新的JS语法,解决系统引擎过老,某些代码运行会得到错误结果的问题。 5..解决某些浮点类型的运算结果不正确。
用于算术运算的解析器和编译器:类似于C的BurstAT汇编。 客观的 为Burstcoin自动交易创建高级编程语言。 当前状态 编译基于行的算术表达式 支持逻辑运算 支持关键字以及与循环和条件的集成(当前存在于SimpleIDE...
文件中提供常用的功能函数示例,包括表达式解析(math.evaluate)、绝对值(math.abs)、加(math.add)、减(math.subtract)、乘(math.multiply)、除(math.divide)、幂运算(math.pow)。mathjs实例创建及配置...
逻辑运算符对操作数进行布尔运算,经常和关系运算符一样配合使用。逻辑运算符将多个关系表达式组合起来组成一个更复杂的表达式。逻辑运算符分为逻辑非’!’、逻辑与’&&’、逻辑或’||’3种,本文将介绍这三种逻辑...