Отформатируйте число как 2.5 K, если тысяча или больше, в противном случае 900
Мне нужно показать значение валюты в формате 1K, равном одной тысяче, или 1.1 K, 1.2 K, 1.9 K и т. д., Если его нет даже тысячи, в противном случае, если под тысячу, отображать нормальные 500, 100, 250 и т. д., используя javascript для форматирования числа?
13 ответов:
похоже, это должно работать для вас:
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, "") + 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)); }
дальнейшее улучшение ответа Салмана, потому что он возвращает nFormatter(33000) как 33.0 K
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
).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; }
Бонус Мем
/** * 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; }
спасибо @потому что за комментарий, Я удалил математике.раунд 10 зависимость.
отдайте должное Вэйлону Флинну, если вам это нравится
Это было улучшено от его более элегантного подхода к обработке отрицательных чисел и ".0" дело.
чем меньше петель и" если " случаев у вас есть, тем лучше ИМО.
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 с тестовыми случаями ->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"
можно использовать Д3-формате пакет, смоделированный после расширенного форматирования строки Python PEP3101:
var f = require('d3-format') console.log(f.format('.2s')(2500)) // displays "2.5k"
этот пост довольно старый, но я как-то добрался до этого поста в поисках чего-то. Поэтому, чтобы добавить мою входную цифру js, это одно стоп-решение теперь в течение нескольких дней. Это дает большое количество методов, чтобы помочь форматирование чисел
добавление на верхнем ответе, это даст 1k для 1000 вместо 1.0 k
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
- изменить
' K M G T P E Z Y'
до' K M'
Если вы хотите, чтобы максимальный блокM
Number.prototype.prefix = function (precision = 2) { var units = ' K M G T P E Z 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