Просмотр полной версии : строка -> цифра
есть строка
var d:String="1+2";
Вопрос, есть ли ф-я какаято что мне вернет 3? Имеется ввиду что посчитает то что в строковой константе
З.Ы. В строке могут встречатся только целые числа, и самый простые мат ф-и, тоесть добавление, отнимание, умножение и деление.
Нет такой функции. Надо парсить в ручную.
уууу ... ваще низачет .. млин .. писец вобщем ((
Спасибо за ответ! =)
А вы хотите чтобы в плеер еще и компилятор был встроен?
ну хотябы с элементарными математическими ф-ями, или может какойто фреймворк есть для этого.. я незнаю, я только учусь, тоесть не учусь а совершенствуюсь =)
Кароче написал клас, кому надо забирайте, вроде работает только нет приоритета операций. Работает и с целыми и дробными числами, и с отрицательными тоже :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.
Если есть идеи как улучшить код, подскажите!
Парсеры для ас1, ас2, ас3
http://as3.ru/?p=3#comments
йоптиль ... а я два часа потратил ... млин ..ггг низя было подсказать? ))
ну спасибо за линк =))
Я пока кино смотрел, вспомнил, что мирамакс что-то по данному вопросу писал. Вспомнил бы раньше, написал тоже бы раньше.
Зато теперь знаете, что к чему:)
Спасибо, выручил! Сильно ! =)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.