В одну строку с рэгекспами:
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.: Если смущает работа с числами с помощью регулярок, то пусть не смущает, так как глупо при превращении числа в строку до последнего держаться за числовой тип. С того момента как мы решили добавить к числу букву - это уже считай не число, а строковое его представление.