Сообщение от Антон789456
|
я попробовал написать код, но он почему то выводит первое попавшееся число в строке и завершается. В чём косяк, поможете?
var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";
[JS]function check(s){
var sum = 0;
while ((str[s] >= '0') && (str[s]<='9')) {
sum = sum*10 + +str[s];
s++;
}
return sum;
}
function index(f){
while ((str[f] >= '0') && (str[f]<='9')) f++;
return f;
}
var summa = 0;
var i = 0;
do {
if ((str[i] >= '0') && (str[i]<='9')){
summa = summa + check(i);
i = i + index(i);
} i++
} while (i < str.length);
console.log(summa);
|
Привет!
Логически код написан не связно.
В функции check() вы передаете индекс строки, а саму строку "дергаете" из глобального контекста. То есть, обращаетесь к переменной со строкой находящейся вне функции. Это плохой пример. Функция не универсальна. В будущем когда будете писать в модулях (вы ведь node js изучаете?), такой код не подойдет. То же самое касается вашей функции index(f).
Старайтесь всегда писать функции универсальные, без обращения к данным вне окружения функции.
В самой функции check() есть логические ошибки.
условие " str[s] >= '0' && (str[s]<='9') " не верное. Синтаксически ошибок нет, но вы сравниваете две строки на "больше" "меньше". В таком выражении например буква ''д" будет true при str[s] >= '0'. Сравнивать "больше" "меньше" нужно только числовые значения, если не ожидаете специфический результат получить. Таким образом "9" - строка, а не число. Проверить это можно "typeof str[s] " результат будет string а не number.
Если вы еще не изучали регулярные выражения, то я бы решил задачу примерно так:
const string = 'Произвольный текст, содержащий цифры вроде 1 2, 45 или 36'
// разбиваем строку на массив, удалив запятые и пробелы из строки
const stringArr = string.split(',').join(' ').split(' ');
// переменная накопления суммы
let summNumString=0
// перебираем полученный массив
for (let i=0; i<stringArr.length; i++){
// если получается преобразовать в число то суммируем
if (Number(stringArr[i]))
summNumString+=Number(stringArr[i]);
}
// вывод результата в консоль
console.log(summNumString)
Регулярные выражения обязательно изучите.
Кстати, мой код корректно отработает если в строке будет дробное число (например 1.2), а регулярка от
destus поймет это как два разных числа))