JavaScript | Как сложить все числа в строке?

Эта задача отличается от простой похожей — «Как сложить все цифры в строке?»

В этой задаче мы попытаемся определить, что является числом в строке, а также как сложить все эти числа.

 

Функция сложения всех чисел из строки

function sumNumFromStr(str){
   return [...str].map(i=>{if(isFinite(i)==true || i=="."){return i}else{return " "} }).join("").split(" ").filter(i=>i!="").map(i => Number(i)).map(i=>x+=i, x=0).reverse()[0]
}

Собственный метод для объектов-прототипов String

String.prototype.sumNumFromStr = function (){ return [...this].map(i=>{if(isFinite(i)==true || i=="."){return i}else{return " "} }).join("").split(" ").filter(i=>i!="").map(i => Number(i)).map(i=>x+=i, x=0).reverse()[0] }

Пошаговое решение как работает функция — Вводные данные

Пример строки:

var stroka = "1dff e7.63cnj we956n cc3268cnn ew je$*m io0.92n iJE2"
Строка для поиска чисел - JavaScript
Строка для поиска чисел — JavaScript

Мы хотим получить такой массив:

["1", "7.63", "956", "3268", "0.92", "2"]

Как это сделать?

 

Шаг № 1. «Не числа» мы заменяем на пробелы. Исключением является точка «.«

Каждый символ строки превращаем в элемент массива. Получим массив из строкового типа данных

var massiv = [...stroka]

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

massiv.map(i => {if(isFinite(i) == true || i == "."){return i}else{return " "}})

Применяем эту часть алгоритма

var massiv2 = massiv.map(i => {if(isFinite(i) == true || i == "."){return i}else{return " "}})

Нам прилетает очищенный массив, в котором уже более наглядно можно разглядеть очертание чисел:

[«1″, » «, » «, » «, » «, » «, «7», «.», «6», «3», » «, » «, » «, » «, » «, » «, «9», «5», «6», » «, » «, » «, » «, «3», «2», «6», «8», » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, » «, «0», «.», «9», «2», » «, » «, » «, » «, » «, «2»]

Массив из будущих чисел - JavaScript
Массив из будущих чисел — JavaScript

Шаг № 2. Собираем строку

Склеиваем все элементы массива в одну строку.

var stroka2 = massiv2.join("")
Строка с большим количеством пробелов - JavaScript
Строка с большим количеством пробелов — JavaScript

 

Шаг № 3. Удаляем множественные пробелы

Нам нужен механизм, который распознаёт последовательности пробелов и заменяет любую последовательность пробелов на один пробел.

Мы уже получили строку и теперь можем её разделить при помощи метода split(). В качестве разделителя будет выступать один символ пробела.

stroka2.split(" ")
Разделили строку по пробелу - JavaScript
Разделили строку по пробелу — JavaScript

 

Шаг № 4. Фильтруем массив

var massiv3 = stroka2.split(" ").filter(i => i != "")
Массив из чисел в строковом представлении - JavaScript
Массив из чисел в строковом представлении — JavaScript

 

Шаг № 5. Приводим к строки к числам

var massiv4 = massiv3.map(i => Number(i))
Привели строки к числам в массиве - JavaScript
Привели строки к числам в массиве — JavaScript

Шаг № 6. Складываем числа в массиве

massiv4.map(i=>x+=i, x=0).reverse()[0]
Сложили все числа в массиве - получили сумму - JavaScript
Сложили все числа в массиве — получили сумму — JavaScript

 

Альтернативное решение

Можно использовать регулярные выражения.

Если сейчас воспользоваться методом match() и передать в него регулярное выражение «/\d+/g», то мы получим не подходящий результат

stroka.match(/\d+/g)

[«1», «7», «63», «956», «3268», «0», «92», «2»]

Нужны регулярные выражения и квантификаторы. Управляющие последовательности в JavaScript — так это называется.

….когда найду решение, тогда допишу эту публикацию

 

Информационные ссылки

JavaScript | Строки (String)

JavaScript | Можно ли привести символ к цифре?

Стандарт ECMAScript — Раздел «19.2.2 isFinite ( number )» — https://tc39.es/ecma262/#sec-isfinite-number

Поделись записью