Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Преобразование текста в число. (https://javascript.ru/forum/misc/52874-preobrazovanie-teksta-v-chislo.html)

Valentin1918 11.01.2015 01:04

Преобразование текста в число.
 
Необходимо вырезать из текста цифры, и преобразовать их в числовые значения.
К примеру есть:
<p>Пример: 5+15 =двадцать</p>
Сопутствующий вопрос, возможно ли вырезать и символ "+" и преобразовать из текста в математический символ?
Заранее всем спасибо за помощь!

bes 11.01.2015 01:26

Цитата:

Сообщение от Valentin1918
Необходимо вырезать из текста цифры, и преобразовать их в числовые значения.
К примеру есть:
<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 11.01.2015 09:53

Цитата:

Сообщение от danik.js
bes, тут больше reduce подойдет:

да, или reduceRight, ни разу толком не пользовал, поэтому не догадался

Valentin1918 11.01.2015 13:52

Всем спасибо, будем разбираться :)

dkstra 11.01.2015 23:12

странно, что никто не предложил самый очевидный вариант
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 11.01.2015 23:19

Цитата:

Сообщение от dkstra
странно, что никто не предложил самый очевидный вариант

потому что все знают, что eval - зло, даже тогда, когда не зло, потому что влом убеждаться в этом

dkstra 11.01.2015 23:23

bes,
Это баззворд для быдла.

bes 11.01.2015 23:29

Цитата:

Сообщение от dkstra
bes,
Это баззворд для быдла.

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

dkstra 11.01.2015 23:32

Цитата:

Сообщение от bes
потому как влом искать

не надо ничего искать, надо понимать как работает, этого достаточно, чтобы не посадить производительность.

dkstra 11.01.2015 23:33

Цитата:

Сообщение от bes
тем более есть алтернативные варианты

Ага, тонны говнокода и лапши

bes 12.01.2015 00:03

Цитата:

Сообщение от dkstra
не надо ничего искать, надо понимать как работает, этого достаточно, чтобы не посадить производительность.

я про то и говорил - не хочу даже вникать, нет eval - нечего вклинить, даже, если и так нечего вклинить, вникнуть можно - никто не спорит, говорить на простых случаях особого смысла нет
насчёт производительности - приводи бенчмарк

Цитата:

Сообщение от dkstra
Ага, тонны говнокода и лапши

ну расскажи поподробнее, может в тех 3 строчках действительно говнокод

dkstra 12.01.2015 00:04

Цитата:

Сообщение от bes
ну расскажи поподробнее, может в тех 3 строчках действительно говнокод

в каких 3-х строчках?

bes 12.01.2015 00:05

Цитата:

Сообщение от dkstra
в каких 3-х строчках?

в альтернативных вариантах, которые привели до твоего

dkstra 12.01.2015 00:08

Цитата:

Сообщение от bes
в альтернативных вариантах, которые привели до твоего

Да это убожество вообще. Чтобы реализовать только лишь(!) операцию сложения там наговняли кучу кода. А ты напиши, и убедись, как это будет выглядеть хотя бы на 4-х, как в моем втором примере.

bes 12.01.2015 01:02

Цитата:

Сообщение от dkstra
Да это убожество вообще. Чтобы реализовать только лишь(!) операцию сложения там наговняли кучу кода. А ты напиши, и убедись, как это будет выглядеть хотя бы на 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);

dkstra 12.01.2015 01:25

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 12.01.2015 18:25

Цитата:

Сообщение от dkstra
bes,
Это не эквивалентный код

Цитата:

Сообщение от dkstra
Да и вообще, одного взгляда на два варианта должно быть достаточно, чо ты тужишься, я хз.

нет, ты просто придумываешь задачи на ходу :D
я к тому что не такой уж страшный получился чёрткод, как ты его малевал
идея была в том, чтобы юзать eval только в крайних случаях, и это был ответ на твой вопрос, почему никто не сэвалил, юзать или не юзать - каждый выбирает сам
попробуй лучше решить свою последнюю задачу без eval

bes 12.01.2015 18:33

Цитата:

Сообщение от Poznakomlus
bes,

Poznakomlus, calc вариант, но сдаётся мне там на одну операцию 4 выполняются :)

bes 12.01.2015 19:05

Цитата:

Сообщение от bes
попробуй лучше решить свою последнюю задачу без eval

чё, dkstra, уже забанили что ли, когда успел :)


Часовой пояс GMT +3, время: 14:04.