Округление до определенного числа - PullRequest
0 голосов
/ 03 апреля 2019

Я ищу стандартный метод JS, который в основном делает это:

iRoundTo1 = Math.abs(1000000 - myValue);
iRoundTo2 = Math.abs(2000000 - myValue);
iRoundTo5 = Math.abs(5000000 - myValue);

myValue = Math.min(iRoundTo1, iRoundTo2,
        iRoundTo5);

if (myValue === iRoundTo1) {
    myValue = 1000000;
} else if (myValue === iRoundTo2) {
    myValue = 2000000;
} else if (myValue === iRoundTo5) {
    myValue = 5000000;
}

Как описано в заголовке, я хочу, чтобы мое значение было округлено до конкретных чисел, то есть 1M, 2M и 5 M.

Ответы [ 4 ]

1 голос
/ 03 апреля 2019

Конечно, вы должны реализовать такую ​​особенность самостоятельно. Если вам просто нужно какое-нибудь причудливое решение в одну строку, чтобы сделать ваш код чище:

var myValue = 1234567;
var rounded = [1000000,2000000,5000000].reduce((y,x)=>{return y.diff == undefined || Math.abs(x-myValue) < y.diff ? {val:x,diff:Math.abs(x-myValue)} : y},{}).val;
console.log(rounded);

Или вы можете просто объявить функцию, чтобы сделать ее еще чище.

0 голосов
/ 03 апреля 2019

При всей моей любви к красивым и аккуратным однострочникам, я просто не мог просто пройти мимо:

const compact = value => value > 1000 ? Math.round(value/Math.pow(1000,Math.floor(Math.log10(value)/3)))+['k', 'M', 'B'][Math.floor(Math.log10(value)/3)-1] : value;

кажется, делает работу

//core function
const compact = value => value > 1000 ? Math.round(value/Math.pow(1000,Math.floor(Math.log10(value)/3)))+['k', 'M', 'B'][Math.floor(Math.log10(value)/3)-1] : value;
//display the compact
document.getElementById('input').addEventListener('keyup', function(){
  document.getElementById('compact').textContent = compact(this.value);
});
For the value:
<input id="input"></input>
Compact form would be:
<span id="compact"></span>
0 голосов
/ 03 апреля 2019

Вот код, который вы хотите.

function formatMoney(n, c, d, t) {
  var c = isNaN(c = Math.abs(c)) ? 2 : c,
    d = d == undefined ? "." : d,
    t = t == undefined ? "," : t,
    s = n < 0 ? "-" : "",
    i = String(parseInt(n = Math.abs(Number(n) || 0).toFixed(c))),
    j = (j = i.length) > 3 ? j % 3 : 0;

  return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}

function numShort(value){
    if(value < 1000000){
      return formatMoney(value, 2, ".", ",");
    }else if(value < 1000000000){
      return formatMoney((value/1000000), 2, ".", ",")+'m';
    }else{
      return formatMoney((value/1000000000), 2, ".", ",")+'b';
    }
}

console.log(numShort(100));
console.log(numShort(1000));
console.log(numShort(10000));
console.log(numShort(100000));
console.log(numShort(1000000));
console.log(numShort(10000000));
console.log(numShort(100000000));
console.log(numShort(1000000000));
console.log(numShort(10000000000));
console.log(numShort(100000000000));
0 голосов
/ 03 апреля 2019

Не совсем уверен, что вы этого хотите, но вот мое предложение:

const temp = Math.abs(myValue / 1000000) * 1000000;

If будет округлять абсолютное значение до ближайшего "миллиона".

Вы можете добавить оператор if или switch, чтобы преобразовать его в предопределенные значения в зависимости от случая. Это уже уменьшит шаблон, необходимый для вашей функции.

...