| YuriiZelenev |
17.12.2003 14:15 |
toNumber to number string to number stringToNumber convertToNumber
dolgo promuchieshsya...
Код:
Math.Expression = function() {}
Math.Expression.prototype.operators="+-*/^(";
Math.Expression.prototype.opPriority=[["^"],["neg"],["*","/"],["+","-"]];
Math.Expression.prototype.functions=["abs","acos","asin","atan","ceil","cos","exp","floor","log","random","round","sin","sqrt","tan"];
Math.Expression.prototype.parse = function(str,link) {
var pos=0;
var operator,bracket,len;
if (arguments.length<2) {
this.parts=new Array();
link=this.parts;
}
while ((operator=this.findOperator(str,pos)).pos!=-1) {
if (pos<operator.pos) {
len=link.length;
link[len]=new Object();
link[len].type="variable";
link[len].value=str.substring(pos,operator.pos);
if (!isNaN(Number(link[len].value))) {
link[len].type="value";
link[len].value=Number(link[len].value);
}
}
if (operator.op!="(") {
len=link.length;
link[len]=new Object();
link[len].type="operator";
if (link[len-1].type=="operator" || len==0) {
if (operator.op=="-") link[len].value="neg";
else return false;
}
else link[len].value=operator.op;
link[len].priority=this.findPriority(link[len].value);
pos=operator.pos+1;
}
else {
bracket=this.findBracket(str,operator.pos);
if (bracket==-1) return false;
len=link.length;
if (link[len-1].type=="variable") this.findFunction(link[len-1]);
link[len]=new Object();
link[len].type="expression";
link[len].value=new Array();
if (!this.parse(str.substring(operator.pos+1,bracket),link[len].value)) return false;
pos=bracket+1;
}
}
if (pos<str.length) {
len=link.length;
link[len]=new Object();
link[len].type="variable";
link[len].value=str.substring(pos);
if (!isNaN(Number(link[len].value))) {
link[len].type="value";
link[len].value=Number(link[len].value);
}
}
return true;
}
Math.Expression.prototype.findOperator = function(str,pos) {
var foundAt,foundAtTemp;
foundAt=str.length;
for (var i=0; i<this.operators.length; i++) {
foundAtTemp=str.indexOf(this.operators.charAt(i),pos);
if (foundAtTemp<foundAt && foundAtTemp!=-1) foundAt=foundAtTemp;
}
var a=new Object();
a.pos=(foundAt==str.length) ? -1 : foundAt;
a.op=str.charAt(foundAt);
return a;
}
Math.Expression.prototype.findPriority = function(op){
for (var i=0; i<this.opPriority.length; i++) {
for (var j=0; j<this.opPriority[i].length; j++) {
if (op==this.opPriority[i][j]) return i;
}
}
}
Math.Expression.prototype.findBracket = function(str,pos){
var open=pos
var close=pos;
do {
close=str.indexOf(")",close+1);
open=str.indexOf("(",open+1);
} while (close>open && open!=-1);
return close;
}
Math.Expression.prototype.findFunction = function(link){
for (var i in this.functions) {
if (link.value==this.functions[i]) link.type="function";
}
}
Math.Expression.prototype.eval = function() {
this.evaluated=new Array();
this.copyPartsArray(this.parts,this.evaluated);
return this.evalExpression(this.evaluated);
}
Math.Expression.prototype.copyPartsArray = function(link,copylink) {
for (var i in link) {
copylink[i]=new Object();
copylink[i].type=link[i].type;
copylink[i].value=link[i].value;
copylink[i].priority=link[i].priority;
if (link[i].type=="expression") {
copylink[i].value=new Array();
this.copyPartsArray(link[i].value,copylink[i].value);
}
}
}
Math.Expression.prototype.evalExpression = function(link) {
var op;
var i;
for (i in link) {
if (link[i].type=="expression") link[i].value=this.evalExpression(link[i].value);
if (link[i].type=="variable") link[i].value=this.evalVariable(link[i].value);
}
i=0;
while (i<link.length) {
if (link[i].type=="function") {
link[i].value=this.evalFunction(link[i].value,link[i+1].value);
link.splice(i+1,1);
}
i++;
}
for (var i=0; i<this.opPriority.length; i++) {
var k=0;
while (k<link.length) {
if (link[k].type=="operator" and link[k].priority==i) {
op=link[k].value;
link[k].type="value";
link[k].value=this.evalOperator(link[k].value,link[k-1].value,link[k+1].value);
link.splice(k+1,1);
if (op!="neg") link.splice(k-1,1);
k--;
}
k++;
}
}
return link[0].value;
}
Math.Expression.prototype.evalOperator = function(op,v1,v2) {
if (op=="+") return v1+v2;
if (op=="-") return v1-v2;
if (op=="*") return v1*v2;
if (op=="/") return v1/v2;
if (op=="^") return v1==0 ? 0 : Math.pow(v1,v2);
if (op=="neg") return -v2;
}
Math.Expression.prototype.evalVariable = function(v) {
return eval(v);
}
Math.Expression.prototype.evalFunction = function(func,v) {
return Math[func](v);
}
Primer:
Код:
//Primer
myExpression = new Math.Expression();
myExpression.parse("34/6-(4+1)*(2+1.5)");
trace(myExpression.eval());
ps:no esli sdelaesh luchshe - pokajesh...
dlya poiska: toNumber to number string to number stringToNumber convertToNumber
|