PDA

Просмотр полной версии : строка -> цифра


MisterX
15.03.2007, 02:01
есть строка
var d:String="1+2";
Вопрос, есть ли ф-я какаято что мне вернет 3? Имеется ввиду что посчитает то что в строковой константе
З.Ы. В строке могут встречатся только целые числа, и самый простые мат ф-и, тоесть добавление, отнимание, умножение и деление.

iNils
15.03.2007, 02:22
Нет такой функции. Надо парсить в ручную.

MisterX
15.03.2007, 02:24
уууу ... ваще низачет .. млин .. писец вобщем ((
Спасибо за ответ! =)

iNils
15.03.2007, 02:26
А вы хотите чтобы в плеер еще и компилятор был встроен?

MisterX
15.03.2007, 02:34
ну хотябы с элементарными математическими ф-ями, или может какойто фреймворк есть для этого.. я незнаю, я только учусь, тоесть не учусь а совершенствуюсь =)

MisterX
15.03.2007, 05:13
Кароче написал клас, кому надо забирайте, вроде работает только нет приоритета операций. Работает и с целыми и дробными числами, и с отрицательными тоже :p

class inc.func.Calc extends Object{
private function isDigit(Ch:String):Boolean{
return not isNaN(parseInt(Ch));
}
private function isSign(Ch:String):Boolean{
var ret:Boolean=(Ch=='+') or (Ch=='-');
return ret;
}
private function isSeparator(Ch:String):Boolean{
var ret:Boolean=(Ch=='.');
return ret;
}

private function isOperator(Ch:String):Boolean{
switch(Ch){
case '+': return true; break;
case '-': return true; break;
case '/': return true; break;
case '*': return true; break;
default: return false; break;
}
}

private function Numbers(S:String, P:Number):Array{
var InitPos:Number;
InitPos=P;

if((P<S.length) && (this.isSign(S.charAt(P)))){
P++;
}
if((P>=S.length) || !this.isDigit(S.charAt(P))){
trace("Something fuck");
}
P++;
while(!(P>=S.length) && this.isDigit(S.charAt(P))){
P++;
}
if((P<S.length) && (this.isSeparator(S.charAt(P)))){
P++;
if((P>=S.length) || !this.isDigit(S.charAt(P))){
trace("Something fuck");
}
P++;
while(!(P>=S.length) && this.isDigit(S.charAt(P))){
P++;
}
}

var _ret:Array=Array();
_ret['result']=parseFloat(S.substr(InitPos,P-InitPos));
_ret['P']=P;
return _ret;
}
public function expr(S:String):Number{
var P:Number;
var opSymb:String;
var res:Object;
var Result:Number;
P=0;
res=this.Numbers(S,P);
P=res.P;
Result=res.result;
while(P<S.length && this.isOperator(S.charAt(P))){
opSymb=S.charAt(P);
P++;
res=this.Numbers(S,P);
P=res.P;
var Result_2:Number=res.result;
switch(opSymb){
case '+': Result=Result+Result_2; break;
case '-': Result=Result-Result_2; break;
case '/': Result=Result/Result_2; break;
case '*': Result=Result*Result_2; break;
}
}
if(P<S.length){
trace("Something fuck");
}

return Result;

}
}
//Пример работы
import inc.func.Calc;
var cl:Calc=new Calc();
trace("Result:"+cl.expr("7-8+10")); // Выводит -11.


Если есть идеи как улучшить код, подскажите!

iNils
15.03.2007, 05:32
Парсеры для ас1, ас2, ас3
http://as3.ru/?p=3#comments

MisterX
15.03.2007, 05:36
йоптиль ... а я два часа потратил ... млин ..ггг низя было подсказать? ))
ну спасибо за линк =))

iNils
15.03.2007, 05:45
Я пока кино смотрел, вспомнил, что мирамакс что-то по данному вопросу писал. Вспомнил бы раньше, написал тоже бы раньше.
Зато теперь знаете, что к чему:)

MisterX
15.03.2007, 05:58
Спасибо, выручил! Сильно ! =)