Просмотр полной версии : Преобразование текста в число.
Valentin1918
11.01.2015, 01:04
Необходимо вырезать из текста цифры, и преобразовать их в числовые значения.
К примеру есть:
<p>Пример: 5+15 =двадцать</p>
Сопутствующий вопрос, возможно ли вырезать и символ "+" и преобразовать из текста в математический символ?
Заранее всем спасибо за помощь!
Необходимо вырезать из текста цифры, и преобразовать их в числовые значения.
К примеру есть:
<p>Пример: 5+15 =двадцать</p>
Сопутствующий вопрос, возможно ли вырезать и символ "+" и преобразовать из текста в математический символ?
Заранее всем спасибо за помощь!
для начала
var str = "Пример: 5+15 =двадцать";
var res = 0;
str.match(/[\d]+/g).forEach(function (value) {
res = res + +value;
});
alert(res);
Vlasenko Fedor
11.01.2015, 01:50
var txt = "<p>Пример: 5+15 =двадцать</p>";
var result = txt.replace(/.*?(\d.*?)=.*/, function(a, b){
return (new Function( 'return (' + b + ')' )());
});
alert(result);
еще вариант :)
danik.js
11.01.2015, 09:41
bes, тут больше reduce подойдет:
var str = "Пример: 5+15 =двадцать";
var res = str.match(/\d+/g).reduce(function (res, value) {
return res + +value;
}, 0);
alert(res);
bes, тут больше reduce подойдет:
да, или reduceRight, ни разу толком не пользовал, поэтому не догадался
Valentin1918
11.01.2015, 13:52
Всем спасибо, будем разбираться :)
странно, что никто не предложил самый очевидный вариант
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, "")))
})
странно, что никто не предложил самый очевидный вариант
потому что все знают, что eval - зло, даже тогда, когда не зло, потому что влом убеждаться в этом
bes,
Это баззворд для быдла.
bes,
Это баззворд для быдла.
небыдло пишет языки со своими правилам, а не следует спецификациям :D
сам бы eval юзать не стал, потому как влом искать, где мог бы быть возможный прокол, тем более есть алтернативные варианты
потому как влом искать
не надо ничего искать, надо понимать как работает, этого достаточно, чтобы не посадить производительность.
тем более есть алтернативные варианты
Ага, тонны говнокода и лапши
не надо ничего искать, надо понимать как работает, этого достаточно, чтобы не посадить производительность.
я про то и говорил - не хочу даже вникать, нет eval - нечего вклинить, даже, если и так нечего вклинить, вникнуть можно - никто не спорит, говорить на простых случаях особого смысла нет
насчёт производительности - приводи бенчмарк
Ага, тонны говнокода и лапши
ну расскажи поподробнее, может в тех 3 строчках действительно говнокод
ну расскажи поподробнее, может в тех 3 строчках действительно говнокод
в каких 3-х строчках?
в каких 3-х строчках?
в альтернативных вариантах, которые привели до твоего
в альтернативных вариантах, которые привели до твоего
Да это убожество вообще. Чтобы реализовать только лишь(!) операцию сложения там наговняли кучу кода. А ты напиши, и убедись, как это будет выглядеть хотя бы на 4-х, как в моем втором примере.
Да это убожество вообще. Чтобы реализовать только лишь(!) операцию сложения там наговняли кучу кода. А ты напиши, и убедись, как это будет выглядеть хотя бы на 4-х, как в моем втором примере.
с учётом кривоватой регулярки, примерно так
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' ]
Да и вообще, одного взгляда на два варианта должно быть достаточно, чо ты тужишься, я хз.
Vlasenko Fedor
12.01.2015, 02:16
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])));
}
bes,
Это не эквивалентный код
Да и вообще, одного взгляда на два варианта должно быть достаточно, чо ты тужишься, я хз.
нет, ты просто придумываешь задачи на ходу :D
я к тому что не такой уж страшный получился чёрткод, как ты его малевал
идея была в том, чтобы юзать eval только в крайних случаях, и это был ответ на твой вопрос, почему никто не сэвалил, юзать или не юзать - каждый выбирает сам
попробуй лучше решить свою последнюю задачу без eval
bes,
Poznakomlus, calc вариант, но сдаётся мне там на одну операцию 4 выполняются :)
попробуй лучше решить свою последнюю задачу без eval
чё, dkstra, уже забанили что ли, когда успел :)
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot