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

Во-первых, для решения этого вопроса очень полезно знать, как работает оператор по модулю в javascript. Оператор по модулю просто возвращает остаток, оставшийся после деления одного операнда на второй операнд, что очень полезно при преобразовании очень большого числа.

Как вы можете видеть выше, число теперь разбито на три части, но числа выводятся в обратном порядке, поэтому наименьшая часть числа выходит первой (нам нужно будет поменять их местами, прежде чем мы закончим). Теперь мы можем преобразовать каждую часть в настоящие слова, а затем добавить к каждому из них шкалу (тысяча, миллион, миллиард и т. д.). Самый простой способ сделать это — создать пару массивов для хранения чисел для единиц и десятков (вы также можете использовать хэш для более эффективного алгоритма). Наконец, нам нужно добавить шкалу («сотня», «тысяча», «миллион», «миллиард» и т. д.), что мы можем сделать на основе индекса фрагментов в массиве!

Теперь мы можем перейти к фактическому преобразованию цифр в числа… сначала с разрядом единиц! Мы можем начать с запуска цикла while для обработки условий, когда заданное нам число меньше 20.

Это достаточно просто понять - эта функция вернет число из нашего массива, который мы инициировали ранее!

Теперь мы можем иметь дело с условиями, когда num меньше 100!

Если число меньше 100 (1–99), мы начинаем с того, что сначала получаем цифру в разряде единиц. ТАК, скажем, выходное число 67…67 % 10 = 7 и 67/10 мы получаем 6,7. Это значение 6,7 работает, потому что мы помещаем элемент из нашего массива десятков в индекс 6-1, который вернет слово «шестьдесят»! Затем мы удостоверимся, что нет «неопределенных» значений, отфильтровав их.

Затем мы переходим к обработке условий, в которых число больше 100. Если мы скажем, что наше новое число равно 500… мы выполним операцию 500/100, которая равна 5, а затем сразу после этого мы вставим слово «сотня» в наш результат. Ууууу, мы почти закончили, теперь нам просто нужно добавить правильное масштабирование к числам на основе индекса следующим образом:

let string = breakDownNumber(710548906786)
  .map(toEnglish)
  .map(appendScale)
  .filter(isNotNull)
  .reverse()
  .join(" ");

Итак, сначала мы вызываем наш метод toEnglish для ВСЕХ наших фрагментов чисел, и это будет выглядеть следующим образом:

› string.map(на английский)

[ 'сто девяносто три', 'четыреста десять', 'девять' ] ** помните, что это все еще назад

Затем мы цепляем наш метод appendScale к каждой части чисел, и теперь наше решение выглядит так:

› string.map(на английский).map(appendScale)

[ ‘сто девяносто три’, ‘четыреста десять тысяч’, ‘девять миллионов’]

Когда мы объединяем все эти методы (переворачиваем и соединяем фрагменты), мы получаем окончательный ответ:

"девять миллионов четыреста десять тысяч сто девяносто три"

string.map(toEnglish).map(appendScale).filter(isNotNull).reverse().join(" ")

Мы успешно преобразовали цифры в английские слова — надеюсь, это кому-нибудь поможет!