Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.03.2011, 19:06
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 1  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
По умолчанию Парсер строкового выражения в математическое

Всем привет. Возникла тут задача по преобразованию различных строковых выражений в число, наткнулся на эту тему - http://www.flasher.ru/forum/showthre...F7%E8%F1%EB%EE
К сожалению с регулярками не очень знаком, в принципе пример автора все считает, но есть одно НО:
Положим есть такая запись - 2+3+NaN+5, выше приведенный пример выдаст 5, то есть NaN+5 он просто проигнорирует(ведь там используется parseFloat, а он вырезает все "не числа"). Как можно организовать парсер, чтобы например такой ряд - NaN+NaN+2+3+NaN+4 выдавал 9?
__________________
Я просто добрый шутник.

Старый 11.03.2011, 19:19
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 2  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
Не ясна задача. В заголовке одно, по факту совсем другое надо.
Такую простую строку можно и не думая парсить.

Код AS3:
var s:Array = "NaN+NaN+2+3+NaN+4".split("+");		
var l:uint = s.length;
var sum:Number = 0.0;
var n:Number = 0.0;
while (l --> 0)
{
	n = parseFloat(s[l]);
	if (n) sum += n; 
};
trace (sum); // 9
а если надо полноценные мат. выражения парсить, то проще готовый парсер взять.
__________________
...


Последний раз редактировалось ps_spectre; 16.03.2011 в 15:54.
Старый 11.03.2011, 19:26
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 3  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Парсить нужно арифметические действия, как в начальной школе сложение,деление,умножение,вычитание, скобки могут быть. Так же в строке встречаются "не числа", которые при сложении надо игнорировать, а вот к примеру при делении или умнодении выдавать NaN.
__________________
Я просто добрый шутник.

Старый 11.03.2011, 19:48
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 4  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
scarbo, тогда гораздо сложнее. (
Надо искать готовый, подходящий парсер.
Самому писать не особо много удовольствия.
Но если вдруг решите, то проще через обратную польскую нотацию. (вики)

вроде в гугле находятся какие-то парсеры...
но фича в этой строке
Цитата:
встречаются "не числа", которые при сложении надо игнорировать, а вот к примеру при делении или умнодении выдавать NaN.
Это "кастомное" условие. Обычно "3 + NaN + 3" == "NaN". А если надо по-другому, то уже искать обходные пути.
__________________
...


Последний раз редактировалось ps_spectre; 11.03.2011 в 20:01.
Старый 11.03.2011, 20:10
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 5  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Вот-вот, там по ссылке нормальный вроде бы парсер, но блин с регулярками затык.
Да про метод дейкстры я уже прочитал, что-то совсем не радостно стало.
Цитата:
Это "кастомное" условие. Обычно "3 + NaN + 3" == "NaN". А если надо по-другому, то уже искать обходные пути.
То есть должно получиться типа как в Екселе - там если назначить одной ячейке сумму других, то их можно заполнять хоть с низу, хоть сверху, результат будет. Может попробовать сортировать, все NaN из суммы в конец строки запихнуть, их все равно parseFloat отрежет, ну или вырезать их регуляркой, а вот умножение и деление, не трогать?
__________________
Я просто добрый шутник.


Последний раз редактировалось scarbo; 11.03.2011 в 20:16.
Старый 11.03.2011, 20:23
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 6  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
Если вдруг захочется обойтись малой кровью, и ничего не придумывать,
то советую пересмотреть условия попадания NaN в строку:

1. по-хорошему чтобы вообще не было NaN
2. взять за основу то, что NaN + any_number == NaN (так и должно быть)
3. заменить все NaN в строке на 0 или удалить вообще из строки.
4. хуже вариант: самому парсить строку и учитывать какой стоит знак перед/после NaN (но тут уже не далеко и до обратной польской нотации)

по-простому все NaN в строке поменять на 0 и самым простым способом распарсить можно так:

Код AS3:
 
var parseString:String = "(((10 + 15 + NaN) + 5) * 3 + (10 * NaN)) / 2";
parseString = parseString.replace(/[NaN]/gi, "0");
 
if (ExternalInterface.available)
{
	var parse:Number = ExternalInterface.call("eval", parseString);
	trace(parse);
}
а парсер взять нативный, который есть в js. (eval) Минус подхода -- не будет в standalone плеере работать.

Вообщем, задача творческая, и решение нужно подобрать самому.

-----
если в задаче не особо критично
5 * NaN == NaN
то
5 * 0 == 0
и тогда все NaN в строке легко меняем на 0 и не паримся
тогда
5 + 3 + NaN + 2 + NaN == 10
__________________
...


Последний раз редактировалось ps_spectre; 16.03.2011 в 15:54.
Старый 11.03.2011, 21:09
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 7  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
вроде кто-то писал в блоге про такую штуку

UPD: нашел

хотя я код не стал смотреть - больно там жутко, да и комменты не самые лучшие, но может на что-то подтолкнет
__________________
low +

Старый 11.03.2011, 22:40
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 8  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
ps_spectre, про eval() интересную мысль предложили, eval() в Js умеет парсить математические выражения?Круто если так. Весь проект в браузере, так что stand olone не страшен.
Jewelz, да я видел этот пост и его продолжение тоже.
__________________
Я просто добрый шутник.

Старый 11.03.2011, 23:22
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 9  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
scarbo, eval() умеет парсить джаваскрипт код ,)
а мат. выражения это частный случай как раз.
вот только 5 + NaN == NaN.
что собственно и логично.
в as3 тоже самое: 5 + NaN == NaN.
Вообщем, что-то с NaN в строке надо делать. От этого потом и исходить.
Кастомный парсер написать на крайняк.
__________________
...

Старый 12.03.2011, 01:46
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 10  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Нет, все таки ExternalInterface - это не стабильное решение. Я просто буду заменять NaN на 0 в формуле, там просто вся задачка завязана на статистике, где 0 и null(NaN в моем случае) это разные вещи.
__________________
Я просто добрый шутник.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:07.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.