Как сделать функцию добавления к числу буквы миллиона или тысячи и обрезать число?

Сделал функцию, она считает только миллионы. Но chunk работает так что в любом случае в первом элементе массива будет 3 цифры 3300 должно стать 3,3K, 5500000 -> 5,5M

const creepsCount = (count) => {
  const arr = _.chunk(String(count), 3)
  let letter;
  if (arr.length === 3) letter = 'm'

  return _.concat(arr[0], letter)
}

console.log(creepsCount(3300))
console.log(creepsCount(5500000))
<script src="//cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>


Ответы (3 шт):

Автор решения: Konstantin Modin

Можно написать например так:

const cutNumber = (n) => {
  const format = (toCut, letter) => String(n).slice(0, -toCut) + letter;

  if (n > 999999) {
    return format(6, "M");
  }

  if (n > 999) {
    return format(3, "K");
  }

  return n;
};

console.log("cutNumber(999)", cutNumber(999));
console.log("cutNumber(1000)", cutNumber(1000));
console.log("cutNumber(50000)", cutNumber(50000));
console.log("cutNumber(1000000)", cutNumber(1000000));
console.log("cutNumber(10000000)", cutNumber(10000000));
console.log("cutNumber(1234567)", cutNumber(1234567));

→ Ссылка
Автор решения: Yaant

const creepsCount = (count) => {
  const suffixes = ['', 'K', 'M', 'B', 'T'];
  const str = count+'';
  return str.slice(0, (str.length - 1) % 3 + 1) + suffixes[(str.length / 3) | 0]
}

console.log(creepsCount(3000));
console.log(creepsCount(5000000));
console.log(creepsCount(123456789));
console.log(creepsCount(42));

→ Ссылка
Автор решения: Qwertiy

function format(n) {
  for (var { k, suf } of [
    { k: 1e9, suf: "G" },
    { k: 1e6, suf: "M" },
    { k: 1e3, suf: "K" },
  ]) {
    if (Math.round(n / (k / 1000)) >= 1000) {
      return Math.round(n / k) + suf
    }
  }

  return Math.round(n) + ""
};

var res = []

for (var d of [0, 1e9, 5e9, 1e12]) {
  for (var c of [0, 1e6, 490e6, 500e6, 501e6, 999e6]) {
    for (var b of [0, 1e3, 490e3, 500e3, 501e3, 999e3]) {
      for (var a of [0, 1, 499, 500, 501, 999]) {
        var x = a + b + c + d
        res.push(x + " => " + format(x))
      }
    }
  }
}

console.log(res.join("\n"))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Если надо округлять до 1 знака после запятой, то можно

return Math.round(n / k) + suf

заменить на

return Math.round(n / (k / 10)) / 10 + suf

Можно использовать toFixed(1) чтобы он всегда отображался.

И вариант без округления:

function format(n) {
  for (var { k, suf } of [
    { k: 1e9, suf: "G" },
    { k: 1e6, suf: "M" },
    { k: 1e3, suf: "K" },
  ]) {
    if (n >= k) {
      return Math.floor(n / k) + suf
    }
  }

  return Math.floor(n) + ""
};

var res = []

for (var d of [0, 1e9, 5e9, 1e12]) {
  for (var c of [0, 1e6, 490e6, 500e6, 501e6, 999e6]) {
    for (var b of [0, 1e3, 490e3, 500e3, 501e3, 999e3]) {
      for (var a of [0, 1, 499, 500, 501, 999]) {
        var x = a + b + c + d
        res.push(x + " => " + format(x))
      }
    }
  }
}

console.log(res.join("\n"))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка