我需要显示一个货币值的格式1K等于一千,或1.1K, 1.2K, 1.9K等,如果它不是一个偶数千,否则如果低于一千,显示正常500,100,250等,使用JavaScript格式化的数字?
当前回答
最简单最简单的方法是
new Intl.NumberFormat('en-IN', {
notation: "compact",
compactDisplay: "short",
style: 'currency',
currency: 'INR'
}).format(1000).replace("T", "K")
这对任何数字都适用。包括L、Cr等。
注意:不能在safari中工作。
其他回答
如果你喜欢,就把功劳归于韦伦·弗林
这比他处理负数和“。0”的情况。
循环和“如果”情况越少,IMO就越好。
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/
一个简短的替代方案:
function nFormatter(num) { const format = [ { value: 1e18, symbol: 'E' }, { value: 1e15, symbol: 'P' }, { value: 1e12, symbol: 'T' }, { value: 1e9, symbol: 'G' }, { value: 1e6, symbol: 'M' }, { value: 1e3, symbol: 'k' }, { value: 1, symbol: '' }, ]; const formatIndex = format.findIndex((data) => num >= data.value); console.log(formatIndex) return (num / format[formatIndex === -1? 6: formatIndex].value).toFixed(2) + format[formatIndex === -1?6: formatIndex].symbol; }
进一步改进@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"
简单通用的方法
可以将COUNT_FORMATS配置对象设置为您想要的长度或长度,这取决于您测试的值范围。
// Configuration const COUNT_FORMATS = [ { // 0 - 999 letter: '', limit: 1e3 }, { // 1,000 - 999,999 letter: 'K', limit: 1e6 }, { // 1,000,000 - 999,999,999 letter: 'M', limit: 1e9 }, { // 1,000,000,000 - 999,999,999,999 letter: 'B', limit: 1e12 }, { // 1,000,000,000,000 - 999,999,999,999,999 letter: 'T', limit: 1e15 } ]; // Format Method: function formatCount(value) { const format = COUNT_FORMATS.find(format => (value < format.limit)); value = (1000 * value / format.limit); value = Math.round(value * 10) / 10; // keep one decimal number, only if needed return (value + format.letter); } // Test: const test = [274, 1683, 56512, 523491, 9523489, 5729532709, 9421032489032]; test.forEach(value => console.log(`${ value } >>> ${ formatCount(value) }`));
听起来这应该对你有用:
函数 kFormatter(num) { 返回 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