如果一千或更多,如何将数字格式化为2.5K,否则在JavaScript中为900?
我需要显示1K等于一千,或者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: 1E18, symbol: "E" }, { value: 1E15, symbol: "P" }, { value: 1E12, symbol: "T" }, { value: 1E9, symbol: "G" }, { value: 1E6, symbol: "M" }, { value: 1E3, symbol: "k" } ], rx = /\.0+$|(\.[0-9]*[1-9])0+$/, i; for (i = 0; i < si.length; i++) { if (num >= si[i].value) { return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol; } } return num.toFixed(digits).replace(rx, "$1"); } /* * 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 } ], i; for (i = 0; i < tests.length; i++) { console.log("nFormatter(" + tests[i].num + ", " + tests[i].digits + ") = " + nFormatter(tests[i].num, tests[i].digits)); }
进一步改进萨尔曼的答案,因为它返回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
这是一个简单的解决scheme,避免所有的if
语句( Math
的力量)。
var SI_PREFIXES = ["", "k", "M", "G", "T", "P", "E"]; function abbreviateNumber(number){ // what tier? (determines SI prefix) var tier = Math.log10(number) / 3 | 0; // if zero, we don't need a prefix if(tier == 0) return number; // get prefix and determine scale var prefix = SI_PREFIXES[tier]; var scale = Math.pow(10, tier * 3); // scale the number var scaled = number / scale; // format number and add prefix as suffix return scaled.toFixed(1) + prefix; }
/** * 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; }
Thx @Cos评论,我删除了Math.round10依赖。
如果你喜欢这个,请给Waylon Flinn留言
这是从他更优雅的方法来处理负数和“.0”情况的改善。
更less的循环和“如果”情况下,更好的国际海事组织。
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/
进一步改善@ 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高级string格式化PEP3101之后build模的d3格式包:
var f = require('d3-format') console.log(f.format('.2s')(2500)) // displays "2.5k"
这篇文章是相当古老的,但我以某种方式达到这个post寻找的东西。 所以join我的input数字js是现在一天的一站式解决scheme。 它提供了大量帮助格式化数字的方法
加上最上面的答案,这将给1000而不是1.0k 1000
function kFormatter(num) { return num > 999 ? num % 1000 === 0 ? (num/1000).toFixed(0) + 'k' : (num/1000).toFixed(1) + 'k' : num }