Показать сообщение отдельно
Старый 17.12.2003, 14:15
YuriiZelenev вне форума Посмотреть профиль Отправить личное сообщение для YuriiZelenev Посетить домашнюю страницу YuriiZelenev Найти все сообщения от YuriiZelenev
  № 3  
YuriiZelenev
 
Аватар для YuriiZelenev

Регистрация: Sep 2001
Адрес: Moi address ne dom i ne ulica...
Сообщений: 634
По умолчанию 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
__________________
Seek and you shall find Google
visit smilez.org :rolleyes:


Последний раз редактировалось YuriiZelenev; 17.12.2003 в 14:23.