@m_xplay_official

Как сделать вывод больших чисел в сокращенном варианте?

Как сделать вывод больших чисел в сокращенном варианте? Например: 1 000 -> 1k, 1 000 000->1M?
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
str_repace(['000000', '000'], ['M', 'k']);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
BRAGA96
@BRAGA96
function numberShorter(value, fixed, symbols) {
    var schema = symbols || ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
    var index = Math.floor(Math.log10(value) / 3);
    return (value / Math.pow(10, 3 * index)).toFixed(fixed || 2) + (schema[index] === undefined ? ('e' + index * 3) : schema[index]);
}
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
const SHORTCUT_SUFFIXES = ['K', 'M', 'B', 'T', 'Q', 'P'];
function shortcutNumber(num) {
  const normalized = Number(num).toFixed(0);
  const expPosition = normalized.indexOf('e');
  const dotPosition = normalized.indexOf('.');
  const hasExponent = expPosition !== -1;
  const exponent = parseInt(normalized.slice(expPosition + 2));
  const len = hasExponent ? expPosition + exponent : normalized.length;
  if(len < 4) return String(num);
  const suffixNumber = Math.floor((len - 1)  / 3);
  const suffix = SHORTCUT_SUFFIXES[suffixNumber - 1];
  const fullNumber = (hasExponent
    ? normalized.slice(0, expPosition).replace('.', '')
      + '0'.repeat(exponent - (dotPosition === -1 ? 0 : expPosition + dotPosition + 1))
    : normalized
  );
  if(!suffix) {
    // число о-о-очень большое, больше чем мы суффиксов задали...
    return fullNumber.slice(0, -(SHORTCUT_SUFFIXES.length * 3))
      + SHORTCUT_SUFFIXES[SHORTCUT_SUFFIXES.length - 1];
  }
  return fullNumber.slice(0, -(suffixNumber * 3)) + suffix;
}
Ответ написан
Комментировать
romasovest
@romasovest
~
В одну строку с рэгекспами:
function shortNum(n) {
	return n.toString()
		.replace(/(\d)\d{15}$/, "$1z")
		.replace(/(\d)\d{12}$/, "$1y")
		.replace(/(\d)\d{9}$/, "$1x")
		.replace(/(\d)\d{6}$/, "$1m")
		.replace(/(\d)\d{3}$/, "$1k");
	// вместо {n} - количество нулей
	// в кавычках соответствующая буква
}
console.log(shortNum(86584959)); // 86m

Модификация с дробью :
* принцип тот же, только теперь в фигурных скобках {количество нулей минус 1}
function shortNum(n) {
	return n.toString()
		.replace(/(\d)(\d)\d{5}$/, "$1.$2m")
		.replace(/(\d)(\d)\d{2}$/, "$1.$2k");
}
console.log(shortNum(9537675)); // 9.5m

P.S.: Если смущает работа с числами с помощью регулярок, то пусть не смущает, так как глупо при превращении числа в строку до последнего держаться за числовой тип. С того момента как мы решили добавить к числу букву - это уже считай не число, а строковое его представление.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы