如果一千或更多,则将数字格式化为 2.5K,否则为 900

IT技术 javascript jquery formatting numbers
2021-01-13 07:53:58

我需要的格式为货币值显示1K的等于一千,或1.1K1.2K1.9K等,如果它不是一个甚至上千,否则如果一千年,显示正常500100250等,使用JavaScript来格式化数字?

6个回答

一个更通用的版本:

function nFormatter(num, digits) {
  const lookup = [
    { value: 1, symbol: "" },
    { value: 1e3, symbol: "k" },
    { value: 1e6, symbol: "M" },
    { value: 1e9, symbol: "G" },
    { value: 1e12, symbol: "T" },
    { value: 1e15, symbol: "P" },
    { value: 1e18, symbol: "E" }
  ];
  const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
  var item = lookup.slice().reverse().find(function(item) {
    return num >= item.value;
  });
  return item ? (num / item.value).toFixed(digits).replace(rx, "$1") + item.symbol : "0";
}

/*
 * Tests
 */
const tests = [
  { num: 0, digits: 1 },
  { num: 12, digits: 1 },
  { num: 1234, digits: 1 },
  { num: 100000000, digits: 1 },
  { num: 299792458, digits: 1 },
  { num: 759878, digits: 1 },
  { num: 759878, digits: 0 },
  { num: 123, digits: 1 },
  { num: 123.456, digits: 1 },
  { num: 123.456, digits: 2 },
  { num: 123.456, digits: 4 }
];
tests.forEach(function(test) {
  console.log("nFormatter(" + test.num + ", " + test.digits + ") = " + nFormatter(test.num, test.digits));
});

数字小于 < 1000 的小修正,将 {value: 1E0, symbol: ""} 添加到 var si =
2021-03-13 07:53:58
此外,在一开始就处理特殊情况可能会很好。if(num === 0) 返回 0;
2021-03-21 07:53:58
@SalmanA - 很大的帮助,如果将 arg 作为字符串传递,如果使用 parseFloat 清理效果很好,它会失败。谢谢!
2021-03-24 07:53:58
@GiovanniAzua 只是替换if (num >= si[i].value)if (Math.abs(num) >= si[i].value)
2021-03-29 07:53:58
@M.Octavio 正则表达式用于修剪尾随零,例如1.0变成11.10变成1.1
2021-04-03 07:53:58

听起来这应该适合你:

function kFormatter(num) {
    return Math.abs(num) > 999 ? Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) + 'k' : Math.sign(num)*Math.abs(num)
}
    
console.log(kFormatter(1200)); // 1.2k
console.log(kFormatter(-1200)); // -1.2k
console.log(kFormatter(900)); // 900
console.log(kFormatter(-900)); // -900

Math.round(Math.abs(num)/100)/10而不是(Math.abs(num)/1000).toFixed(1)typescript很高兴
2021-03-19 07:53:58
没有完全回答用户的问题。“我需要我是的……你能帮忙吗?” ——卡尔·魏斯
2021-04-01 07:53:58
请注意,在某些情况下,1 KB 为 1024 字节:en.wikipedia.org/wiki/Kilobyte
2021-04-03 07:53:58
如何在此处插入 php 变量并使用它?即如果我的数字变量是$mynumber_output我在哪里插入它来使用它?比如说$mynumber_output=12846,我想把12846转换成12.8k
2021-04-04 07:53:58
小修正建议......应该是小写的 k 千。上层是公斤。尝试编辑,但需要至少更改 6 个字符才能生效。
2021-04-09 07:53:58

这是一个简单的解决方案,它避免了所有if语句(具有 的功能Math)。

var SI_SYMBOL = ["", "k", "M", "G", "T", "P", "E"];

function abbreviateNumber(number){

    // what tier? (determines SI symbol)
    var tier = Math.log10(Math.abs(number)) / 3 | 0;

    // if zero, we don't need a suffix
    if(tier == 0) return number;

    // get suffix and determine scale
    var suffix = SI_SYMBOL[tier];
    var scale = Math.pow(10, tier * 3);

    // scale the number
    var scaled = number / scale;

    // format number and add suffix
    return scaled.toFixed(1) + suffix;
}

奖金模因

代表什么SI

这是否就像接受的答案一样没有任何问题?
2021-03-18 07:53:58
我真的很喜欢你的解决方案。为了也能够缩短负值,我在确定层之前和之后将数字乘以 -1,因为 Math.log10(negativeValue) 将返回 NaN。
2021-03-20 07:53:58
谢谢,我进行了更改以启用负数。
2021-03-25 07:53:58
只要使用Math.abs以支持添加到负数,这样的:var tier = Math.log10(Math.abs(number)) / 3 | 0;
2021-04-09 07:53:58

ES2020 在Intl.NumberFormatUsing notation 中添加了对此的支持,如下所示:

let formatter = Intl.NumberFormat('en', { notation: 'compact' });
// example 1
let million = formatter.format(1e6);
// example 2
let billion = formatter.format(1e9);
// print
console.log(million == '1M', billion == '1B');

请注意,如上所示,第二个示例生成1B而不是1G. NumberFormat眼镜:

请注意,目前并非所有浏览器都支持 ES2020,因此您可能需要这个 Polyfill:https ://formatjs.io/docs/polyfills/intl-numberformat

紧凑且非常灵活有几个问题。
2021-03-30 07:53:58
该软件包已被弃用,因此请使用此链接:npmjs.com/package/@formatjs/intl-numberformat
2021-04-01 07:53:58
例如。对于德国契约,当你想要M为百万时,它不会给出M,而是一个德国特定的替代方案。 const number = 12453456.789; console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', notation:'compact' }).format(number)); // 12 米欧。欧元
2021-04-01 07:53:58
哇,Firefox似乎刚刚在 v. 78 中添加了对此的支持。当然,从现在起 2 年以上,这条评论会显得很愚蠢。:P(虽然这对我来说很有趣,因为代码为我运行但它没有正确转换,所以我需要做一个更新。)
2021-04-05 07:53:58
注意:Chrome 支持notationcompactDisplay但 FireFox 77 和 Safari 13.1 仍然不支持它,因此您可能需要 polyfill。
2021-04-10 07:53:58

进一步改进 Salman 的答案,因为它将 nFormatter(33000) 返回为 33.0K

function nFormatter(num) {
     if (num >= 1000000000) {
        return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G';
     }
     if (num >= 1000000) {
        return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
     }
     if (num >= 1000) {
        return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
     }
     return num;
}

现在 nFormatter(33000) = 33K

@Yash 你是我试图在计数器脚本中实现的代码,但没有得到这是我的代码笔链接codepen.io/Merajkhan/pen/MMoxGE?editors=1010你能帮我实现我想要的这个逻辑吗K、L、M 单位必须来。
2021-03-17 07:53:58
无论如何要做到这一点而不舍入数字?1,590,000 将返回 1.6M。
2021-03-25 07:53:58
有时很难知道何时发布编辑现有答案的新答案,我经常决定是否从其他用户的答案中窃取代码,我通常会编辑他们的答案,以便他们能够获得认可,而不是我窃取他们的答案代码。
2021-03-31 07:53:58