Помогите разобратся плиззззз в JS [как получить значение числа из строки числа прописью]

Никак не могу понять, как сделать привязку к поиску текста в масивах (типа “find()”, “includes()”…), чтоб потом вытащить из строки число с помощью “parseInt()” и просуммировать их. Надо из функции, которая содержит число, написанное прописью (0-999). Получить само число на выходе…

function wordsToNumbers(){
let a = [‘0ноль’, ‘1один’, ‘2два’, ‘3три’, ‘4четыре’, ‘5пять’, ‘6шесть’, ‘7семь’, ‘8восемь’, ‘9девять’];
let b = [‘11одиннадцать’, ‘12двенадцать’, ‘13тринадцать’, ‘14четырнадцать’, ‘15пятнадцать’, ‘16шестнадцать’, ‘17семнадцать’, ‘18восемнадцать’, ‘19девятнадцать’];
let c = [‘10десять’, ‘20двадцать’, ‘30тридцать’, ‘40сорок’, ‘50пятьдесят’, ‘60шестьдесят’, ‘70семьдесят’, ‘80восемьдесят’, ‘90девяносто’];
let d = [‘100сто’, ‘200двести’, ‘300триста’, ‘400четыриста’, ‘500пятсот’, ‘600шестсот’, ‘700семсот’, ‘800восемсот’, ‘900девятсот’];
let x = a.find(‘один’);
let result = parseInt(x);
console.log(x);
}

wordsToNumbers(‘один’);

В метод массива .find аргументом нужно передавать функцию которая определит является ли элемент массива искомым. Метод вызывает эту функцию с каждым элементом массива до тех пор пока функция не вернет truthy значение (true или любое ненулевое значение). Например поиск первого числа которое больше 10:

const nums = [1,2,5,7,33,66,100500]
const greaterThanTen = nums.find((num) => {
    return num > 10
})
console.log(greaterThanTen) // 33

Значит чтобы найти подходящую строку, нужно придумать как сформулировать предикат. Я бы убрал регуляркой числовую часть и сравнил бы строковые части.

let b = ['11одиннадцать', '12двенадцать', '13тринадцать', '14четырнадцать', '15пятнадцать', '16шестнадцать', '17семнадцать', '18восемнадцать', '19девятнадцать'];

const str = 'четырнадцать'
const found = b.find((strNum) => {
	return strNum.replace(/\d+/, '') === str
})
console.log(found)

тебе осталось придумать как “прикрутить” эту механику к своей задаче.

Не совсем понятно что на входе может быть, но предположу… Например, если из значения “12двенадцать” нужно найти “12”, то почему бы не сделать проверку каждого символа строки цифра это или нет. потом все совпадения слепить в строку и привести её к числовому значению?

Мое понимание такое.

Общая задача - перевести словестное описание числа типа "сто двадцать пять" в числовое 125. А подзадача через которую решается задача в том чтобы из строк в которых числовое представление числа “слеплено” со словестным (пропись). Примеры: "100сто", "20двадцать", "5пять", найти слепленную строку по словестному и извлечь из строки число. Кстати “хитрый” подход, я бы до такого просто так не додумался бы. А затык в том как из массива слепленных “чисел-слов” найти всю строку по слову через .find.

То о чем говоришь ты это уже следующий этап извлечения числа из найденной строки.

1 лайк

получилось как-то так…осталось придумать, как теперь суммировать сопоставленые значения? Например для ‘wordsToNumbers(‘Триста сорок три’)’

let b = ['11одиннадцать', '12двенадцать', '13тринадцать', '14четырнадцать', '15пятнадцать', '16шестнадцать', '17семнадцать', '18восемнадцать', '19девятнадцать'];
let c = ['10десять', '20двадцать', '30тридцать', '40сорок', '50пятьдесят', '60шестьдесят', '70семьдесят', '80восемьдесят', '90девяносто'];
let d = ['100сто', '200двести', '300триста', '400четыриста', '500пятсот', '600шестсот', '700семсот', '800восемсот', '900девятсот'];
let all = [...a, ...b, ...c, ...d];

function wordsToNumbers(word) {
  let x = all.find(numberWithWord => numberWithWord.replace(/[0-9]/g,"") === word.toLowerCase());
  let result = parseInt(x);
  console.log(result);
}

wordsToNumbers('один')
wordsToNumbers('сто')```

Теперь понятно. В массивах c и d убрать нули. Я бы разбил входящую строку на массив и разбирал его поэлементно. И теперь в цикле если мы находим нужное число с помощью конкатенации добавляем в результирующую строку , которую потом преобразуем в число.

Например “триста сорок три”.
Формируем массив [триста, сорок, три].
результирующая строка = “”
цикл по этому массиву
результирующая строка += вызываем функцию, которую находит и возвращает число из массивов a,b,c,d. (я полагаю она уже реализована?)

преобразуем результирующую строку в число

Ну и не забыть обработать пограничные значения: [101-109]…[901-909].

Чуть подправленный код. Полезная привычка - возвращать значения из функции и логгировать его, а не использовать console.log для просмотра возвращаемого значения. Уменьшает шансы ошибки и создает эффект “лего” когда выходное значение одной функции используется внутри другой функции, что именно и будет происходить дальше.

let a = ["0ноль", "1один", "2два", "3три", "4четыре", "5пять", "6шесть", "7семь", "8восемь", "9девять"];
let b = ['11одиннадцать', '12двенадцать', '13тринадцать', '14четырнадцать', '15пятнадцать', '16шестнадцать', '17семнадцать', '18восемнадцать', '19девятнадцать'];
let c = ['10десять', '20двадцать', '30тридцать', '40сорок', '50пятьдесят', '60шестьдесят', '70семьдесят', '80восемьдесят', '90девяносто'];
let d = ['100сто', '200двести', '300триста', '400четыриста', '500пятсот', '600шестсот', '700семсот', '800восемсот', '900девятсот'];
let all = [...a, ...b, ...c, ...d];

function wordsToNumbers(word) {
  let x = all.find(numberWithWord => numberWithWord.replace(/[0-9]/g,"") === word.toLowerCase());
  let result = parseInt(x);
  return result
}

console.log(wordsToNumbers('один'))
console.log(wordsToNumbers('сто'))

Нужна функция что получает на вход число прописью одной строкой, разбивает его на слова, из слов получает числа с помощью уже написанной тобой wordsToNumbers, и суммирует полученные результаты.

2 лайка