剃掉大数字的十进制 javascript

Shave off decimal of large numbers javascript

本文关键字:十进制 javascript 数字      更新时间:2023-09-26

我试图制作一个函数来美化我的数字,这似乎很麻烦,例如 400 显示为 4H,这是正确的 430 显示为 4.3H 仍然可以接受,但 403 显示为 4.03H,这是不可接受的,这是我的代码不确定该怎么做才能修复它

编辑:随着数字变大,比如5003,它们将显示为5.003K我希望它显示5K编辑:随着数字变大,比如 5003,它们将显示为 5.003K,我希望它显示 5K基本上小数位不应该超过 2就像这里的列表

5000 -> 5K
5500 -> 5.5k
5050 -> 5.05k
5005 -> 5K

var ranges = [
    { divider: 1000000000000000000000000000000000 , suffix: 'Dec' },
    { divider: 1000000000000000000000000000000 , suffix: 'Non' },
    { divider: 1000000000000000000000000000 , suffix: 'Oct' },
    { divider: 1000000000000000000000000 , suffix: 'Sep' },
    { divider: 1000000000000000000000 , suffix: 'Sex' },
    { divider: 1000000000000000000 , suffix: 'Quin' },
    { divider: 1000000000000000 , suffix: 'Quad' },
    { divider: 1000000000000 , suffix: 'T' },
    { divider: 1000000000 , suffix: 'B' },
    { divider: 1000000 , suffix: 'M' },
    { divider: 1000 , suffix: 'K' },
    { divider: 100 , suffix: 'H' }
];
function INP(number, round) {
  for (var i = 0; i < ranges.length; i++) {
    if (number >= ranges[i].divider) {
      if (round == null) {
        return (number / ranges[i].divider) + ranges[i].suffix;
      } else {
        return (number / ranges[i].divider).toFixed(round) + ranges[i].suffix;
      }
    }
  }
  return number.toString();
}
.wrapper {
  position: fixed;
  top: 35%;
  left: 35%;
}
<div class="wrapper">
  <input type="number" id="num" placeholder="number">
  <br>
  <input type="number" id="rounded" placeholder="round">
  <div id="output"></div>
</div>
<script>
  var field = document.getElementById("num");
  var div = document.getElementById("output");
  field.onkeyup = function() {
    var num = document.getElementById("num").value;
    var rounded = document.getElementById("rounded").value;
    if (rounded == true) {
      var output = INP(num, true);
    } else {
      var output = INP(num);
    }
    div.innerHTML = "Output: " + output;
  }
</script>

代码中存在一些错误

  1. if (rounded == true)数字字段的输入值永远不会变为true,则始终为假。
  2. INP(num, true)你传递true作为论点,与此无关。预期参数是根据您的代码的数字。
  3. if (round == null)也总是 false,如果第二个输入字段为空值,则为空字符串而不是 null,因此请将其更改为 if (round == '')

var ranges = [{
  divider: 1000000000000000000000000000000000,
  suffix: 'Dec'
}, {
  divider: 1000000000000000000000000000000,
  suffix: 'Non'
}, {
  divider: 1000000000000000000000000000,
  suffix: 'Oct'
}, {
  divider: 1000000000000000000000000,
  suffix: 'Sep'
}, {
  divider: 1000000000000000000000,
  suffix: 'Sex'
}, {
  divider: 1000000000000000000,
  suffix: 'Quin'
}, {
  divider: 1000000000000000,
  suffix: 'Quad'
}, {
  divider: 1000000000000,
  suffix: 'T'
}, {
  divider: 1000000000,
  suffix: 'B'
}, {
  divider: 1000000,
  suffix: 'M'
}, {
  divider: 1000,
  suffix: 'K'
}, {
  divider: 100,
  suffix: 'H'
}];
function INP(number, round) {
  for (var i = 0; i < ranges.length; i++) {
    if (number >= ranges[i].divider) {
      if (round == '') {
        return (number / ranges[i].divider) + ranges[i].suffix;
      } else {
        var res = (number / ranges[i].divider).toFixed(round),
          fr = res - parseInt(res, 10);
        return (fr > 0 ? res : parseInt(res, 10)) + ranges[i].suffix;
      }
    }
  }
  return number.toString();
}
.wrapper {
  position: fixed;
  top: 35%;
  left: 35%;
}
<div class="wrapper">
  <input type="number" id="num" placeholder="number">
  <br>
  <input type="number" id="rounded" placeholder="round">
  <div id="output"></div>
