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

我需要以1K的格式显示货币值,等于1000,或1.1K,1.2K,1.9K等,如果它不是偶数千,否则如果低于一千,显示正常500,100,250等,使用javascript格式化数字?

听起来这应该适合你:

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

更通用的版本:

 function nFormatter(num, digits) { var si = [ { 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" } ]; var rx = /\.0+$|(\.[0-9]*[1-9])0+$/; var i; for (i = si.length - 1; i > 0; i--) { if (num >= si[i].value) { break; } } return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol; } /* * Tests */ var tests = [ { 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 } ]; var i; for (i = 0; i < tests.length; i++) { console.log("nFormatter(" + tests[i].num + ", " + tests[i].digits + ") = " + nFormatter(tests[i].num, tests[i].digits)); } 

进一步改进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

这是一个避免所有if语句的简单解决方案(具有Math的强大function)。

 var SI_SYMBOL = ["", "k", "M", "G", "T", "P", "E"]; function abbreviateNumber(number){ // what tier? (determines SI symbol) var tier = Math.log10(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; } 

奖金Meme

SI代表什么?

 /** * 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依赖项。

如果你喜欢,请给予Waylon Flinn一等奖

这是从他更优雅的处理负数和“.0”案例的方法中得到改善的。

你拥有的循环和“if”情况越少,IMO越好。

 function abbreviateNumber(number) { var SI_POSTFIXES = ["", "k", "M", "G", "T", "P", "E"]; var tier = Math.log10(Math.abs(number)) / 3 | 0; if(tier == 0) return number; var postfix = SI_POSTFIXES[tier]; var scale = Math.pow(10, tier * 3); var scaled = number / scale; var formatted = scaled.toFixed(1) + ''; if (/\.0$/.test(formatted)) formatted = formatted.substr(0, formatted.length - 2); return formatted + postfix; } 

jsFiddle with test cases – > https://jsfiddle.net/xyug4nvz/7/

这是相当优雅的。

 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" 

通过负数支持进一步改善@Yash的答案:

 function nFormatter(num) { isNegative = false if (num < 0) { isNegative = true } num = Math.abs(num) if (num >= 1000000000) { formattedNumber = (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G'; } else if (num >= 1000000) { formattedNumber = (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; } else if (num >= 1000) { formattedNumber = (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K'; } else { formattedNumber = num; } if(isNegative) { formattedNumber = '-' + formattedNumber } return formattedNumber; } nFormatter(-120000) "-120K" nFormatter(120000) "120K" 

您可以使用在Python高级字符串格式化PEP3101之后建模的d3格式包:

 var f = require('d3-format') console.log(f.format('.2s')(2500)) // displays "2.5k" 

这篇文章很老了,但我不知何故到达这篇文章寻找的东西。 所以添加我的输入Numeral js现在是一天的一站式解决方案。 它提供了大量方法来帮助格式化数字

http://numeraljs.com/

添加最佳答案,这将给1000k而不是1.0k的1k

 function kFormatter(num) { return num > 999 ? num % 1000 === 0 ? (num/1000).toFixed(0) + 'k' : (num/1000).toFixed(1) + 'k' : num } 
 /*including negative values*/ function nFormatter(num) { let neg = false; if(num < 0){ num = num * -1; neg = true; } if (num >= 1000000000) { if(neg){ return -1 * (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G'; } return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G'; } if (num >= 1000000) { if(neg){ return -1 * (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; } return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; } if (num >= 1000) { if(neg){ return -1 * (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K'; } return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K'; } return num; } 
  • 支持负数
  • 正在检查!Number.isFinite
  • 如果您希望最大单位为M请将' KMGTPEZ Y'更改为' K M'

 Number.prototype.prefix = function (precision = 2) { var units = ' KMGTPEZ Y'.split(' '); if (this < 0) { return '-' + Math.abs(this).prefix(precision); } if (this < 1) { return this + units[0]; } var power = Math.min( Math.floor(Math.log(this) / Math.log(1024)), units.length - 1 ); return (this / Math.pow(1024, power)).toFixed(precision) + units[power]; } (10240).prefix() // 10.00K (1234000).prefix(1) // 1.2M (-10000).prefix() // -9.77K