![]() |
Парсер строкового выражения в математическое
Всем привет. Возникла тут задача по преобразованию различных строковых выражений в число, наткнулся на эту тему - 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? |
Не ясна задача. В заголовке одно, по факту совсем другое надо.
Такую простую строку можно и не думая парсить. Код AS3:
|
Парсить нужно арифметические действия, как в начальной школе:) сложение,деление,умножение,вычитание, скобки могут быть. Так же в строке встречаются "не числа", которые при сложении надо игнорировать, а вот к примеру при делении или умнодении выдавать NaN.
|
scarbo, тогда гораздо сложнее. (
Надо искать готовый, подходящий парсер. Самому писать не особо много удовольствия. Но если вдруг решите, то проще через обратную польскую нотацию. (вики) вроде в гугле находятся какие-то парсеры... но фича в этой строке Цитата:
|
Вот-вот, там по ссылке нормальный вроде бы парсер, но блин с регулярками затык.
Да про метод дейкстры я уже прочитал, что-то совсем не радостно стало. Цитата:
|
Если вдруг захочется обойтись малой кровью, и ничего не придумывать,
то советую пересмотреть условия попадания NaN в строку: 1. по-хорошему чтобы вообще не было NaN 2. взять за основу то, что NaN + any_number == NaN (так и должно быть) 3. заменить все NaN в строке на 0 или удалить вообще из строки. 4. хуже вариант: самому парсить строку и учитывать какой стоит знак перед/после NaN (но тут уже не далеко и до обратной польской нотации) по-простому все NaN в строке поменять на 0 и самым простым способом распарсить можно так: Код AS3:
Вообщем, задача творческая, и решение нужно подобрать самому. ----- если в задаче не особо критично 5 * NaN == NaN то 5 * 0 == 0 и тогда все NaN в строке легко меняем на 0 и не паримся тогда 5 + 3 + NaN + 2 + NaN == 10 |
вроде кто-то писал в блоге про такую штуку
UPD: нашел хотя я код не стал смотреть - больно там жутко, да и комменты не самые лучшие, но может на что-то подтолкнет |
ps_spectre, про eval() интересную мысль предложили, eval() в Js умеет парсить математические выражения?Круто если так. Весь проект в браузере, так что stand olone не страшен.
Jewelz, да я видел этот пост и его продолжение тоже. |
scarbo, eval() умеет парсить джаваскрипт код ,)
а мат. выражения это частный случай как раз. вот только 5 + NaN == NaN. что собственно и логично. в as3 тоже самое: 5 + NaN == NaN. Вообщем, что-то с NaN в строке надо делать. От этого потом и исходить. Кастомный парсер написать на крайняк. |
Нет, все таки ExternalInterface - это не стабильное решение. Я просто буду заменять NaN на 0 в формуле, там просто вся задачка завязана на статистике, где 0 и null(NaN в моем случае) это разные вещи.
|
| Часовой пояс GMT +4, время: 08:46. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.