Как преобразовать строковое уравнение в числовое значение с помощью Javascript - PullRequest
4 голосов
/ 19 мая 2011

В принципе, у меня есть поле ввода пользователя, где пользователь может ввести число. Они также хотели бы иметь возможность вводить уравнения в поле ввода.

Что-то вроде "874.45 * 0.825 + 4000" и преобразовать его в егодействительное числовое значение.

Все найденные решения указывают на страшный метод eval () .Особенно из-за того, что это поле, введенное пользователем, я беспокоюсь о том, чтобы просто запустить eval ("874.45 * 0.825 + 4000") и надеяться получить число из внутреннего конца.

IПредположим, я мог бы сделать обратный вызов веб-службы на сервер (ASP.NET), но, боюсь, небольшая задержка вызовет у пользователя некоторое разочарование.

Кто-нибудь знает или о хорошей технике, или о существующей?библиотеки?

Ответы [ 4 ]

4 голосов
/ 19 мая 2011

Здесь вам действительно нужен «синтаксический анализатор выражений», потому что вы пытаетесь позволить пользователям выражать свои значения с помощью небольшого предметно-ориентированного языка.

Основная механика работает следующим образом:

  1. Маркировать их выражения в операторы и операнды.

  2. На основе порядка операций (например, когда умножение оценивается с более высоким приоритетом, чем сложение),поместите операторы и операнды в стек.

  3. Извлеките операнды из стека и поместите промежуточные результаты обратно в стек.Повторяйте до тех пор, пока стек не станет пустым.

Я делал это миллион раз для разных «маленьких языков» в моих проектах.Но никогда в JavaScript.Поэтому я не могу напрямую порекомендовать подходящую библиотеку для разбора.

Но быстрое поиск в Google показывает «PEG.js».Проверьте это здесь:

http://pegjs.majda.cz/

Все примеры в их документации предназначены именно для того типа "анализатора выражений", который вы пытаетесь создать.

1 голос
/ 19 мая 2011

Я думаю, что eval может представлять меньшую угрозу безопасности, если вы анализируете полученную строку и проверяете ее содержимое как только цифры и операторы и выполняете оценку, подделывая внешние переменные области видимости, такие как document и т. Д., Как 'var document = null'.

1 голос
/ 19 мая 2011

А что такого плохого в этом eval в этом случае?

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

function calc(str) {
  var window = null, self = null, document = null;
  // other globals like: $ = null, jQuery = null, etc. 
  try { return eval(str); } catch(e) {...}
}

и использовать ее там, где вам нужно интерпретировать строку.Просто и эффективно.

1 голос
/ 19 мая 2011

Просто умножьте его на 1, и с этого момента javascript будет рассматривать его как целое число.

Например,

int = '2343.34' * 1;
int = input * 1;
...