我需要以 1K
的格式显示货币值,相当于一千,或者是 1.1K
、1.2K
、1.9K
等,如果不是整数千位数的话。否则,如果小于一千,则显示普通的数字如 500
、100
、250
等。请使用 JavaScript 格式化数字。
我需要以 1K
的格式显示货币值,相当于一千,或者是 1.1K
、1.2K
、1.9K
等,如果不是整数千位数的话。否则,如果小于一千,则显示普通的数字如 500
、100
、250
等。请使用 JavaScript 格式化数字。
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));
});
if (num >= si[i].value)
替换为 if (Math.abs(num) >= si[i].value)
。 - Salman A1.0
变成 1
,1.10
变成 1.1
。 - Salman A听起来这对您应该有效:
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
$mynumber_output
,我应该在哪里插入它以使用它?例如,假设$mynumber_output
= 12846,我想将12846转换为12.8k
。 - user7537274Math.round(Math.abs(num)/100)/10
替代 (Math.abs(num)/1000).toFixed(1)
。这样不仅能够达到同样的计算结果,还更易于理解。 - Pierre de LESPINAYdata-lang="js" data-hide="false" data-console="true" data-babel="false"
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
notation
е’ЊcompactDisplay
пјЊдЅ†FireFox 77е’ЊSafari 13.1д»ЌдёЌж”ЇжЊЃпјЊе› ж¤ж‚ЁеЏЇиѓЅйњЂи¦ЃдЅїз”ЁpolyfillгЂ‚ - Josh Unger12345
格式化为12K
而不是12.3K
。您可以根据所需的行为添加maximumSignificantDigits
或maximumFractionDigits
。例如,Intl.NumberFormat("en", { notation: "compact", maximumSignificantDigits: 3 }).format(12345) === "12.3K"
或者 Intl.NumberFormat("en", { notation: "compact", maximumFractionDigits: 1 }).format(12345) === "12.3K"
。 - Rik12345
格式化为 12K
而不是 12.3K
。您可以添加 maximumSignificantDigits
或 maximumFractionDigits
,具体取决于您想要的行为。例如:Intl.NumberFormat("en", { notation: "compact", maximumSignificantDigits: 3 }).format(12345) === "12.3K"
或者 Intl.NumberFormat("en", { notation: "compact", maximumFractionDigits: 1 }).format(12345) === "12.3K"
- Rik这里有一个简单的解决方案,它避免了所有的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;
}
Math.abs
来支持负数,像这样:var tier = Math.log10(Math.abs(number)) / 3 | 0;
。 - Caio Tarifa进一步改进 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
简单直接的方法最易读,也使用最少的内存。不需要过度设计,比如使用正则表达式、map对象、Math对象、for循环等。
const formatCash = n => {
if (n < 1e3) return n;
if (n >= 1e3) return +(n / 1e3).toFixed(1) + "K";
};
console.log(formatCash(2500));
const formatCash = n => {
if (n < 1e3) return n;
if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(1) + "K";
if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + "M";
if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + "B";
if (n >= 1e12) return +(n / 1e12).toFixed(1) + "T";
};
console.log(formatCash(1235000));
let format;
const number = -1235000;
if (number < 0) {
format = '-' + formatCash(-1 * number);
} else {
format = formatCash(number);
}
'-' + formatCash(-1 * number)
计算负数形式非常简单。 - tim-montague/**
* Shorten number to thousands, millions, billions, etc.
* http://en.wikipedia.org/wiki/Metric_prefix
*
* @param {number} num Number to shorten.
* @param {number} [digits=0] The number of digits to appear after the decimal point.
* @returns {string|number}
*
* @example
* // returns '12.5k'
* shortenLargeNumber(12543, 1)
*
* @example
* // returns '-13k'
* shortenLargeNumber(-12567)
*
* @example
* // returns '51M'
* shortenLargeNumber(51000000)
*
* @example
* // returns 651
* shortenLargeNumber(651)
*
* @example
* // returns 0.12345
* shortenLargeNumber(0.12345)
*/
function shortenLargeNumber(num, digits) {
var units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],
decimal;
for(var i=units.length-1; i>=0; i--) {
decimal = Math.pow(1000, i+1);
if(num <= -decimal || num >= decimal) {
return +(num / decimal).toFixed(digits) + units[i];
}
}
return num;
}
感谢@Cos的评论,我已删除Math.round10依赖。
Math.abs(num) >= decimal
。 - Conor Pender本文在Waylon Flinn更加优雅地处理负数和".0"情况的基础上进行改进。
在我看来,循环和“if”语句越少越好。
function abbreviateNumber(number) {
const SI_POSTFIXES = ["", "k", "M", "G", "T", "P", "E"];
const sign = number < 0 ? '-1' : '';
const absNumber = Math.abs(number);
const tier = Math.log10(absNumber) / 3 | 0;
// if zero, we don't need a prefix
if(tier == 0) return `${absNumber}`;
// get postfix and determine scale
const postfix = SI_POSTFIXES[tier];
const scale = Math.pow(10, tier * 3);
// scale the number
const scaled = absNumber / scale;
const floored = Math.floor(scaled * 10) / 10;
// format number and add postfix as suffix
let str = floored.toFixed(1);
// remove '.0' case
str = (/\.0$/.test(str)) ? str.substr(0, str.length - 2) : str;
return `${sign}${str}${postfix}`;
}
带有测试用例的jsFiddle -> https://jsfiddle.net/qhbrz04o/9/
abbreviateNumber(999999) == '1000k'
而不是 '1M'
。这是因为 toFixed()
也会四舍五入数字。不过我不确定该如何修复它 :/ - Vitor BaptistatoFixed()
无论如何都会四舍五入,那么在将数字发送到 abbreviateNumber()
之前就将其四舍五入,这样它返回的就是 1M
而不是 1000k
。虽然不是解决方案,但可以作为一种变通方法。 - forsureitsmeconst floored = Math.floor(scaled * 10) / 10;
- tybro0103这很优雅。
function formatToUnits(number, precision) {
const abbrev = ['', 'k', 'm', 'b', 't'];
const unrangifiedOrder = Math.floor(Math.log10(Math.abs(number)) / 3)
const order = Math.max(0, Math.min(unrangifiedOrder, abbrev.length -1 ))
const suffix = abbrev[order];
return (number / Math.pow(10, order * 3)).toFixed(precision) + suffix;
}
formatToUnits(12345, 2)
==> "12.35k"
formatToUnits(0, 3)
==> "0.000"
我认为这可以是一个解决方案。
var unitlist = ["","K","M","G"];
function formatnumber(number){
let sign = Math.sign(number);
let unit = 0;
while(Math.abs(number) >= 1000)
{
unit = unit + 1;
number = Math.floor(Math.abs(number) / 100)/10;
}
console.log(sign*Math.abs(number) + unitlist[unit]);
}
formatnumber(999);
formatnumber(1234);
formatnumber(12345);
formatnumber(123456);
formatnumber(1234567);
formatnumber(12345678);
formatnumber(1000);
formatnumber(-999);
formatnumber(-1234);
formatnumber(-12345);
formatnumber(-123456);
formatnumber(-1234567);
formatnumber(-12345678);
M
和G
? - Salman A