</div>
<script>
  var field = document.getElementById("num");
  var div = document.getElementById("output");
  field.onkeyup = function() {
    var num = document.getElementById("num").value;
    var rounded = document.getElementById("rounded").value;
    var output = INP(num, rounded);
    div.innerHTML = "Output: " + output;
  }
</script>

你有两个问题。

首先,if (rounded == true)没有做你想做的事。 rounded是一个字符串,将字符串与布尔值进行比较会将布尔值转换为字符串,从而导致字符串"1",因此等效于if (rounded == "1")。您可以使用parseInt()将输入转换为整数,然后使用 if (rounded)

其次,你没有将rounded的值传递给INP,而是传递true。然后当它在toFixed()使用它时,它转换为整数1,所以它总是四舍五入到小数点后 1 位而不是 rounded 输入中的数字。

要去除 toFixed 结果上多余的尾随零,请调用 parseFloat() 将其转换回数字。

var ranges = [
    { divider: 1000000000000000000000000000000000 , suffix: 'Dec' },
    { divider: 1000000000000000000000000000000 , suffix: 'Non' },
    { divider: 1000000000000000000000000000 , suffix: 'Oct' },
    { divider: 1000000000000000000000000 , suffix: 'Sep' },
    { divider: 1000000000000000000000 , suffix: 'Sex' },
    { divider: 1000000000000000000 , suffix: 'Quin' },
    { divider: 1000000000000000 , suffix: 'Quad' },
    { divider: 1000000000000 , suffix: 'T' },
    { divider: 1000000000 , suffix: 'B' },
    { divider: 1000000 , suffix: 'M' },
    { divider: 1000 , suffix: 'K' },
    { divider: 100 , suffix: 'H' }
];
function INP(number, round) {
  for (var i = 0; i < ranges.length; i++) {
    if (number >= ranges[i].divider) {
      if (round == null) {
        return (number / ranges[i].divider) + ranges[i].suffix;
      } else {
        return parseFloat((number / ranges[i].divider).toFixed(round)) + ranges[i].suffix;
      }
    }
  }
  return number.toString();
}
var field = document.getElementById("num");
var div = document.getElementById("output");
field.onkeyup = function() {
  var num = parseInt(document.getElementById("num").value, 10);
  var rounded = parseInt(document.getElementById("rounded").value, 10);
  if (rounded) {
    var output = INP(num, rounded);
  } else {
    var output = INP(num);
  }
  div.innerHTML = "Output: " + output;
}
.wrapper {
  position: fixed;
  top: 35%;
  left: 35%;
}
<div class="wrapper">
  <input type="number" id="num" placeholder="number">
  <br>
  <input type="number" id="rounded" placeholder="round">
  <div id="output"></div>
</div>

您可以计算对数为 10 的单位前缀。应用调整并使用它。

var ranges = { 33: 'Dec', 30: 'Non', 27: 'Oct', 24: 'Sep', 21: 'Sex', 18: 'Quin', 15: 'Quad', 12: 'T', 9: 'B', 6: 'M', 3: 'K', 2: 'H' };
function INP(number, round) {
    var exp = Math.floor(Math.log(number) / Math.log(10));
    while (exp > 3 && !ranges[exp]) {
        exp--;
    }
    if (!ranges[exp]) {
        return number.toString();
    }
    return round === '' ?
        (number / Math.pow(10, exp)) + ranges[exp] :
        (number / Math.pow(10, exp)).toFixed(round) + ranges[exp];
}
.wrapper {
  position: fixed;
  top: 35%;
  left: 35%;
}
<div class="wrapper">
  <input type="number" id="num" placeholder="number">
  <br>
  <input type="number" id="rounded" placeholder="round">
  <div id="output"></div>
</div>
<script>
  var field = document.getElementById("num");
  var div = document.getElementById("output");
  field.onkeyup = function() {
    var num = document.getElementById("num").value;
    var rounded = document.getElementById("rounded").value;
    var output = INP(num, rounded);
    div.innerHTML = "Output: " + output;
  }
</script>