Преобразование текста в число.
Необходимо вырезать из текста цифры, и преобразовать их в числовые значения.
К примеру есть: <p>Пример: 5+15 =двадцать</p> Сопутствующий вопрос, возможно ли вырезать и символ "+" и преобразовать из текста в математический символ? Заранее всем спасибо за помощь! |
Цитата:
var str = "Пример: 5+15 =двадцать";
var res = 0;
str.match(/[\d]+/g).forEach(function (value) {
res = res + +value;
});
alert(res);
|
var txt = "<p>Пример: 5+15 =двадцать</p>";
var result = txt.replace(/.*?(\d.*?)=.*/, function(a, b){
return (new Function( 'return (' + b + ')' )());
});
alert(result);
еще вариант :) |
bes, тут больше reduce подойдет:
var str = "Пример: 5+15 =двадцать";
var res = str.match(/\d+/g).reduce(function (res, value) {
return res + +value;
}, 0);
alert(res);
|
Цитата:
|
Всем спасибо, будем разбираться :)
|
странно, что никто не предложил самый очевидный вариант
alert(eval("example 5+15 =twenty".replace(/[^\d+]+/g, "")))
вот так со всеми операциями
"example 5-15 =twenty, example 5+15 =twenty, example 15/5 =twenty, example 5*15 =twenty"
.split(",")
.forEach(function(str){
alert(eval(str.replace(/[^\d+*/-]/g, "")))
})
|
Цитата:
|
bes,
Это баззворд для быдла. |
Цитата:
сам бы eval юзать не стал, потому как влом искать, где мог бы быть возможный прокол, тем более есть алтернативные варианты |
Цитата:
|
Цитата:
|
Цитата:
насчёт производительности - приводи бенчмарк Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
function calc(op1, op, op2){
var res,
op1 = +op1;
op2 = +op2;
switch ( op ) {
case "+": res = op1 + op2; break;
case "-": res = op1 - op2; break;
case "*": res = op1 * op2; break;
case "/": res = op1 / op2; break;
}
return res;
}
var mas = "example 5-15 =twenty, example 5+15 =twenty, example 15/5 =twenty, example 5*15 =twenty".split(",");
var res = mas.map(function (value) {
return value.replace(/.*?(\d+)(.*?)(\d+).*/, function (str, p1, p2, p3) {
return calc(p1, p2, p3);
});
});
alert(res);
|
bes,
Это не эквивалентный код
"example 5-0+5 =twenty, example 5+15 =twenty, example 15/5 =twenty, example 5*15 =twenty"
.split(",")
.forEach(function(str){
alert(eval(str.replace(/[^\d+*/-]/g, "")))
})
function calc(op1, op, op2){
var res,
op1 = +op1;
op2 = +op2;
switch ( op ) {
case "+": res = op1 + op2; break;
case "-": res = op1 - op2; break;
case "*": res = op1 * op2; break;
case "/": res = op1 / op2; break;
}
return res;
}
var mas = "example 5-0+5 =twenty, example 5+15 =twenty, example 15/5 =twenty, example 5*15 =twenty".split(",");
var res = mas.map(function (value) {
return value.replace(/.*?(\d+)(.*?)(\d+).*/, function (str, p1, p2, p3) {
return calc(p1, p2, p3);
});
});
alert(res);
//>>>> 10
//>>>> 20
//>>>> 3
//>>>> 75
//>>>> [ '5', '20', '3', '75' ]
Да и вообще, одного взгляда на два варианта должно быть достаточно, чо ты тужишься, я хз. |
bes,
function calc(arr) {
var a = +arr[1],
b = +arr[3];
return {
'+': a + b,
'-': a - b,
'*': a * b,
'/': a / b
}
[arr[2]];
}
var mas = "example 5-15 =twenty, example 5+15 =twenty, example 15/5 =twenty, example 5*15 =twenty".split(",");
for (var i = 0; i < mas.length; i++) {
alert(calc(/.*?(\d+)(.)(\d+)/.exec(mas[i])));
}
|
Цитата:
Цитата:
я к тому что не такой уж страшный получился идея была в том, чтобы юзать eval только в крайних случаях, и это был ответ на твой вопрос, почему никто не сэвалил, юзать или не юзать - каждый выбирает сам попробуй лучше решить свою последнюю задачу без eval |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 17:43. |