Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Математические выражения, переданные строкой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Deonis
Отправлено: 05 Октября, 2012 - 02:10:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Здравствуйте! К примеру, такая задача: есть строка, состоящая из математического выражения:
CODE (javascript):
скопировать код в буфер обмена
  1. var mathStr = '10 + 15 * 2 / 5';

Необходимо вернуть результат.
Руки так и чешутся использовать eval(), но практически на каждом углу говорят, что использование данной функции надо избегать любыми способами. Вот я и задумался над тем, как это можно реализовать "малой кровью". Первое, что пришло в голову - разбить строку по пробелам (они точно присутствуют) и преобразовать строковые значения в число (или число с плавающей точкой). Но как быть со знаками? Можно ли их преобразовать?
Или же я ошибаюсь на счет eval() и его можно использовать, сделав какую-нибудь проверку? Например, так:

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var mathStr = '10 + 15 * 2 / 5';
  3. var arr = mathStr.split(' ');
  4. var newArr = [];
  5. for(var i = 0; i < arr.length; i++){
  6.     if(i % 2 == 0){
  7.         newArr.push(parseFloat(arr[i]));
  8.     } else {
  9.         if(arr[i].length == 1 && isNaN(arr[i])){
  10.             newArr.push(arr[i]);
  11.         } else {
  12.             return false;
  13.         }
  14.     }
  15. }
  16. alert(eval(newArr.join('')));
  17.  


P.S. Попадались статьи, аля "Парсер математических выражений", но к сожалению не в области JS

(Отредактировано автором: 05 Октября, 2012 - 02:16:10)

 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Октября, 2012 - 02:26:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Deonis пишет:
но практически на каждом углу говорят, что использование данной функции надо избегать любыми способами.

Улыбка
Страусиная стратегия)
Просто, прежде, чем использовать eval проверьте данные, которые хотите скормить ей ))

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var str = '10 + 15 * 2 / 5';
  3.  
  4. str = str.replace(/[\s]+/g, '');
  5.  
  6. // Можно ещё определить максимальную длину строки
  7. var max_length = 20;
  8.  
  9. if(/[\d]{1,4}[\+|\*|+|-]/g.test(str) && str.length <= max_length)
  10. {
  11.    alert(eval(str));   
  12. }
  13.  

(Отредактировано автором: 05 Октября, 2012 - 02:36:31)

 
 Top
Deonis
Отправлено: 05 Октября, 2012 - 02:41:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




armancho7777777 пишет:

Страусиная стратегия)
Просто, прежде, чем использовать eval проверьте данные, которые хотите скормить ей ))


Спасибо, успокоили Улыбка Мне, как новичку, на данном этапе сложно предвидеть разные ситуации, поэтому и подхожу с опаской к определенным методам, если о них не очень хорошо отзываются.
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Октября, 2012 - 02:58:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Но не стоит злоупотреблять)
Как и всё, прекрасно в меру)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB