Как я могу разбить числа на их числовые значения?

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

1984 = 1000+900+80+4

Было бы лучше, если бы вы знали, где я буду использовать результат. Я помещу результат в массив и сопоставлю его аналог с римской цифрой, например. 1000 = М, 900 = СМ, 80 = LXXX, 4 = IV.

1984 = MCMLXXXIV

Какая функция необходима для получения ожидаемого результата?


person Mehmet Eyüpoğlu    schedule 20.04.2020    source источник


Ответы (2)


Я подправил его в этот однострочный:

Array.from((1984).toString()).reverse().map((d, i) => d * 10 ** i)

Это даст вам части в обратном порядке (сначала наименее значащая цифра); в зависимости от ваших потребностей вы можете добавить еще один .reverse() в конце.

person Touffy    schedule 20.04.2020
comment
let separator = (num) =› { let array = Array .from((num).toString()) .reverse() .map((d, i) =› d * 10 ** i) .sort((a ,b) =› b - a ) возвращаемый массив; } - person Mehmet Eyüpoğlu; 20.04.2020
comment
sort() это излишество, вы должны просто использовать reverse() : let separator = num => Array.from(num.toString()).reverse().map((d, i) => d * 10 ** i).reverse() - person Touffy; 20.04.2020

Вот два небольших алгоритма для этого:

function separate(number) {
  const length = number.toString().length;
  const result = [0];
  let step = 1;

  for (let i= 0; i< length; i++) {
    step *= 10;
    let part = number % step;

    result.forEach(previous => {
      part -= previous;
     });

    result[i] = part;
  }

  return result;
}

и

function separate(number) {
  const str = number.toString();
  const result = [];

  for (var i = 0; i < str.length; i++) {
    result[i] = str.charAt(i) * Math.pow(10, i);
  }

  return result;  
}

Он возвращает массив с каждым разделенным числом

person alexortizl    schedule 20.04.2020
comment
шаг *= 10; выдает ошибку из-за того, что является константой. - person Mehmet Eyüpoğlu; 20.04.2020
comment
@MehmetEyüpoğlu, вы правы, извините, у меня были эти алгоритмы на C, и я пропустил это, когда перенес их в JavaScript. Должно быть исправлено сейчас - person alexortizl; 20.04.2020