|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: 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?
__________________
Я просто добрый шутник. |
|
|||||
Не ясна задача. В заголовке одно, по факту совсем другое надо.
Такую простую строку можно и не думая парсить. а если надо полноценные мат. выражения парсить, то проще готовый парсер взять.
__________________
... Последний раз редактировалось ps_spectre; 16.03.2011 в 15:54. |
|
|||||
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Парсить нужно арифметические действия, как в начальной школе сложение,деление,умножение,вычитание, скобки могут быть. Так же в строке встречаются "не числа", которые при сложении надо игнорировать, а вот к примеру при делении или умнодении выдавать NaN.
__________________
Я просто добрый шутник. |
|
|||||
scarbo, тогда гораздо сложнее. (
Надо искать готовый, подходящий парсер. Самому писать не особо много удовольствия. Но если вдруг решите, то проще через обратную польскую нотацию. (вики) вроде в гугле находятся какие-то парсеры... но фича в этой строке Цитата:
__________________
... Последний раз редактировалось ps_spectre; 11.03.2011 в 20:01. |
|
|||||
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Вот-вот, там по ссылке нормальный вроде бы парсер, но блин с регулярками затык.
Да про метод дейкстры я уже прочитал, что-то совсем не радостно стало. Цитата:
__________________
Я просто добрый шутник. Последний раз редактировалось scarbo; 11.03.2011 в 20:16. |
|
|||||
Если вдруг захочется обойтись малой кровью, и ничего не придумывать,
то советую пересмотреть условия попадания NaN в строку: 1. по-хорошему чтобы вообще не было NaN 2. взять за основу то, что NaN + any_number == NaN (так и должно быть) 3. заменить все NaN в строке на 0 или удалить вообще из строки. 4. хуже вариант: самому парсить строку и учитывать какой стоит знак перед/после NaN (но тут уже не далеко и до обратной польской нотации) по-простому все NaN в строке поменять на 0 и самым простым способом распарсить можно так: 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); } Вообщем, задача творческая, и решение нужно подобрать самому. ----- если в задаче не особо критично 5 * NaN == NaN то 5 * 0 == 0 и тогда все NaN в строке легко меняем на 0 и не паримся тогда 5 + 3 + NaN + 2 + NaN == 10
__________________
... Последний раз редактировалось ps_spectre; 16.03.2011 в 15:54. |
|
|||||
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
ps_spectre, про eval() интересную мысль предложили, eval() в Js умеет парсить математические выражения?Круто если так. Весь проект в браузере, так что stand olone не страшен.
Jewelz, да я видел этот пост и его продолжение тоже.
__________________
Я просто добрый шутник. |
|
|||||
scarbo, eval() умеет парсить джаваскрипт код ,)
а мат. выражения это частный случай как раз. вот только 5 + NaN == NaN. что собственно и логично. в as3 тоже самое: 5 + NaN == NaN. Вообщем, что-то с NaN в строке надо делать. От этого потом и исходить. Кастомный парсер написать на крайняк.
__________________
... |
|
|||||
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Нет, все таки ExternalInterface - это не стабильное решение. Я просто буду заменять NaN на 0 в формуле, там просто вся задачка завязана на статистике, где 0 и null(NaN в моем случае) это разные вещи.
__________________
Я просто добрый шутник. |
Часовой пояс GMT +4, время: 09:32. |
|
« Предыдущая тема | Следующая тема » |
|
|